分享方式:


模組和初構 - XQuery Prolog

適用於:SQL Server

XQuery 查詢是由初構和本文所組成。 XQuery 初構是一系列宣告和定義,共同建立查詢處理的必要環境。 在 SQL Server 中,XQuery 初構可以包含命名空間宣告。 XQuery 主體是由指定預定查詢結果的運算式序列所組成。

例如,下列 XQuery 是針對 XML 類型的指令資料行所指定,該資料行 會將製造指令儲存為 XML。 查詢會擷取工作中心位置 10 的製造指示。 query()xml 資料類型的 方法可用來指定 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 default element namespace 宣告來系結專案名稱的預設命名空間,而不是使用 declare namespace 宣告來宣告命名空間前置詞。 在此情況下,您不會指定任何前置詞。

在下列範例中,查詢主體中的路徑運算式不會指定命名空間前置詞。 根據預設,所有專案名稱都屬於 prolog 中指定的預設命名空間。

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   

另請參閱

使用 WITH XMLNAMESPACES 將命名空間加入至查詢