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,并且它们似乎都正确链接在一起。