SQLXMLBULKLOAD不能使用我的XSD

时间:2017-09-19 14:16:14

标签: xml xsd sqlxml

这是由于这种关系似乎不受支持:

Relationship

我无法更改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和Device之间的关系,但是一旦我尝试将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实用程序是否可以应对这种层次结构?

1 个答案:

答案 0 :(得分:1)

我终于设法让这个工作,所以我将发布我的答案,希望它可以帮助其他类似问题的人。我不相信这是最好的解决方案,因为它最终创建了我并不想要的“链接表”,但它确实有效。

在数据库中,我创建表来保存结构的这一部分:

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