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 中的下列項目:
ProductID、ProductName 及 ProductPrice 屬性值是從 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