sql:key-fields を使用した、キー列の指定 (SQLXML 4.0)
適用対象: SQL Server Azure SQL データベース
XSD スキーマに対して XPath クエリを指定する場合、結果内に適切な入れ子を生成するには、多くの場合キー情報が必要です。 sql:key-fields注釈を指定すると、適切な階層が確実に生成されます。
Note
適切な入れ子にするには、テーブルにマップされる要素 sql:key-fields を指定することをお勧めします。 作成される XML は、基になる結果セットの順序指定に影響を受けます。 sql:key-fields が指定されていない場合、生成された XML が正しく形成されない可能性があります。
sql:key-fields の値は、リレーションシップ内の行を一意に識別する列を識別します。 行を一意に識別するために複数の列が必要な場合、列の値はスペースで区切られます。
sql:key-fields注釈は、要素と子要素の間で定義されているが、親要素で指定されているテーブルの主キーを提供しない<sql:relationship>が含まれている場合に使用する必要があります。
例
次の例を使用した実際のサンプルを作成するには、特定の条件を満たす必要があります。 詳細については、「
A. <sql:relationship>が十分な情報を提供しない場合に適切な入れ子を生成する
この例では、 sql:key-fields を指定する必要がある場所を示します。
次のスキーマについて考えてみましょう。 スキーマでは、 <Order> 要素と <Customer> 要素の間の階層を指定します。この要素では、 <Order> 要素が親であり、 <Customer> 要素が子要素です。
<sql:relationship> タグを使用して親子関係を指定します。 このタグでは、Sales.SalesOrderHeader テーブルの CustomerID を親キーとして識別し、Sales.Customer テーブルの子キー CustomerID を参照します。 <sql:relationship> で提供される情報は、親テーブル (Sales.SalesOrderHeader) 内の行を一意に識別するのに十分ではありません。 そのため、 sql:key-fields 注釈がないと、生成される階層は不正確になります。
sql:key-fields <Order> で指定すると、注釈は親 (Sales.SalesOrderHeader テーブル) 内の行を一意に識別し、その子要素はその親の下に表示されます。
スキーマは次のようになります。
<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="OrdCust"
parent="Sales.SalesOrderHeader"
parent-key="CustomerID"
child="Sales.Customer"
child-key="CustomerID" />
</xsd:appinfo>
</xsd:annotation>
<xsd:element name="Order" sql:relation="Sales.SalesOrderHeader"
sql:key-fields="SalesOrderID">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="Customer" sql:relation="Sales.Customer"
sql:relationship="OrdCust" >
<xsd:complexType>
<xsd:attribute name="CustID" sql:field="CustomerID" />
<xsd:attribute name="SoldBy" sql:field="SalesPersonID" />
</xsd:complexType>
</xsd:element>
</xsd:sequence>
<xsd:attribute name="SalesOrderID" type="xsd:integer" />
<xsd:attribute name= "CustomerID" type="xsd:string" />
</xsd:complexType>
</xsd:element>
</xsd:schema>
このスキーマの実際のサンプルを作成するには
上のスキーマのコードをコピーして、テキスト ファイルに貼り付け、 KeyFields1.xml として保存します。
次のテンプレートをコピーして、テキスト ファイルに貼り付け、 KeyFields1.xml を保存したディレクトリに KeyFields1T.xml として保存します。 テンプレートの XPath クエリは、CustomerID が 3 未満のすべての <Order> 要素を返します。
<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql"> <sql:xpath-query mapping-schema="KeyFields1.xml"> /Order[@CustomerID < 3] </sql:xpath-query> </ROOT>
マッピング スキーマ (KeyFields1.xml) に指定するディレクトリ パスは、テンプレートを保存するディレクトリに対する相対パスです。 次のように、絶対パスを指定することもできます。
mapping-schema="C:\MyDir\KeyFields1.xml"
SQLXML 4.0 テスト スクリプト (sqlxml4test.vbs) を作成し、それを使用してテンプレートを実行します。
詳細については、「 ADO を使用した SQLXML クエリの実行」を参照してください。
これは部分的な結果セットです。
<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">
<Order SalesOrderID="43860" CustomerID="1">
<Customer CustID="1" SoldBy="280"/>
</Order>
<Order SalesOrderID="44501" CustomerID="1">
<Customer CustID="1" SoldBy="280"/>
</Order>
<Order SalesOrderID="45283" CustomerID="1">
<Customer CustID="1" SoldBy="280"/>
</Order>
.....
</ROOT>
B. sql:key-fields を指定して結果内に適切な入れ子を生成する
次のスキーマでは、 <sql:relationship> を使用して指定された階層はありません。 スキーマでは、humanResources.Employee テーブル内の従業員を一意に識別するために、 sql:key-fields 注釈を指定する必要があります。
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:sql="urn:schemas-microsoft-com:mapping-schema">
<xsd:element name="HumanResources.Employee" sql:key-fields="EmployeeID" >
<xsd:complexType>
<xsd:sequence>
<xsd:element name="Title">
<xsd:complexType>
<xsd:simpleContent>
<xsd:extension base="xsd:string">
<xsd:attribute name="EmployeeID" type="xsd:integer" />
</xsd:extension>
</xsd:simpleContent>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
このスキーマの実際のサンプルを作成するには
上のスキーマのコードをコピーして、テキスト ファイルに貼り付け、 KeyFields2.xml として保存します。
次のテンプレートをコピーして、テキスト ファイルに貼り付け、 KeyFields2.xml を保存したディレクトリに KeyFields2T.xml として保存します。 テンプレートの XPath クエリは、すべての <HumanResources.Employee> 要素を返します。
<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql"> <sql:xpath-query mapping-schema="KeyFields2.xml"> /HumanResources.Employee </sql:xpath-query> </ROOT>
マッピング スキーマ (KeyFields2.xml) に指定するディレクトリ パスは、テンプレートを保存するディレクトリに対する相対パスです。 次のように、絶対パスを指定することもできます。
mapping-schema="C:\MyDir\KeyFields2.xml"
SQLXML 4.0 テスト スクリプト (sqlxml4test.vbs) を作成し、それを使用してテンプレートを実行します。
詳細については、「 ADO を使用した SQLXML クエリの実行」を参照してください。
結果を次に示します。
<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">
<HumanResources.Employee>
<Title EmployeeID="1">Production Technician - WC60</Title>
</HumanResources.Employee>
<HumanResources.Employee>
<Title EmployeeID="2">Marketing Assistant</Title>
</HumanResources.Employee>
<HumanResources.Employee>
<Title EmployeeID="3">Engineering Manager</Title>
</HumanResources.Employee>
...
</ROOT>