使用 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>

若要建立這個結構描述的工作範例

  1. 複製上述的結構描述程式碼,並將其貼到文字檔中。將檔案儲存為 KeyFields1.xml。

  2. 複製下列範本,並將其貼到文字檔中。將檔案儲存為 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 &lt; 3]
        </sql:xpath-query>
    </ROOT>
    

    針對對應結構描述 (KeyFields1.xml) 指定的目錄路徑相對於儲存範本的目錄。您也可以指定絕對路徑,例如:

    mapping-schema="C:\MyDir\KeyFields1.xml"
    
  3. 建立及使用 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>

若要建立這個結構描述的工作範例

  1. 複製上述的結構描述程式碼,並將其貼到文字檔中。將檔案儲存為 KeyFields2.xml。

  2. 複製下列範本,並將其貼到文字檔中。將檔案儲存為 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"
    
  3. 建立及使用 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>