Bagikan melalui


Interpretasi Anotasi - sql:relationship dan Aturan Pengurutan Kunci

Berlaku untuk: SQL ServerAzure SQL Database

Karena BEBAN Massal XML menghasilkan rekaman saat simpul mereka masuk ke dalam cakupan dan mengirim rekaman tersebut ke Microsoft SQL Server sebagai simpul mereka keluar cakupan, data untuk rekaman harus ada dalam cakupan simpul.

Pertimbangkan skema XSD berikut, di mana hubungan satu-ke-banyak antara > dan> (satu pelanggan dapat melakukan banyak pesanan) ditentukan dengan menggunakan<>:

<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>  

<Saat node elemen Pelanggan> masuk ke dalam cakupan, Beban Massal XML menghasilkan catatan pelanggan. Catatan ini tetap ada hingga Pemuatan Massal XML membaca >. Dalam memproses node elemen Order<, XML Bulk Load menggunakan> sql:relationship< untuk mendapatkan nilai kolom kunci asing >CustomerID dari tabel CustOrder dari >, karena> tidak menentukan atribut CustomerID. Ini berarti bahwa dalam menentukan <>, Anda harus menentukan atribut CustomerID dalam skema sebelum Anda menentukan<>. Jika tidak, ketika > masuk ke dalam cakupan, Beban Massal XML menghasilkan rekaman untuk tabel CustOrder, dan ketika Beban Massal XML mencapai <tag akhir /Order>, ia mengirim catatan ke SQL Server tanpa nilai kolom kunci asing CustomerID.

Simpan skema yang disediakan dalam contoh ini sebagai SampleSchema.xml.

Untuk menguji sampel yang berfungsi

  1. Buat tabel ini:

    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. Simpan data sampel berikut sebagai 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. Untuk menjalankan Pemuatan Massal XML, simpan dan jalankan contoh Microsoft Visual Basic Scripting Edition (VBScript) berikut sebagai 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  
    

    Hasilnya adalah XML Bulk Load menyisipkan nilai NULL di kolom kunci asing CustomerID dari tabel CustOrder. Jika Anda merevisi data sampel XML sehingga > muncul sebelum< elemen Pesan> anak, Anda mendapatkan hasil yang diharapkan: Beban Massal XML menyisipkan nilai kunci asing yang ditentukan ke dalam kolom.

Ini adalah skema XDR yang setara:

<?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>