使用 sql:key-fields 來識別索引鍵資料行 (SQLXML 4.0)
針對 XSD 結構描述指定 XPath 查詢時,在大部分情況下都需要索引鍵資訊,才能在結果中取得正確的巢狀結構。指定 sql:key-fields 註解是確保產生適當階層的方式。
[!附註]
若要確保正確的巢狀結構,建議您針對對應至資料表的元素指定 sql:key-fields。產生的 XML 會區分基礎結果集的排序。如果沒有指定 sql:key-fields,產生的 XML 格式可能會不正確。
sql:key-fields 的值會識別在關聯中唯一識別資料列的資料行。如果需要多個資料行才能唯一識別某個資料列,這些資料行值就會以空格隔開。
當某個元素包含在該元素與子元素之間定義的 <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。
複製下列範本,並將其貼到文字檔中。將檔案儲存為 KeyFields1T.xml,並放在儲存 KeyFields1.xml 的相同目錄中。此範本中的 XPath 查詢會傳回 CustomerID 小於 3 的所有 <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。
複製下列範本,並將其貼到文字檔中。將檔案儲存為 KeyFields2T.xml,並放在儲存 KeyFields2.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>