注釈の解釈 - sql:relationship とキーの順序付けルール
適用対象: SQL Server Azure SQL Database
XML 一括読み込みでは、ノードがスコープに入るとレコードが生成され、ノードの終了スコープとしてそれらのレコードが Microsoft SQL Server に送信されるため、レコードのデータはノードのスコープ内に存在する必要があります。
<Customer> 要素と <Order> 要素 (1 人の顧客が多数の注文を行うことができる) の間の一対多リレーションシップが、<sql:relationship> 要素を使用して指定されている次の XSD スキーマについて考えてみましょう。
<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> 要素を定義する場合、<sql:relationship>を指定する前に、スキーマで CustomerID 属性を指定する必要があります。 それ以外の場合、 <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 一括読み込みでは CustOrder テーブルの CustomerID 外部キー列に NULL 値が挿入されます。 <CustomerID>子要素が <Order> 子要素の前に表示されるように XML サンプル データを変更すると、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>