sql:prefix を使用した、有効な ID 型、IDREF 型、IDREFS 型の属性の作成 [SQLXML 4.0]
属性を ID 型属性として指定することができます。ID 型属性を指定すると、IDREF または IDREFS として指定した属性から ID 型属性を参照でき、ドキュメント間をリンクできるようになります。
ID、IDREF、IDREFS は、データベースの PK と FK (主キーと外部キー) のリレーションシップにほぼ対応し、ほとんど違いはありません。XML ドキュメント内で、ID 型属性の値は一意である必要があります。XML ドキュメントで、CustomerID 属性、OrderID 属性が ID 型として指定されている場合、これらの値は一意である必要があります。一方データベースでは、CustomerID 列と OrderID 列の値は同じにできます。たとえば、CustomerID = 1、OrderID = 1 はデータベース内で有効です。
ID 属性、IDREF 属性、および IDREFS 属性が有効であるためには、次の条件を満たしている必要があります。
- ID の値が XML ドキュメント内で一意であること。
- 各 IDREF および IDREFS について、XML ドキュメント内に参照される ID が存在すること。
- ID、IDREF、IDREFS の値が名前付きトークンであること。たとえば、整数値 101 は ID 値にできません。
- ID 型、IDREF 型、IDREFS 型の属性が、text 型、ntext 型、image 型、またはその他のバイナリ データ型 (timestamp など) の列にマップされていないこと。
XML ドキュメントに複数の ID が含まれる場合は、値が一意になるよう sql:prefix 注釈を使用してください。
sql:prefix 注釈は、XSD 固定属性では使用できないことに注意してください。
例
次の例を使用した実際のサンプルを作成するには、特定の条件を満たす必要があります。詳細については、「SQLXML のサンプル実行のための必要条件」を参照してください。
A. ID 型と IDREFS 型を指定する
次のスキーマでは、<Customer> 要素が <Order> 子要素で構成されており、<Order> 要素にはさらに <OrderDetail> 子要素があります。
<Customer> の OrderIDList 属性は IDREFS 型属性で、<Order> 要素の OrderID 属性を参照しています。
<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="CustOrders"
parent="Sales.Customer"
parent-key="CustomerID"
child="Sales.SalesOrderHeader"
child-key="CustomerID" />
<sql:relationship name="OrderOrderDetail"
parent="Sales.SalesOrderHeader"
parent-key="SalesOrderID"
child="Sales.SalesOrderDetail"
child-key="SalesOrderID" />
</xsd:appinfo>
</xsd:annotation>
<xsd:element name="Customer" sql:relation="Sales.Customer" >
<xsd:complexType>
<xsd:sequence>
<xsd:element name="Order" sql:relation="Sales.SalesOrderHeader"
sql:relationship="CustOrders" maxOccurs="unbounded" >
<xsd:complexType>
<xsd:sequence>
<xsd:element name="OrderDetail"
sql:relation="Sales.SalesOrderDetail"
sql:relationship="OrderOrderDetail"
maxOccurs="unbounded" >
<xsd:complexType>
<xsd:attribute name="SalesOrderID" type="xsd:integer" />
<xsd:attribute name="ProductID" type="xsd:string" />
<xsd:attribute name="OrderQty" type="xsd:integer" />
</xsd:complexType>
</xsd:element>
</xsd:sequence>
<xsd:attribute name="SalesOrderID"
type="xsd:ID" sql:prefix="ord-" />
<xsd:attribute name="OrderDate" type="xsd:date" />
<xsd:attribute name="CustomerID" type="xsd:string" />
</xsd:complexType>
</xsd:element>
</xsd:sequence>
<xsd:attribute name="CustomerID" type="xsd:string" />
<xsd:attribute name="OrderIDList" type="xsd:IDREFS"
sql:relation="Sales.SalesOrderHeader" sql:field="SalesOrderID"
sql:relationship="CustOrders" sql:prefix="ord-">
</xsd:attribute>
</xsd:complexType>
</xsd:element>
</xsd:schema>
スキーマに対してサンプル XPath クエリをテストするには
上のスキーマのコードをコピーして、テキスト ファイルに貼り付け、sqlPrefix.xml として保存します。
次のテンプレートをコピーして、テキスト ファイルに貼り付け、sqlPrefix.xml を保存したディレクトリに sqlPrefixT.xml として保存します。
<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql"> <sql:xpath-query mapping-schema="sqlPrefix.xml"> /Customer[@CustomerID=1] </sql:xpath-query> </ROOT>
マッピング スキーマ (sqlPrefix.xml) に指定するディレクトリ パスは、テンプレートを保存するディレクトリに対する相対パスです。次のように、絶対パスを指定することもできます。
mapping-schema="C:\SqlXmlTest\sqlPrefix.xml"
SQLXML 4.0 テスト スクリプト (sqlxml4test.vbs) を作成し、それを使用してテンプレートを実行します。
詳細については、「ADO を使用した SQLXML クエリの実行」を参照してください。
次に結果の一部を示します。
<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-01" CustomerID="1">
<OrderDetail SalesOrderID="43860" ProductID="729" OrderQty="1" />
<OrderDetail SalesOrderID="43860" ProductID="732" OrderQty="1" />
<OrderDetail SalesOrderID="43860" ProductID="738" OrderQty="1" />
<OrderDetail SalesOrderID="43860" ProductID="753" OrderQty="2" />
...
</Order>
...
</Customer>
</ROOT>