共用方式為


註釋解譯 - sql:relationship 和 Key Ordering Rule

適用於:SQL Server Azure SQL 資料庫

由於 XML 大量載入會在節點進入範圍時產生記錄,並將這些記錄傳送至 SQL Server Microsoft SQL Server 作為其節點結束範圍,因此記錄的數據必須存在於節點的範圍內。

請考慮下列 XSD 架構,其中 Customer> 和 <Order> 元素之間的<一對多關聯性(一個客戶可以放置許多訂單)是使用< sql:relationship> 元素來指定:

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"<>   
            xmlns:sql="urn:schemas-microsoft-com:mapping-schema">  
<xsd:annotation>  
  <xsd:appinfo>  
    <sql:relationship name="CustCustOrder"  
          parent="Cust"  
          parent-key="CustomerID"  
          child="CustOrder"  
          child-key="CustomerID" />  
  </xsd:appinfo>  
</xsd:annotation>  
  
  <xsd:element name="Customers" sql:relation="Cust" >  
   <xsd:complexType>  
     <xsd:sequence>  
       <xsd:element name="CustomerID"  type="xsd:integer" />  
       <xsd:element name="CompanyName" type="xsd:string" />  
       <xsd:element name="City"        type="xsd:string" />  
       <xsd:element name="Order"   
                          sql:relation="CustOrder"  
                          sql:relationship="CustCustOrder" >  
         <xsd:complexType>  
          <xsd:attribute name="OrderID" type="xsd:integer" />  
         </xsd:complexType>  
       </xsd:element>  
     </xsd:sequence>  
    </xsd:complexType>  
  </xsd:element>  
</xsd:schema>  

<當 Customer> 元素節點進入範圍時,XML 大量載入會產生客戶記錄。 此記錄會保留到 XML 大量載入讀取 </Customer> 為止。 在處理 Order 元素節點時<,XML 大量載入會使用 <sql:relationship> 從< Customer> 父元素取得 CustOrder 數據表之 CustomerID 外鍵數據行的值,因為 <Order> 元素未指定 CustomerID 屬性。> 這表示在定義 <Customer> 元素時,您必須先在架構中指定 CustomerID 屬性,才能指定 <sql:relationship。> 否則,當 Order 元素進入範圍時<,XML 大量載入會產生 CustOrder 數據表的記錄,當 XML 大量載入到達< /Order> 結束標記時,它會將記錄傳送至 SQL Server,而沒有 CustomerID 外鍵數據行值。>

將此範例中提供的架構儲存為 SampleSchema.xml。

測試工作範例

  1. 建立這些資料表:

    CREATE TABLE Cust (  
                  CustomerID     int          PRIMARY KEY,  
               CompanyName    varchar(20)  NOT NULL,  
                  City           varchar(20)  DEFAULT 'Seattle')  
    GO  
    CREATE TABLE CustOrder (  
                  OrderID        varchar(10) PRIMARY KEY,  
               CustomerID     int         FOREIGN KEY REFERENCES                                          Cust(CustomerID))  
    GO  
    
  2. 將下列範例數據儲存為SampleXMLData.xml:

    <ROOT>    
      <Customers>  
        <CompanyName>Hanari Carnes</CompanyName>  
        <City>NY</City>  
        <Order OrderID="1" />  
        <Order OrderID="2" />  
        <CustomerID>1111</CustomerID>  
      </Customers>  
      <Customers>  
        <CompanyName>Toms Spezialitten</CompanyName>  
         <City>LA</City>    
        <Order OrderID="3" />  
        <CustomerID>1112</CustomerID>  
      </Customers>  
      <Customers>  
        <CompanyName>Victuailles en stock</CompanyName>  
        <Order OrderID="4" />  
        <CustomerID>1113</CustomerID>  
      </Customers>  
    </ROOT>  
    
  3. 若要執行 XML 大量載入,請將下列Microsoft Visual Basic Scripting Edition (VBScript) 範例儲存並執行為 MySample.vbs:

    set objBL = CreateObject("SQLXMLBulkLoad.SQLXMLBulkload.4.0")  
    objBL.ConnectionString = "provider=SQLOLEDB;data source=localhost;database=tempdb;integrated security=SSPI"  
    objBL.ErrorLogFile = "c:\error.log"  
    objBL.CheckConstraints = True  
    objBL.Transaction=True  
    objBL.Execute "c:\SampleSchema.xml", "c:\SampleXMLData.xml"  
    set objBL=Nothing  
    

    結果是 XML 大量載入會在 CustOrder 資料表的 CustomerID 外鍵數據行中插入 NULL 值。 如果您修改 XML 範例數據,讓 <CustomerID> 子元素出現在 Order> 子元素之前<,您會收到預期的結果:XML 大量載入會將指定的外鍵值插入數據行中。

這是對等的 XDR 架構:

<?xml version="1.0" ?>  
<Schema xmlns="urn:schemas-microsoft-com:xml-data"   
        xmlns:dt="urn:schemas-microsoft-com:xml:datatypes"    
        xmlns:sql="urn:schemas-microsoft-com:xml-sql" >   
   <ElementType name="CustomerID"  />  
   <ElementType name="CompanyName" />  
   <ElementType name="City"        />  
  
   <ElementType name="root" sql:is-constant="1">  
      <element type="Customers" />  
   </ElementType>  
  
   <ElementType name="Customers" sql:relation="Cust" >  
      <element type="CustomerID" sql:field="CustomerID" />  
      <element type="CompanyName" sql:field="CompanyName" />  
      <element type="City" sql:field="City" />  
      <element type="Order" >  
                 <sql:relationship  
                        key-relation    ="Cust"  
                        key             ="CustomerID"  
                        foreign-key     ="CustomerID"  
                        foreign-relation="CustOrder" />  
      </element>  
   </ElementType>  
    <ElementType name="Order" sql:relation="CustOrder" >  
      <AttributeType name="OrderID" />  
      <AttributeType name="CustomerID" />  
      <attribute type="OrderID" />  
      <attribute type="CustomerID" />  
    </ElementType>  
</Schema>