sql:key-fields を使用した、キー列の指定 (XDR スキーマ)
重要 : |
---|
このトピックは、レガシ アプリケーションの参照用として用意されています。この機能は今後更新されません。新しい開発作業では、この機能の使用を避け、注釈付き XSD スキーマを使用して XML ビューを作成してください。詳細については、「注釈付き XSD スキーマの概要 (SQLXML 4.0)」を参照してください。既存の注釈付き XDR スキーマは、XSD スキーマに変換できます。詳細については、「注釈付き XDR スキーマから同等の XSD スキーマへの変換 (SQLXML 4.0)」を参照してください。 |
XDR スキーマに対して XPath クエリを指定する場合、結果内に適切な入れ子を生成するには、多くの場合キー情報が必要です。sql:key-fields 注釈の指定は、適切な階層を確実に生成するための 1 つの方法です。
メモ : |
---|
結果内に適切な入れ子を生成するには、すべてのスキーマで sql:key-fields を指定することをお勧めします。 |
多くの場合、適切な XML 階層を生成するには、テーブル内の行を一意に識別する方法を理解しておくことが必要です。<element> および <ElementType> に sql:key-fields 注釈を追加し、テーブルの行を一意に識別する列を指定できます。
sql:key-fields の値で、<ElementType> に指定されたリレーションの行を一意に識別する列を指定します。1 つの行を一意に識別するために複数の列が必要な場合は、列値をスペースで区切って示します。
要素に子要素が含まれ、要素と子要素の間に <sql:relationship> が定義されていても、親要素に指定されているテーブルの主キーが <sql:relationship> で提供されない場合は、要素内に sql:key-fields 注釈を指定する必要があります。
例
次の例を使用した実際のサンプルを作成するには、特定の条件を満たす必要があります。詳細については、「SQLXML のサンプル実行のための必要条件」を参照してください。
A. <sql:relationship> で十分な情報が提供されない場合に適切な入れ子を生成する
この例では、sql:key-fields をどこに指定すればよいかを示します。
次のスキーマを考えてみます。このスキーマでは、<Order> 要素と <Customer> 要素の間の階層が指定されており、<Order> 要素は親、<Customer> 要素は子となっています。
ここで、親と子のリレーションシップを指定するため、<sql:relationship> タグを使用します。<sql:relationship> タグでは、Sales.SalesOrderHeader テーブルの CustomerID を foreign-key として識別し、Sales.Customer テーブルの CustomerID キーを参照します。<sql:relationship> で提供されるこの情報だけでは、親テーブル (Sales.SalesOrderHeader) 内の行を一意に識別できません。このため、sql:key-fields を指定しないと、不正確な階層が生成されます。
<Order> に sql:key-fields を指定すると、この注釈で親 (Sales.SalesOrderHeader テーブル) 内の行が一意に識別され、その子要素が親の下に表示されます。
スキーマは次のようになります。
<?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="Customer" sql:relation="Sales.Customer">
<AttributeType name="CustomerID" />
<attribute type="CustomerID" />
</ElementType>
<ElementType name="Order" sql:relation="Sales.SalesOrderHeader"
sql:key-fields="SalesOrderID" >
<AttributeType name="SalesOrderID" />
<AttributeType name="CustomerID" />
<attribute type="SalesOrderID" />
<attribute type="CustomerID" />
<element type="Customer" >
<sql:relationship
key-relation="Sales.SalesOrderHeader"
key="CustomerID"
foreign-relation="Sales.Customer"
foreign-key="CustomerID" />
</element>
</ElementType>
</Schema>
このスキーマの実際のサンプルをテストするには
上のスキーマのコードをコピーして、テキスト ファイルに貼り付け、KeyFieldsA-Xdr.xml として保存します。
次のテンプレートをコピーして、テキスト ファイルに貼り付け、KeyFieldsA-Xdr.xml を保存したディレクトリに KeyFieldsA-XdrT.xml として保存します。
<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql"> <sql:xpath-query mapping-schema="KeyFieldsA-Xdr.xml"> /Order </sql:xpath-query> </ROOT>
マッピング スキーマ (KeyFieldsA-Xdr.xml) に指定するディレクトリ パスは、テンプレートを保存するディレクトリに対する相対パスです。次のように、絶対パスを指定することもできます。
mapping-schema="C:\MyDir\KeyFieldsA-Xdr.xml"
SQLXML 4.0 テスト スクリプト (sqlxml4test.vbs) を作成し、それを使用してテンプレートを実行します。
詳細については、「ADO を使用した、SQLXML 4.0 クエリの実行」を参照してください。
次に結果セットを示します。
<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">
<Order SalesOrderID="43659" CustomerID="676">
<Customer CustomerID="676" />
</Order>
<Order SalesOrderID="43660" CustomerID="117">
<Customer CustomerID="117" />
</Order>
<Order SalesOrderID="43661" CustomerID="442">
<Customer CustomerID="442" />
</Order>
...
</ROOT>
B. sql:key-fields を指定して結果内に適切な入れ子を生成する
このスキーマには、<sql:relationship> によって階層が指定されていませんが、sql:key-fields 注釈を指定して、HumanResources.Employee テーブルの従業員を一意に識別する必要があります。
<?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="Title" content="textOnly" >
<AttributeType name="EmployeeID" />
<attribute type="EmployeeID" />
</ElementType>
<ElementType name="HumanResources.Employee" sql:key-fields="EmployeeID" >
<element type="Title" />
</ElementType>
</Schema>
このスキーマの実際のサンプルをテストするには
上のスキーマのコードをコピーして、テキスト ファイルに貼り付け、KeyFieldsB-Xdr.xml として保存します。
次のテンプレートをコピーして、テキスト ファイルに貼り付け、KeyFieldsB-Xdr.xml を保存したディレクトリに KeyFieldsB-XdrT.xml として保存します。このテンプレートの XPath クエリでは、すべての <Order> 要素が返されます。
<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql"> <sql:xpath-query mapping-schema="KeyFieldsB-Xdr.xml"> /HumanResources.Employee </sql:xpath-query> </ROOT>
マッピング スキーマ (KeyFieldsB-Xdr.xml) に指定するディレクトリ パスは、テンプレートを保存するディレクトリに対する相対パスです。次のように、絶対パスを指定することもできます。
mapping-schema="C:\MyDir\KeyFieldsB-Xdr.xml"
SQLXML 4.0 テスト スクリプト (sqlxml4test.vbs) を作成し、それを使用してテンプレートを実行します。
詳細については、「ADO を使用した、SQLXML 4.0 クエリの実行」を参照してください。
次に結果セットの一部を示します。
<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>