sql:id-prefix を使用した、有効な ID 型、IDREF 型、IDREFS 型の属性の作成 (XDR スキーマ)
重要 : |
---|
このトピックは、レガシ アプリケーションの参照用として用意されています。この機能は今後更新されません。新しい開発作業では、この機能の使用を避け、注釈付き XSD スキーマを使用して XML ビューを作成してください。詳細については、「注釈付き XSD スキーマの概要 (SQLXML 4.0)」を参照してください。既存の注釈付き XDR スキーマは、XSD スキーマに変換できます。詳細については、「注釈付き XDR スキーマから同等の XSD スキーマへの変換 (SQLXML 4.0)」を参照してください。 |
属性を ID 型属性として指定することができます。ID 型属性は、IDREF または IDREFS として指定された属性を使用して参照できるため、ドキュメント内でのリンクが可能になります。
ID、IDREF、IDREFS は、データベースの主キー/外部キー (PK/FK) のリレーションシップにほぼ対応しています。XML ドキュメント内で、ID 型属性の値は一意である必要があります。たとえば、XML ドキュメントに CustomerID 属性と SalesOrderID 属性がある場合、これらの値は異なる必要があります。ただし、データベースの中では、CustomerID 列と SalesOrderID 列が同じ値であってもかまいません。たとえば、データベースで 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:id-prefix 注釈を使用してください。The sql:id-prefix 注釈を使用して、数値から名前付きトークンを作成することもできます。sql:id-prefix に指定する値は、有効な名前の文字である必要があります。
sql:id-prefix 属性を使用すると、ID、IDREF、IDREFS の値の前に文字列が追加されるので、これらの値を一意にできます。ID、IDREF、または IDREFS に関して、プレフィックスの有効性や値の一意性を確認するためのチェックは行われません。
型が ID、IDREF、または IDREFS でない属性では、sql:id-prefix は無視されます。
メモ : |
---|
ID 属性、IDREF 属性、IDREFS 属性の値はそれぞれ、プレフィックスを指定する場合はそれも含めて、4,000 文字までに制限されます。 |
例
次の例を使用した実際のサンプルを作成するには、特定の条件を満たす必要があります。詳細については、「SQLXML のサンプル実行のための必要条件」を参照してください。
A. ID 型属性に sql:id-prefix を指定する
この XDR スキーマでは、SalesOrderID 属性と CustomerID 属性が、ID 型として宣言されています。ID を一意かつ有効にするため、これらの属性には sql:id-prefix 注釈が指定されています。
<?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" sql:key-fields="SalesOrderID">
<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" dt:type="id" />
<attribute type="CustomerID" />
<AttributeType name="OrderList" dt:type="idrefs"
sql:id-prefix="Ord-" />
<attribute type="OrderList" 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.SalesOrderHeader"
key="SalesOrderID"
foreign-relation="Sales.Customer"
foreign-key="SalesOrderID" />
</element>
</ElementType>
</Schema>
スキーマに対してサンプル XPath クエリをテストするには
上のスキーマのコードをコピーして、テキスト ファイルに貼り付け、sqlPrefix-Xdr.xml として保存します。
次のテンプレートをコピーして、テキスト ファイルに貼り付け、sqlPrefix-Xdr.xml を保存したディレクトリに sqlPrefix-XdrT.xml として保存します。このテンプレートの XPath クエリでは、CustomerID が 1 の <Customer> および <Order> サブ要素が返されます。
<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql"> <sql:xpath-query mapping-schema="sqlPrefix-Xdr.xml"> Customer[@CustomerID="1"] </sql:xpath-query> </ROOT>
マッピング スキーマ (sqlPrefix-Xdr.xml) に指定するディレクトリ パスは、テンプレートを保存するディレクトリに対する相対パスです。次のように、絶対パスを指定することもできます。
mapping-schema="C:\MyDir\sqlPrefix-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>