共用方式為


XQuery 初構

XQuery 查詢是由初構及主體所組成。XQuery 初構是一系列的宣告和定義,由這二者共同建立查詢處理所需的環境。在 SQL Server 中,XQuery 初構可以包含命名空間宣告。XQuery 主體則由一系列的運算式所組成,可指定所想要得到的查詢結果。

例如,以下 XQuery 是針對將製造指示儲存成 XML 之 xml 類型的 Instructions 資料行所指定。該查詢會擷取工作中心位置 10 的製造指示。xml 資料類型的 query() 方法則用來指定 XQuery。

SELECT Instructions.query('declare namespace AWMI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";         
    /AWMI:root/AWMI:Location[@LocationID=10]
') AS Result 
FROM  Production.ProductModel
WHERE ProductModelID=7

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

  • XQuery 初構包含命名空間前置詞 (AWMI) 宣告: (namespace AWMI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";。

  • declare namespace 關鍵字定義稍後要用在查詢主體中的命名空間前置詞。

  • /AWMI:root/AWMI:Location[@LocationID="10"] 則是查詢主體。

命名空間宣告

命名空間宣告會定義前置詞,並將其與命名空間 URI 產生關聯,如下列查詢所示。在該查詢中,CatalogDescription 是 xml 類型資料行。

針對此資料行指定 XQuery 時,查詢初構指定了 declare namespace 宣告,使前置詞 PD (產品描述) 與命名空間 URI 產生關聯。接著,在查詢主體中使用這個前置詞來代替命名空間 URI。所產生 XML 中的節點,就會位在與該命名空間 URI 相關聯的命名空間中。

SELECT CatalogDescription.query('
declare namespace PD="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";
         /PD:ProductDescription/PD:Summary 
    ') as Result
FROM Production.ProductModel
where ProductModelID=19

若要增進查詢的可讀性,您可以使用 WITH XMLNAMESPACES 來宣告命名空間,而不要在查詢初構中使用 declare namespace 來宣告前置詞和命名空間的繫結。

WITH XMLNAMESPACES ('https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription' AS PD)

SELECT CatalogDescription.query('
         /PD:ProductDescription/PD:Summary 
    ') as Result
FROM Production.ProductModel
where ProductModelID=19

如需詳細資訊,請參閱<使用 WITH XMLNAMESPACES 來加入命名空間>。

預設命名空間宣告

除了使用 declare namespace 宣告來宣告命名空間前置詞,您還可以改用 declare default element namespace 宣告,以繫結元素名稱的預設命名空間。在此情況下,您不用指定任何前置詞。

在以下範例中,查詢主體中的路徑運算式並沒有指定命名空間前置詞。依預設,所有元素名稱皆屬於初構中所指定的預設命名空間。

SELECT CatalogDescription.query('
     declare default element namespace  "https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";
        /ProductDescription/Summary 
    ') as Result
FROM  Production.ProductModel
WHERE ProductModelID=19 

您也可以使用 WITH XMLNAMESPACES 來宣告預設命名空間:

WITH XMLNAMESPACES (DEFAULT 'https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription')
SELECT CatalogDescription.query('
        /ProductDescription/Summary 
    ') as Result
FROM  Production.ProductModel
WHERE ProductModelID=19