sql:column() 函数 (XQuery)
如主题在 XML 内部绑定关系数据中所述,当使用 XML 数据类型方法在 XQuery 内显示关系值时,可以使用 sql:column(() 函数。
例如,使用 query() 方法(XML 数据类型)对存储在变量或 xml 类型列中的 XML 实例指定查询。有时,您可能还希望查询使用其他非 XML 列中的值同时引入关系数据和 XML 数据。若要达到此目的,请使用 sql:column() 函数。
SQL 值将映射到相应的 XQuery 值,其类型将为 XQuery 基类型,等效于相应的 SQL 类型。
语法
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 中的下列内容:
从 Product 表中获取的 ProductID、ProductName和 ProductPrice 属性值。
从 ProductModel 表中检索的 ProductModelID 属性值。
若要使查询更加有趣,可以从 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 Prolog 中的关键字 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。此信息包括 ProductID、ProductName、ProductPrice 以及属于特定产品型号 (ProductModelID=19) 的所有产品的 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