共用方式為


在查詢中使用註解式 XSD 結構描述 (SQLXML 4.0)

您可以針對 XSD 結構描述指定範本中的 XPath 查詢,藉以針對註解式結構描述指定查詢來擷取資料庫中的資料。

<sql:xpath-query> 元素可讓您針對註解式結構描述所定義的 XML 檢視,指定 XPath 查詢。藉以執行 XPath 查詢的註解式結構描述會使用 <sql:xpath-query> 元素的 mapping-schema 屬性識別。

範本是包含一或多個查詢的有效 XML 文件。FOR XML 和 XPath 查詢會傳回文件片段。範本對於文件片段就像是容器一樣;因此,範本會提供一種方式來指定單一的上層元素。

本主題中的範例會使用範本,針對註解式結構描述指定 XPath 查詢來擷取資料庫中的資料。

例如,請考慮下列註解式結構描述:

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
            xmlns:sql="urn:schemas-microsoft-com:mapping-schema">
  <xsd:element name="Person.Person" >
     <xsd:complexType>
       <xsd:attribute name="BusinessEntityID" type="xsd:string" /> 
       <xsd:attribute name="FirstName" type="xsd:string" /> 
       <xsd:attribute name="LastName"  type="xsd:string" /> 
     </xsd:complexType>
  </xsd:element>
</xsd:schema>

基於圖解用途,此 XSD 結構描述會以檔案名稱 Schema2.xml 儲存。接著,您可以針對註解式結構描述,在下列範本檔 (Schema2T.xml) 中指定 XPath 查詢:

<sql:xpath-query 
     xmlns:sql="urn:schemas-microsoft-com:xmlsql"
     >
          Person.Person[@BusinessEntityID="1"]
</sql:xpath-query>

然後,您可以建立及使用 SQLXML 4.0 測試指令碼 (Sqlxml4test.vbs),將查詢當做範本檔的一部分執行。如需詳細資訊,請參閱<使用 ADO 執行 SQLXML 4.0 查詢>。

使用內嵌的對應結構描述

註解式結構描述可以直接包含在範本中,接著就可以針對內嵌的結構描述指定範本中的 XPath 查詢。範本也可以是一個 Updategram。

一個範本可以包含多個內嵌結構描述。若要使用包含在範本中的內嵌結構描述,利用 <xsd:schema> 元素的唯一值來指定 id 屬性,然後使用 #idvalue 來參考內嵌結構描述。id 屬性在行為上與 XDR 結構描述中使用的 sql:id ({urn:schemas-microsoft-com:xml-sql}id) 相同。如需詳細資訊,請參閱<在查詢中使用註解式 XDR 結構描述 (在 SQLXML 4.0 中已被取代)>。

例如,下列範本指定兩個內嵌的註解式結構描述:

<ROOT xmlns:sql='urn:schemas-microsoft-com:xml-sql'>
<xsd:schema xmlns:xsd='http://www.w3.org/2001/XMLSchema'
        xmlns:ms='urn:schemas-microsoft-com:mapping-schema'
        id='InLineSchema1' sql:is-mapping-schema='1'>
  <xsd:element name='Employees' ms:relation='HumanResources.Employee'>
    <xsd:complexType>
      <xsd:attribute name='LoginID' 
                     type='xsd:string'/>
      <xsd:attribute name='JobTitle' 
                     type='xsd:string'/>
    </xsd:complexType>
  </xsd:element>
</xsd:schema>

<xsd:schema xmlns:xsd='http://www.w3.org/2001/XMLSchema'
        xmlns:ms='urn:schemas-microsoft-com:mapping-schema'
        id='InLineSchema2' sql:is-mapping-schema='1'>
  <xsd:element name='Persons' ms:relation='Person.Person'>
    <xsd:complexType>

      <xsd:attribute name='BusinessEntityID' 
                     type='xsd:string' />
      <xsd:attribute name='FirstName' 
                     type='xsd:string' />
      <xsd:attribute name='LastName' 
                     type='xsd:string' />
    </xsd:complexType>
  </xsd:element>
</xsd:schema>

<sql:xpath-query xmlns:sql='urn:schemas-microsoft-com:xml-sql' 
        mapping-schema='#InLineSchema1'>
    /Employees[@LoginID='adventure-works\guy1']
</sql:xpath-query>

<sql:xpath-query xmlns:sql='urn:schemas-microsoft-com:xml-sql' 
        mapping-schema='#InLineSchema2'>
    /Persons[@BusinessEntityID='1']
</sql:xpath-query>
</ROOT>

範本也會指定兩個 XPath 查詢。每個 <xpath-query> 元素都會藉由指定 mapping-schema 屬性,唯一地識別對應結構描述。

當您在範本中指定內嵌的結構描述時,也必須在 <xsd:schema> 元素上指定 sql:is-mapping-schema 註解。sql:is-mapping-schema 會接受布林值 (0 = false,1 = true)。包含 sql:is-mapping-schema="1" 的內嵌結構描述會視為內嵌的註解式結構描述,而且不會在 XML 文件中傳回。

sql:is-mapping-schema 註解屬於範本命名空間 urn:schemas-microsoft-com:xml-sql。

若要測試此範例,將範本 (InlineSchemaTemplate.xml) 儲存在本機目錄中,然後建立及使用 SQLXML 4.0 測試指令碼 (Sqlxml4test.vbs) 來執行範本。如需詳細資訊,請參閱<使用 ADO 執行 SQLXML 4.0 查詢>。

除了在範本 (其中包含 XPath 查詢) 的 <sql:xpath-query> 元素上,或在 Updategram 的 <updg:sync> 元素上指定 mapping-schema 屬性之外,您還可以執行下列操作:

  • 在範本的 <ROOT> 元素 (全域宣告) 上指定 mapping-schema 屬性。接著,這個對應結構描述會變成沒有明確 mapping-schema 註解之所有 XPath 和 Updategram 節點使用的預設結構描述。

  • 使用 ADO Command 物件指定 mapping schema 屬性。

<xpath-query><updg:sync> 元素上指定的 mapping-schema 屬性優先順序最高;ADO Command 物件的優先順序則最低。

請注意,如果您在範本中指定 XPath 查詢,而且沒有指定藉以執行 XPath 查詢的對應結構描述,則會將 XPath 查詢視為 dbobject 類型查詢。例如,假設有以下的範本:

<sql:xpath-query 
     xmlns:sql="urn:schemas-microsoft-com:xmlsql">
          Production.ProductPhoto[@ProductPhotoID='100']/@LargePhoto
</sql:xpath-query>

此範本會指定一個 XPath 查詢,但不會指定對應結構描述。因此,此查詢會視為 dbobject 類型查詢,其中 Production.ProductPhoto是資料表名稱,而 @ProductPhotoID='100' 是尋找 ID 值為 100 之產品相片的述詞。@LargePhoto 是從中擷取值的資料行。