Share via


query() 方法 (xml 資料類型)

針對 xml 資料類型的執行個體指定 XQuery。結果為 xml 類型。該方法會傳回不具類型的 XML 執行個體。

語法

query ('XQuery')

引數

  • XQuery
    是字串類型的 XQuery 運算式,可查詢 XML 執行個體中如元素、屬性等 XML 節點。

範例

此節提供一些使用 xml 資料類型的 query() 方法之範例。

A. 針對 xml 類型變數使用 query() 方法

下列範例可宣告 xml 類型的 @myDoc 變數並指派 XML 執行個體給它。query() 方法可用以指定針對文件的 XQuery。

查詢會擷取 <ProductDescription> 元素的 <Features> 子元素:

declare @myDoc xml
set @myDoc = '<Root>
<ProductDescription ProductID="1" ProductName="Road Bike">
<Features>
  <Warranty>1 year parts and labor</Warranty>
  <Maintenance>3 year parts and labor extended maintenance is available</Maintenance>
</Features>
</ProductDescription>
</Root>'
SELECT @myDoc.query('/Root/ProductDescription/Features')

以下是結果:

<Features>
  <Warranty>1 year parts and labor</Warranty>
  <Maintenance>3 year parts and labor extended maintenance is available</Maintenance>
</Features>      

B. 使用針對 XML 類型資料行的 query() 方法

在下列查詢中,query() 方法是用以指定 XQuery,以針對 AdventureWorks 資料庫中 xml 類型的 CatalogDescription 資料行進行查詢:

SELECT CatalogDescription.query('
declare namespace PD="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";
<Product ProductModelID="{ /PD:ProductDescription[1]/@ProductModelID }" />
') as Result
FROM Production.ProductModel
where CatalogDescription.exist('
declare namespace PD="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";
declare namespace wm="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelWarrAndMain";
     /PD:ProductDescription/PD:Features/wm:Warranty ') = 1

請注意下列項目是從上一個查詢而來:

  • CatalogDescription 資料行是具類型的 xml 資料行。這表示該資料行具有關聯的結構描述集合。在 XQuery 初構中,namespace 關鍵字是用以定義在查詢主體中稍後可用的前置詞。

  • query() 方法會建構 XML、具有 ProductModelID 屬性的 <Product> 元素,其中 ProductModelID 屬性值是從資料庫擷取而來。如需 XML 建構的詳細資訊,請參閱<XML 建構 (XQuery)>。

  • 在 WHERE 子句中的 exist() 方法 (XML 資料類型) 可用以只尋找 XML 中包含 <Warranty> 元素的資料列。namespace 關鍵字也是用以定義兩個命名空間的前置詞。

以下是部份結果:

<Product ProductModelID="19"/> 
<Product ProductModelID="23"/> 
...

注意 query() 與 exist() 方法兩個都會宣告 PD 前置詞。在此情況下,您可以使用 WITH XMLNAMESPACES 先定義前置詞並在查詢中使用它。

WITH XMLNAMESPACES (
   'https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription' AS PD,
   'https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelWarrAndMain' AS wm)
SELECT CatalogDescription.query('
<Product ProductModelID="{ /PD:ProductDescription[1]/@ProductModelID }" />
') as Result
FROM Production.ProductModel
where CatalogDescription.exist('
     /PD:ProductDescription/PD:Features/wm:Warranty ') = 1