sql:column() 函數 (XQuery)

如<在 XML 資料中繫結關聯式資料>主題中所述,您可以在使用 XML 資料類型方法來公開 XQuery 內的關聯值時,使用 sql:column(() 函數。

例如,query() 方法 (XML 資料類型) 是用以指定針對儲存在 xml 類型的變數或資料行中之 XML 執行個體的查詢。有時,您可能會想要讓查詢使用另一個非 XML 資料行的值,以同時查詢關聯式資料與 XML 資料。若要這麼做,您可以使用 sql:column() 函數。

SQL 值將會對應到一個相對應的 XQuery 值,且其類型會是等同於相對應 SQL 類型的 XQuery 基底類型。

語法

sql:column("columnName")

備註

請注意在 XQuery 內的 sql:column() 函數中所指定的資料行參考,將會參考所處理之資料列中的資料行。

在 SQL Server 中,您只能參考 XML-DML 插入陳述式之來源運算式內容中的 xml 執行個體,否則您將無法參考 xml 類型或 CLR 使用者定義類型的資料行。

在 JOIN 作業中不支援 sql:column() 函數。可改為使用 APPLY 作業。

範例

A. 使用 sql:column() 來擷取 XML 內的關聯式值

在建構 XML 時,下列範例說明如何擷取非 XML 關聯式資料行的值,以繫結 XML 與關聯式資料。

此查詢建構具有下列格式的 XML:

<Product ProductID="771" ProductName="Mountain-100 Silver, 38" ProductPrice="3399.99" ProductModelID="19" 
  ProductModelName="Mountain 100" />

請注意在建構 XML 中的下列項目:

  • ProductIDProductNameProductPrice 屬性值是從 Product 資料表所取得。

  • ProductModelID 屬性值是從 ProductModel 資料表所擷取。

  • 為了使查詢更有趣,將從 xml 類型的 CatalogDescription 資料行擷取 ProductModelName 屬性值。由於並非所有的產品型號都有儲存 XML 產品型號目錄資訊,因此 if 陳述式可用以擷取存在的值。

    SELECT P.ProductID, CatalogDescription.query('
    declare namespace pd="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";
           <Product 
               ProductID=       "{ sql:column("P.ProductID") }"
               ProductName=     "{ sql:column("P.Name") }"
               ProductPrice=    "{ sql:column("P.ListPrice") }"
               ProductModelID= "{ sql:column("PM.ProductModelID") }" >
               { if (not(empty(/pd:ProductDescription))) then
                 attribute ProductModelName { /pd:ProductDescription[1]/@ProductModelName }
                else 
                   ()
    }
            </Product>
    ') as Result
    FROM Production.ProductModel PM, Production.Product P
    WHERE PM.ProductModelID = P.ProductModelID
    AND   CatalogDescription is not NULL
    ORDER By PM.ProductModelID
    

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

  • 因為值是從兩個不同的資料表擷取而來,所以 FROM 子句會指定兩個資料表。WHERE 子句中的條件會篩選結果,並只擷取產品型號含有目錄描述的產品。

  • XQuery 初構中的 namespace 關鍵字定義了可用於查詢主體中的 XML 命名空間前置詞 "pd"。請注意資料表別名 "P" 與 "PM" 是定義在查詢本身的 FROM 子句中。

  • sql:column() 函數可用以提取 XML 內的非 XML 值。

以下是部份結果:

ProductID               Result
-----------------------------------------------------------------
771         <Product ProductID="771"                   ProductName="Mountain-100 Silver, 38" 
                  ProductPrice="3399.99" ProductModelID="19" 
                  ProductModelName="Mountain 100" />
...

下列查詢建構了包含產品特定資訊的 XML。此資訊包含隸屬於特定產品型號 ProductModelID=19 的所有產品之 ProductID、ProductName、ProductPrice 以及 ProductModelName (如果有的話)。接著會將 XML 指派給 xml 類型的 @x 變數。

declare @x xml
SELECT @x = CatalogDescription.query('
declare namespace pd="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";
       <Product 
           ProductID=       "{ sql:column("P.ProductID") }"
           ProductName=     "{ sql:column("P.Name") }"
           ProductPrice=    "{ sql:column("P.ListPrice") }"
           ProductModelID= "{ sql:column("PM.ProductModelID") }" >
           { if (not(empty(/pd:ProductDescription))) then
             attribute ProductModelName { /pd:ProductDescription[1]/@ProductModelName }
            else 
               ()
}
        </Product>
') 
FROM Production.ProductModel PM, Production.Product P
WHERE PM.ProductModelID = P.ProductModelID
And P.ProductModelID = 19
select @x