sql:relationship を使用した、リレーションシップの指定 (XDR スキーマ)
重要 : |
---|
このトピックは、レガシ アプリケーションの参照用として用意されています。この機能は今後更新されません。新しい開発作業では、この機能の使用を避け、注釈付き XSD スキーマを使用して XML ビューを作成してください。詳細については、「注釈付き XSD スキーマの概要 (SQLXML 4.0)」を参照してください。既存の注釈付き XDR スキーマは、XSD スキーマに変換できます。詳細については、「注釈付き XDR スキーマから同等の XSD スキーマへの変換 (SQLXML 4.0)」を参照してください。 |
XML ドキュメント内の要素は関連付けることができます。要素は階層的に入れ子にでき、要素間に ID、IDREF、または IDREFS のリレーションシップを指定することができます。
たとえば、XDR スキーマで <Customer> 要素に <Order> 子要素が含まれているとします。ここで、<Customer> 要素は顧客データを格納しているテーブル (AdventureWorks データベースの Sales.Customer など) にマップされ、<Order> 要素は同じデータベースの、注文データを格納しているテーブル (Sales.SalesORderHeader など) にマップされます。これらの基になる Sales.Customer および Sales.SalesOrderHeader テーブルの間には、顧客 (Customer) が注文 (Order) するという関係があります。ここで、Sales.SalesOrderHeader テーブル内の CustomerID は、Sales.Customer テーブル内の CustomerID 主キーを参照する外部キーです。マッピング スキーマで要素間のリレーションシップを設定するには、<sql:relationship> 注釈を使用します。
注釈付き XDR スキーマでは、<sql:relationship> 注釈を使用して、要素のマップ先テーブルにおける主キーと外部キーのリレーションシップを基にスキーマ要素を階層的に入れ子にできます。<sql:relationship> 注釈を指定するときには、次を指定する必要があります。
- 主テーブル (Sales.Customer) と外部テーブル (Sales.SalesOrderHeader)
- 必要な結合条件 (Sales.SalesOrderHeader の CustomerID は Sales.Customer テーブルの CustomerID 主キーを参照する外部キー)
この情報により、<customer> 要素ごとに関連する <order> 要素が子要素に設定され、適切な階層が生成されます。
テーブル名と必要な結合情報を指定するには、<sql:relationship> 注釈に次の属性を指定します。これらの属性は、sql:relationship 要素でのみ有効です。
- key-relation
プライマリ リレーション (テーブル) を指定します。
- key
key-relation の主キーを指定します。主キーが複数の列で構成される場合は、値をスペースで区切って指定します。複数列キーに指定される値と、それに対応する外部キーに指定される値の間では、位置的なマッピングが行われます。
- foreign-relation
外部リレーション (テーブル) を指定します。
- foreign-key
foreign-relation で key-relation の key を参照する外部キーを指定します。外部キーが複数の属性 (列) で構成される場合は、外部キーの値をスペースで区切って指定します。複数列キーに指定される値と、それに対応する外部キーに指定される値の間では、位置的なマッピングが行われます。
メモ : |
---|
Microsoft SQL Server データ型の key と foreign-key は、必要に応じて明示的に変換できるようにしておく必要があります。 |
sql:relationship タグは、注釈付きスキーマの <element> または <attribute> 要素にのみ追加できます。属性に sql:relationship を指定する場合は、単一の値が取得されるよう、その属性に sql:relation と sql:field を指定する必要があります。XML では、同じ名前の属性を複数使用することはできません。要素に sql:relationship を指定する場合、リレーションシップは、単一の値にも値のセットにもできます。
sql:relationship タグは、2 つのエンティティ間に 1 つの論理リレーションシップを指定するときに使用します。この属性では、リレーションとフィールドを定義して、論理リレーションシップを定義します。注釈付きスキーマでは、要素または属性に sql:relationship の複数のインスタンスを指定し、要素または属性と、その構成要素との間の複雑なリレーションシップを示すことができます。複雑なリレーションシップの定義には、sql:relationship のすべてのインスタンスが一緒に使用されます。
要素または属性に sql:relationship タグの複数のインスタンスを指定するときには、その順序が重要になります。
要素に子要素が含まれ、要素と子要素の間に sql:relationship が定義されていても、親要素に指定されているテーブルの主キーが sql:relationship で提供されない場合は、要素内に sql:key-fields 注釈を指定する必要があります。詳細については、「sql:key-fields を使用した、キー列の指定 [SQLXML 4.0]」を参照してください。結果内に適切な入れ子を生成するには、すべてのスキーマで sql:key-fields を指定することをお勧めします。
メモ : |
---|
マッピング スキーマでは、テーブル名や列名などのリレーショナル値では大文字と小文字が区別されます。 |
例
次の例を使用した実際のサンプルを作成するには、特定の条件を満たす必要があります。詳細については、「SQLXML のサンプル実行のための必要条件」を参照してください。
A. <element> に sql:relationship を指定する
この注釈付き XDR スキーマには <Customer> 要素と <Order> 要素が含まれています。<Order> 要素は <Customer> 要素の子要素です。
スキーマでは、<Order> 子要素に sql:relationship 注釈が指定されています。この注釈は、Sales.SalesOrderHeader テーブル内の CustomerID が、Sales.Customer テーブル内の CustomerID 主キーを参照する外部キーであることを示します。したがって、顧客の注文は、<Customer> 要素の子要素として表されます。
<?xml version="1.0" ?>
<Schema xmlns="urn:schemas-microsoft-com:xml-data"
xmlns:dt="urn:schemas-microsoft-com:datatypes"
xmlns:sql="urn:schemas-microsoft-com:xml-sql">
<ElementType name="Order" sql:relation="Sales.SalesOrderHeader" >
<AttributeType name="CustomerID" />
<AttributeType name="SalesOrderID" />
<AttributeType name="OrderDate" />
<attribute type="CustomerID" />
<attribute type="SalesOrderID" />
<attribute type="OrderDate" />
</ElementType>
<ElementType name="Customer" sql:relation="Sales.Customer" >
<AttributeType name="CustomerID" />
<attribute type="CustomerID" />
<element type="Order" >
<sql:relationship
key-relation="Sales.Customer"
key="CustomerID"
foreign-key="CustomerID"
foreign-relation="Sales.SalesOrderHeader" />
</element>
</ElementType>
</Schema>
メモ : |
---|
マッピング スキーマでは、テーブル名や列名などのリレーショナル値は大文字と小文字が区別されます。前の例では、Customers は sql:relation 属性の値です。これに対応する key-relation 属性値も Customers である必要があります。 |
スキーマに対してサンプル XPath クエリをテストするには
上のスキーマのコードをコピーして、テキスト ファイルに貼り付け、sql-relationship-xdr.xml として保存します。
次のテンプレートをコピーして、テキスト ファイルに貼り付け、sql-relationship-xdr.xml を保存したディレクトリに sql-relationship-xdrT.xml として保存します。このテンプレートのクエリでは、CustomerID が 1 の顧客が選択されます。
<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql"> <sql:xpath-query mapping-schema="sql-relationship-xdr.xml"> Customer[@CustomerID="1"] </sql:xpath-query> </ROOT>
マッピング スキーマ (sql-relationship-xdr.xml) に指定するディレクトリ パスは、テンプレートを保存するディレクトリに対する相対パスです。次のように、絶対パスを指定することもできます。
mapping-schema="C:\SqlXmlTest\sql-relationship-xdr.xml"
SQLXML 4.0 テスト スクリプト (sqlxml4test.vbs) を作成し、それを使用してテンプレートを実行します。
詳細については、「ADO を使用した、SQLXML 4.0 クエリの実行」を参照してください。
次に結果セットの一部を示します。
<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">
<Customer CustomerID="1">
<Order CustomerID="1" SalesOrderID="43860" OrderDate="2001-08-01T00:00:00" />
<Order CustomerID="1" SalesOrderID="44501" OrderDate="2001-11-01T00:00:00" />
<Order CustomerID="1" SalesOrderID="45283" OrderDate="2002-02-01T00:00:00" />
<Order CustomerID="1" SalesOrderID="46042" OrderDate="2002-05-01T00:00:00" />
</Customer>
</ROOT>
B. <attribute> に sql:relationship を指定し、ID と IDREFS を使用してドキュメント参照を作成する
この例では、ID と IDREFS を使用して、ローカル ドキュメント参照が指定されています。サンプルの XDR スキーマは <Customer> 要素で構成されており、この要素は Sales.Customer テーブルにマップされます。この要素には <Order> 子要素が含まれており、これは Sales.SalesOrderHeader テーブルにマップされます。
この例では、sql:relationship が 2 回指定されています。
- sql:relationship は <Order> 子要素に指定されています。したがって、顧客の注文は、<Customer> 要素の子要素として表されます。
- sql:relationship は <Customer> 要素の OrderIDList 属性にも指定されています。この属性は、<Order> 要素の SalesOrderID 属性 (ID 型属性) を参照する IDREFS 型として定義されています。したがって、sql:relationship が必要です。この場合、sql:relationship 注釈によって、顧客の注文の一覧がその <Customer> 要素と共に表示されます。
IDREFS として指定された属性は ID 型属性を参照するときに使用でき、ドキュメント内でのリンクを可能にします。
ID 値は名前付きトークンである必要があり、数値は有効でないため、Order ID を文字列値とするために sql:id-prefix が使用されています。詳細については、「sql:id-prefix を使用した、有効な ID 型、IDREF 型、IDREFS 型の属性の作成 (XDR スキーマ)」を参照してください。
<?xml version="1.0" ?>
<Schema xmlns="urn:schemas-microsoft-com:xml-data"
xmlns:dt="urn:schemas-microsoft-com:datatypes"
xmlns:sql="urn:schemas-microsoft-com:xml-sql">
<ElementType name="Order" sql:relation="Sales.SalesOrderHeader" >
<AttributeType name="SalesOrderID" dt:type="id" sql:id-prefix="Ord-" />
<AttributeType name="OrderDate" />
<attribute type="SalesOrderID" />
<attribute type="OrderDate" />
</ElementType>
<ElementType name="Customer" sql:relation="Sales.Customer">
<AttributeType name="CustomerID" />
<attribute type="CustomerID" />
<AttributeType name="OrderIDList" dt:type="idrefs"
sql:id-prefix="Ord-"/>
<attribute type="OrderIDList" sql:relation="Sales.SalesOrderHeader"
sql:field="SalesOrderID">
<sql:relationship
key-relation="Sales.Customer"
key="CustomerID"
foreign-relation="Sales.SalesOrderHeader"
foreign-key="CustomerID" />
</attribute>
<element type="Order">
<sql:relationship key-relation="Sales.Customer"
key="CustomerID"
foreign-relation="Sales.SalesOrderHeader"
foreign-key="CustomerID" />
</element>
</ElementType>
</Schema>
スキーマに対してサンプル XPath クエリをテストするには
上のスキーマのコードをコピーして、テキスト ファイルに貼り付け、idIdref-xdr.xml として保存します。
次のテンプレートをコピーして、テキスト ファイルに貼り付け、idIdref-xdr.xml を保存したディレクトリに idIdref-xdrT.xml として保存します。このテンプレートのクエリでは、CustomerID が 1 の顧客が選択されます。
<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql"> <sql:xpath-query mapping-schema="idIdref-xdr.xml"> Customer[@CustomerID="1"] </sql:xpath-query> </ROOT>
マッピング スキーマ (idIdref-xdr.xml) に指定するディレクトリ パスは、テンプレートを保存するディレクトリに対する相対パスです。次のように、絶対パスを指定することもできます。
mapping-schema="C:\SqlXmlTest\idIdref-xdr.xml"
SQLXML 4.0 テスト スクリプト (sqlxml4test.vbs) を作成し、それを使用してテンプレートを実行します。
詳細については、「ADO を使用した、SQLXML 4.0 クエリの実行」を参照してください。
次に結果セットを示します。
<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">
<Customer CustomerID="1"
OrderIDList="Ord-43860 Ord-44501 Ord-45283 Ord-46042">
<Order SalesOrderID="Ord-43860" OrderDate="2001-08-01T00:00:00" />
<Order SalesOrderID="Ord-44501" OrderDate="2001-11-01T00:00:00" />
<Order SalesOrderID="Ord-45283" OrderDate="2002-02-01T00:00:00" />
<Order SalesOrderID="Ord-46042" OrderDate="2002-05-01T00:00:00" />
</Customer>
</ROOT>
C. 複数の要素に sql:relationship を指定する
この例では、注釈付き XDR スキーマに <Customer>、<Order>、および <OD> 要素が含まれています。
<Order> 要素は <Customer> 要素の子要素であり、<Order> 子要素に sql:relationship が指定されています。したがって、顧客の注文は <Customer> の子要素として表されます。
<Order> 要素には <OD> 子要素が含まれており、<OD> 子要素に sql:relationship が指定されています。したがって、注文の詳細は <Order> 要素の子要素として表されます。
<?xml version="1.0" ?>
<Schema xmlns="urn:schemas-microsoft-com:xml-data"
xmlns:dt="urn:schemas-microsoft-com:datatypes"
xmlns:sql="urn:schemas-microsoft-com:xml-sql">
<ElementType name="OD" sql:relation="Sales.SalesOrderDetail" >
<AttributeType name="SalesOrderID" />
<AttributeType name="ProductID" />
<attribute type="SalesOrderID" />
<attribute type="ProductID" />
</ElementType>
<ElementType name="Order" sql:relation="Sales.SalesOrderHeader" >
<AttributeType name="CustomerID" />
<AttributeType name="SalesOrderID" />
<AttributeType name="OrderDate" />
<attribute type="CustomerID" />
<attribute type="SalesOrderID" />
<attribute type="OrderDate" />
<element type="OD" >
<sql:relationship
key-relation="Sales.SalesOrderHeader"
key="SalesOrderID"
foreign-key="SalesOrderID"
foreign-relation="Sales.SalesOrderDetail" />
</element>
</ElementType>
<ElementType name="Customer" sql:relation="Sales.Customer" >
<AttributeType name="CustomerID" />
<attribute type="CustomerID" />
<element type="Order" >
<sql:relationship
key-relation="Sales.Customer"
key="CustomerID"
foreign-key="CustomerID"
foreign-relation="Sales.SalesOrderHeader" />
</element>
</ElementType>
</Schema>
スキーマに対してサンプル XPath クエリをテストするには
上のスキーマのコードをコピーして、テキスト ファイルに貼り付け、sql-relationship-multi-xdr.xml として保存します。
次のテンプレートをコピーして、テキスト ファイルに貼り付け、sql-relationship-multi-xdr.xml を保存したディレクトリに sql-relationship-multi-xdrT.xml として保存します。このテンプレートのクエリでは、CustomerID が 1 で SalesOrderID が 43860 の顧客に関する注文情報が返されます。
<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql"> <sql:xpath-query mapping-schema="sql-relationship-multi-xdr.xml"> /Customer[@CustomerID="1"]/Order[@SalesOrderID=43860] </sql:xpath-query> </ROOT>
マッピング スキーマ (sql-relationship-multi-xdr.xml) に指定するディレクトリ パスは、テンプレートを保存するディレクトリに対する相対パスです。次のように、絶対パスを指定することもできます。
mapping-schema="C:\SqlXmlTest\sql-relationship-multi-xdr.xml"
SQLXML 4.0 テスト スクリプト (sqlxml4test.vbs) を作成し、それを使用してテンプレートを実行します。
詳細については、「ADO を使用した、SQLXML 4.0 クエリの実行」を参照してください。
次に結果セットを示します。
<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">
<Order CustomerID="1" SalesOrderID="43860" OrderDate="2001-08-01T00:00:00">
<OD SalesOrderID="43860" ProductID="761" />
<OD SalesOrderID="43860" ProductID="770" />
<OD SalesOrderID="43860" ProductID="758" />
<OD SalesOrderID="43860" ProductID="765" />
<OD SalesOrderID="43860" ProductID="732" />
<OD SalesOrderID="43860" ProductID="762" />
<OD SalesOrderID="43860" ProductID="738" />
<OD SalesOrderID="43860" ProductID="768" />
<OD SalesOrderID="43860" ProductID="753" />
<OD SalesOrderID="43860" ProductID="729" />
<OD SalesOrderID="43860" ProductID="763" />
<OD SalesOrderID="43860" ProductID="756" />
</Order>
</ROOT>
D. 間接リレーションシップを指定する
この例では、注釈付き XDR スキーマに <Customer> および <OD> 要素が含まれています。これらの要素間のリレーションシップは間接的であり、Sales.Customer テーブルは Sales.SalesOrderHeader テーブル経由で Sales.SalesOrderDetail テーブルに関連付けられています。顧客を注文詳細に関連付けるには、まず、Sales.Customer テーブルと Sales.SalesOrderHeader テーブルの間のリレーションシップを指定し、次に、Sales.SalesOrderHeader テーブルと Sales.SalesOrderDetail テーブルの間のリレーションシップを指定します。
スキーマは次のようになります。
<?xml version="1.0" ?>
<Schema xmlns="urn:schemas-microsoft-com:xml-data"
xmlns:dt="urn:schemas-microsoft-com:datatypes"
xmlns:sql="urn:schemas-microsoft-com:xml-sql">
<ElementType name="OD" sql:relation="Sales.SalesOrderDetail" >
<AttributeType name="SalesOrderID" />
<AttributeType name="ProductID" />
<AttributeType name="UnitPrice" />
<attribute type="SalesOrderID" />
<attribute type="ProductID" />
<attribute type="UnitPrice" />
</ElementType>
<ElementType name="Customer" sql:relation="Sales.Customer" >
<AttributeType name="CustomerID" />
<attribute type="CustomerID" />
<element type="OD" >
<sql:relationship
key-relation="Sales.Customer"
key="CustomerID"
foreign-relation="Sales.SalesOrderHeader"
foreign-key="CustomerID"/>
<sql:relationship
key-relation="Sales.SalesOrderHeader"
key="SalesOrderID"
foreign-relation="Sales.SalesOrderDetail"
foreign-key="SalesOrderID" />
</element>
</ElementType>
</Schema>
スキーマに対してサンプル XPath クエリをテストするには
上のスキーマのコードをコピーして、テキスト ファイルに貼り付け、indirect-relationship-xdr.xml として保存します。
次のテンプレートをコピーして、テキスト ファイルに貼り付け、indirect-relationship-xdr.xml を保存したディレクトリに indirect-relationship-xdrT.xml として保存します。このテンプレートのクエリでは、CustomerID が 1 の顧客の注文情報が返されます。
<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql" > <sql:xpath-query mapping-schema="indirect-relationship-xdr.xml" > /Customer[@CustomerID="1"] </sql:xpath-query> </ROOT>
マッピング スキーマ (indirect-relationship-xdr.xml) に指定するディレクトリ パスは、テンプレートを保存するディレクトリに対する相対パスです。次のように、絶対パスを指定することもできます。
mapping-schema="C:\SqlXmlTest\indirect-relationship-xdr.xml"
SQLXML 4.0 テスト スクリプト (sqlxml4test.vbs) を作成し、それを使用してテンプレートを実行します。
詳細については、「ADO を使用した、SQLXML 4.0 クエリの実行」を参照してください。
次に結果の一部を示します。
<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">
<Customer CustomerID="1">
<OD SalesOrderID="43860" ProductID="761" UnitPrice="503.3507" />
<OD SalesOrderID="43860" ProductID="770" UnitPrice="503.3507" />
<OD SalesOrderID="43860" ProductID="758" UnitPrice="1049.7528" />
<OD SalesOrderID="43860" ProductID="765" UnitPrice="503.3507" />
...
</Customer>
</ROOT>
E. 複数キーによる結合リレーションシップを指定する
sql:relationship を使用して結合を指定するときには、2 つ以上の列の結合を指定できます。この場合、key と foreign-key の列名を、スペースで区切って指定します。
この例では、次の 2 つのテーブルが tempdb などの一時データベースに存在するものとします。
- dbo.Cust (fname、lname)
- dbo.Ord (OrderID、fname、lname)
fname 列と lname 列は、Cust テーブルの主キーを構成します。OrderID は、Ord テーブルの主キーです。Ord テーブルの fname および lname は、Cust テーブルの fname および lname 主キーを参照する外部キーです。
このスキーマには、<Cust> および <Ord> 要素が含まれており、これらの結合に sql:relationship が使用されています。
<?xml version="1.0" ?>
<Schema xmlns="urn:schemas-microsoft-com:xml-data"
xmlns:dt="urn:schemas-microsoft-com:datatypes"
xmlns:sql="urn:schemas-microsoft-com:xml-sql">
<ElementType name="Ord" sql:relation="Ord" >
<AttributeType name="OrderID" />
<attribute type="OrderID" />
</ElementType>
<ElementType name="Cust" sql:relation="Cust" >
<AttributeType name="fname" />
<AttributeType name="lname" />
<attribute type="fname" />
<attribute type="lname" />
<element type="Ord" >
<sql:relationship
key-relation="Cust"
key="fname lname"
foreign-relation="Ord"
foreign-key="fname lname"/>
</element>
</ElementType>
</Schema>
スキーマに対してサンプル XPath クエリをテストするには
Cust と Ord の 2 つのテーブルを作成します。
USE tempdb CREATE TABLE dbo.Cust( fname varchar(20), lname varchar(20) ) CREATE TABLE dbo.Ord ( OrderID int primary key, fname varchar(20), lname varchar(20) ) GO
次のサンプル データを追加します。
INSERT INTO Cust values ('Nancy', 'Davolio') INSERT INTO Cust values('Andrew', 'Fuller') INSERT INTO Ord values (1,'Nancy', 'Davolio') INSERT INTO Ord values (2,'Nancy', 'Davolio') INSERT INTO Ord values (3,'Andrew', 'Fuller')
上のスキーマのコードをコピーして、テキスト ファイルに貼り付け、multikey-join-xdr.xml として保存します。
次のテンプレートをコピーして、テキスト ファイルに貼り付け、multikey-join-xdr.xml を保存したディレクトリに multikey-join-xdrT.xml として保存します。このテンプレートのクエリでは、顧客情報が返されます。
<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql" > <sql:xpath-query mapping-schema="multikey-join-xdr.xml" > /Cust </sql:xpath-query> </ROOT>
マッピング スキーマ (multikey-join-xdr.xml) に指定するディレクトリ パスは、テンプレートを保存するディレクトリに対する相対パスです。次のように、絶対パスを指定することもできます。
mapping-schema="C:\SqlXmlTest\multikey-join-xdr.xml"
SQLXML 4.0 テスト スクリプト (sqlxml4test.vbs) を作成し、それを使用してテンプレートを実行します。
詳細については、「ADO を使用した、SQLXML 4.0 クエリの実行」を参照してください。
次に結果の一部を示します。
<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">
<Cust fname="Andrew" lname="Fuller">
<Ord OrderID="3" />
</Cust>
<Cust fname="Nancy" lname="Davolio">
<Ord OrderID="1" />
<Ord OrderID="2" />
</Cust>
</ROOT>