sql:relationship 和關鍵識別碼順序規則 (SQLXML 4.0)
由於 XML 大量載入會產生記錄做為其節點進入範圍,並將這些記錄傳送到 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> 結束標籤時,它會將記錄傳送到沒有 CustomerID 外部索引鍵資料行值的 SQL Server。
將這個範例所提供的結構描述儲存為 SampleSchema.xml。
若要測試工作範例
建立下列資料表:
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
將下列範例資料儲存為 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>
若要執行 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 大量載入將 NULL 值插入到 CustOrder 資料表的 CustomerID 外部索引鍵資料行中。如果您修訂 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>