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 表中获取的 ProductIDProductNameProductPrice 属性值。

  • 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