使用 sql:key-fields 來識別索引鍵資料行 (XDR 結構描述)
重要事項 |
|---|
這個主題是舊版應用程式的參考。這項功能未來將不會繼續開發,請避免在新的開發工作中使用此功能,而改用註解式 XSD 結構描述建立 XML 檢視。如需詳細資訊,請參閱<註解式 XSD 結構描述簡介 (SQLXML 4.0)>。您可以將現有註解式 XDR 結構描述轉換為 XSD 結構描述。如需詳細資訊,請參閱<將註解式 XDR 結構描述轉換為等效 XSD 結構描述 (SQLXML 4.0)>。 |
針對 XDR 結構描述指定 XPath 查詢時,在大部分情況下都需要索引鍵資訊,才能在結果中取得正確的巢狀結構。指定 sql:key-fields 註解是確保產生適當階層的方式。
[!附註]
若要在結果中產生正確的巢狀結構,建議要在所有的結構描述中指定 sql:key-fields。
在許多情況下,您必須了解如何唯一識別資料表中的資料列,以便產生適當的 XML 階層。您可以將 sql:key-fields 註解加入至 <element> 和 <ElementType>,以便識別可唯一識別資料表中資料列的資料行。
sql:key-fields 的值會識別在 <ElementType> 所指定的關聯中唯一識別資料列的資料行。如果需要多個資料行才能唯一識別某個資料列,這些資料行值就會以空格隔開。
sql:key-fields 註解必須指定在包含子元素和 <sql:relationship> (定義在元素和子元素之間) 的元素中,但是它並不提供指定在父元素中的資料表主索引鍵。
範例
若要使用下列範例建立工作範例,您必須符合某些需求。如需詳細資訊,請參閱<執行 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-XdrT.xml,並放在儲存 KeyFieldsA-Xdr.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="BusinessEntityID" />
<attribute type="BusinessEntityID" />
</ElementType>
<ElementType name="HumanResources.Employee" sql:key-fields="BusinessEntityID" >
<element type="JobTitle" />
</ElementType>
</Schema>
測試這個結構描述的工作範例
複製上述的結構描述程式碼,並將其貼到文字檔中。將檔案儲存為 KeyFieldsB-Xdr.xml。
複製下列範本,並將其貼到文字檔中。然後將檔案儲存為 KeyFieldsB-XdrT.xml,並放在儲存 KeyFieldsB-Xdr.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 BusinessEntityID="1">Production Technician - WC60</Title>
</HumanResources.Employee>
<HumanResources.Employee>
<Title BusinessEntityID="2">Marketing Assistant</Title>
</HumanResources.Employee>
<HumanResources.Employee>
<Title BusinessEntityID="3">Engineering Manager</Title>
</HumanResources.Employee>
...
</ROOT>
重要事項