SQLXMLBULKLOAD 不适用于我的 XSD
SQLXMLBULKLOAD won't work with my XSD
这是由于这种关系,似乎不受支持:
我无法更改 XML 的格式,因为它来自第三方。他们的 XML 中有两个部分包含 RateRegister,例如:
<wse:ImportRateRegisters>
<wse:RateRegister Tier="0" Cumulative="3213.500" Advance="60.900" />
<wse:RateRegister Tier="1" Cumulative="193.950" Advance="59.700" />
</wse:ImportRateRegisters>
<wse:ImportTierRegisters>
<wse:RateRegister Tier="0" Cumulative="3251.600" />
<wse:RateRegister Tier="1" Cumulative="351.000" />
</wse:ImportTierRegisters>
当我尝试注释 XSD 以支持这种关系时,我被卡住了。我可以定义 ImportRateRegisters/ImportTierRegisters 和设备之间的关系,但是一旦我尝试将 RateRegister 添加到组合中,它就会停止工作。
我可以将关系从 RateRegister 添加到 ImportRateRegisters 或 ImportTierRegisters,但不能同时添加。我创建了两种关系:
<sql:relationship name="RateRegisterToImportRateRegisters" parent="ImportRateRegisters" parent-key="ImportRateRegisters_Id" child="RateRegister" child-key="ImportRateRegisters_Id" />
<sql:relationship name="RateRegisterToImportTierRegisters" parent="ImportTierRegisters" parent-key="ImportTierRegisters_Id" child="RateRegister" child-key="ImportTierRegisters_Id" />
但是当我到达 RateRegister 时,我只能添加这些关系之一,例如:
<xs:element name="RateRegister" msdata:Prefix="wse" sql:relation="RateRegister" sql:relationship="RateRegisterToImportRateRegisters">
我得到的错误是:
Schema: the parent/child table of the relationship on 'RateRegister' does not match
如果我尝试添加这两个关系,我会收到重复属性错误。
我是不是在浪费时间,SQLXMLBULKLOAD 实用程序是否可以处理这种层次结构?
我终于设法让它工作了,所以我要 post 我的回答,希望它能帮助其他遇到类似问题的人。我不相信这是最好的解决方案,因为它最终创建了我并不真正想要的 "link tables",但它确实有效。
在数据库中,我创建了 tables 来保存这部分结构:
CREATE TABLE ImportRateRegisters (
RRegisterId INT IDENTITY(1,1) PRIMARY KEY,
DeviceId INT FOREIGN KEY REFERENCES Device(DeviceId));
CREATE TABLE ImportTierRegisters (
TRegisterId INT IDENTITY(1,1) PRIMARY KEY,
DeviceId INT FOREIGN KEY REFERENCES Device(DeviceId));
CREATE TABLE RRateRegister (
Tier INT,
Cumulative NUMERIC(19,2),
Advance NUMERIC(19,2),
RRegisterId INT FOREIGN KEY REFERENCES ImportRateRegisters(RRegisterId));
CREATE TABLE TRateRegister (
Tier INT,
Cumulative NUMERIC(19,2),
Advance NUMERIC(19,2),
TRegisterId INT FOREIGN KEY REFERENCES ImportTierRegisters(TRegisterId));
首先我需要为 RateRegister 创建一个元素,将其连接到 RRateRegister 或 TRateRegister table,我在 XSD 中进一步覆盖它,但我需要一些东西此处作为占位符,否则我在批量加载时出错。
<xs:element name="RateRegister" msdata:Prefix="wse" sql:relation="RRateRegister" sql:relationship="RRateRegisterToImportRateRegisters">
<xs:complexType>
<xs:attribute name="Tier" form="unqualified" type="xs:string" sql:field="Tier" />
<xs:attribute name="Cumulative" form="unqualified" type="xs:string" sql:field="Cumulative" />
<xs:attribute name="Advance" form="unqualified" type="xs:string" sql:field="Advance" />
</xs:complexType>
</xs:element>
当我谈到导致问题的核心 XSD 部分时,我参考了通用 RateRegister,但覆盖了关系:
<xs:element name="ImportRateRegisters" msdata:Prefix="wse" minOccurs="0" maxOccurs="unbounded" sql:relation="ImportRateRegisters" sql:relationship="ImportRateRegistersToDevice">
<xs:complexType>
<xs:sequence>
<xs:element ref="RateRegister" minOccurs="0" maxOccurs="unbounded" sql:relation="RRateRegister" sql:relationship="RRateRegisterToImportRateRegisters"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="ImportTierRegisters" msdata:Prefix="wse" minOccurs="0" maxOccurs="unbounded" sql:relation="ImportTierRegisters" sql:relationship="ImportTierRegistersToDevice">
<xs:complexType>
<xs:sequence>
<xs:element ref="RateRegister" minOccurs="0" maxOccurs="unbounded" sql:relation="TRateRegister" sql:relationship="TRateRegisterToImportTierRegisters" />
</xs:sequence>
</xs:complexType>
</xs:element>
...仅此而已。当我加载数据时,它被推送到正确的 RateRegister table,并且它们似乎都正确链接在一起。
这是由于这种关系,似乎不受支持:
我无法更改 XML 的格式,因为它来自第三方。他们的 XML 中有两个部分包含 RateRegister,例如:
<wse:ImportRateRegisters>
<wse:RateRegister Tier="0" Cumulative="3213.500" Advance="60.900" />
<wse:RateRegister Tier="1" Cumulative="193.950" Advance="59.700" />
</wse:ImportRateRegisters>
<wse:ImportTierRegisters>
<wse:RateRegister Tier="0" Cumulative="3251.600" />
<wse:RateRegister Tier="1" Cumulative="351.000" />
</wse:ImportTierRegisters>
当我尝试注释 XSD 以支持这种关系时,我被卡住了。我可以定义 ImportRateRegisters/ImportTierRegisters 和设备之间的关系,但是一旦我尝试将 RateRegister 添加到组合中,它就会停止工作。
我可以将关系从 RateRegister 添加到 ImportRateRegisters 或 ImportTierRegisters,但不能同时添加。我创建了两种关系:
<sql:relationship name="RateRegisterToImportRateRegisters" parent="ImportRateRegisters" parent-key="ImportRateRegisters_Id" child="RateRegister" child-key="ImportRateRegisters_Id" />
<sql:relationship name="RateRegisterToImportTierRegisters" parent="ImportTierRegisters" parent-key="ImportTierRegisters_Id" child="RateRegister" child-key="ImportTierRegisters_Id" />
但是当我到达 RateRegister 时,我只能添加这些关系之一,例如:
<xs:element name="RateRegister" msdata:Prefix="wse" sql:relation="RateRegister" sql:relationship="RateRegisterToImportRateRegisters">
我得到的错误是:
Schema: the parent/child table of the relationship on 'RateRegister' does not match
如果我尝试添加这两个关系,我会收到重复属性错误。
我是不是在浪费时间,SQLXMLBULKLOAD 实用程序是否可以处理这种层次结构?
我终于设法让它工作了,所以我要 post 我的回答,希望它能帮助其他遇到类似问题的人。我不相信这是最好的解决方案,因为它最终创建了我并不真正想要的 "link tables",但它确实有效。
在数据库中,我创建了 tables 来保存这部分结构:
CREATE TABLE ImportRateRegisters (
RRegisterId INT IDENTITY(1,1) PRIMARY KEY,
DeviceId INT FOREIGN KEY REFERENCES Device(DeviceId));
CREATE TABLE ImportTierRegisters (
TRegisterId INT IDENTITY(1,1) PRIMARY KEY,
DeviceId INT FOREIGN KEY REFERENCES Device(DeviceId));
CREATE TABLE RRateRegister (
Tier INT,
Cumulative NUMERIC(19,2),
Advance NUMERIC(19,2),
RRegisterId INT FOREIGN KEY REFERENCES ImportRateRegisters(RRegisterId));
CREATE TABLE TRateRegister (
Tier INT,
Cumulative NUMERIC(19,2),
Advance NUMERIC(19,2),
TRegisterId INT FOREIGN KEY REFERENCES ImportTierRegisters(TRegisterId));
首先我需要为 RateRegister 创建一个元素,将其连接到 RRateRegister 或 TRateRegister table,我在 XSD 中进一步覆盖它,但我需要一些东西此处作为占位符,否则我在批量加载时出错。
<xs:element name="RateRegister" msdata:Prefix="wse" sql:relation="RRateRegister" sql:relationship="RRateRegisterToImportRateRegisters">
<xs:complexType>
<xs:attribute name="Tier" form="unqualified" type="xs:string" sql:field="Tier" />
<xs:attribute name="Cumulative" form="unqualified" type="xs:string" sql:field="Cumulative" />
<xs:attribute name="Advance" form="unqualified" type="xs:string" sql:field="Advance" />
</xs:complexType>
</xs:element>
当我谈到导致问题的核心 XSD 部分时,我参考了通用 RateRegister,但覆盖了关系:
<xs:element name="ImportRateRegisters" msdata:Prefix="wse" minOccurs="0" maxOccurs="unbounded" sql:relation="ImportRateRegisters" sql:relationship="ImportRateRegistersToDevice">
<xs:complexType>
<xs:sequence>
<xs:element ref="RateRegister" minOccurs="0" maxOccurs="unbounded" sql:relation="RRateRegister" sql:relationship="RRateRegisterToImportRateRegisters"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="ImportTierRegisters" msdata:Prefix="wse" minOccurs="0" maxOccurs="unbounded" sql:relation="ImportTierRegisters" sql:relationship="ImportTierRegistersToDevice">
<xs:complexType>
<xs:sequence>
<xs:element ref="RateRegister" minOccurs="0" maxOccurs="unbounded" sql:relation="TRateRegister" sql:relationship="TRateRegisterToImportTierRegisters" />
</xs:sequence>
</xs:complexType>
</xs:element>
...仅此而已。当我加载数据时,它被推送到正确的 RateRegister table,并且它们似乎都正确链接在一起。