sql:key-fields を使用した、キー列の指定 (SQLXML 4.0)
XSD スキーマに対して XPath クエリを指定する場合、結果内に適切な入れ子を生成するには、多くの場合キー情報が必要です。sql:key-fields 注釈の指定は、適切な階層を確実に生成するための 1 つの方法です。
注意 |
---|
適切な入れ子を生成するには、テーブルにマップする要素に sql:key-fields を指定することをお勧めします。作成される XML は、基になる結果セットの順序指定に影響を受けます。sql:key-fields を指定しない場合、適切な XML が作成されない可能性があります。 |
sql:key-fields の値で、リレーションの行を一意に識別する列を指定します。1 つの行を一意に識別するために複数の列が必要な場合は、列値をスペースで区切って示します。
要素に、要素と子要素間のリレーションシップを定義する <sql:relationship> が含まれていても、親要素で指定されたテーブルの主キーが <sql:relationship> で提供されない場合は、sql:key-fields 注釈を使用する必要があります。
例
次の例を使用した実際のサンプルを作成するには、特定の条件を満たす必要があります。詳細については、「SQLXML のサンプル実行のための必要条件」を参照してください。
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 注釈を指定しないと、不正確な階層が生成されます。
<Order> に sql:key-fields を指定すると、この注釈で親 (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 クエリでは、3 より小さい CustomerID が指定されているすべての <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> によって階層が指定されていませんが、sql:key-fields 注釈を指定して、HumanResources.Employee テーブルの従業員を一意に識別する必要があります。
<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>