XQuery 扩展函数 - sql:variable()

适用于:SQL Server

显示在 XQuery 表达式中包含 SQL 关系值的变量。

语法

  
sql:variable("variableName") as xdt:anyAtomicType?  

备注

如在 XML 内绑定关系数据主题中所述,使用 XML 数据类型方法 在 XQuery 中公开关系值时,可以使用此函数。

例如, query () 方法 用于指定针对 XML 数据类型变量或列中存储的 XML 实例的查询。 有时,你可能还希望查询使用 Transact-SQL 变量或参数中的值来将关系数据和 XML 数据组合在一起。 为此,请使用 sql:variable 函数。

SQL 值将映射到相应的 XQuery 值,其类型将是等效于相应 SQL 类型的 XQuery 基类型。

只能在 XML-DML insert 语句的源表达式上下文中引用 xml 实例;否则,不能引用类型为 xml 或公共语言运行时的值, (CLR) 用户定义类型。

示例

A. 使用 sql:variable() 函数将 Transact-SQL 变量值放到 XML 中

以下示例构造由下列值组成的 XML 实例:

  • 非 XML 列中的值 (ProductID)。 sql:column () 函数用于在 XML 中绑定此值。

  • 另一个表中非 XML 列中的值 (ListPrice)。 同样,sql:column() 用于在 XML 中绑定此值。

  • 从 Transact-SQL 变量 () 的值 DiscountPricesql:variable() 方法用于将此值绑定到 XML。

  • 值 (ProductModelNamexml 类型列中) ,使查询更有趣。

以下是查询语句:

DECLARE @price money  
  
SET @price=2500.00  
SELECT ProductID, Production.ProductModel.ProductModelID,CatalogDescription.query('  
declare namespace pd="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";  
  
       <Product   
           ProductID="{ sql:column("Production.Product.ProductID") }"  
           ProductModelID= "{ sql:column("Production.Product.ProductModelID") }"  
           ProductModelName="{/pd:ProductDescription[1]/@ProductModelName }"  
           ListPrice="{ sql:column("Production.Product.ListPrice") }"  
           DiscountPrice="{ sql:variable("@price") }"  
        />')   
FROM Production.Product   
JOIN Production.ProductModel  
ON Production.Product.ProductModelID = Production.ProductModel.ProductModelID  
WHERE ProductID=771  

请注意上述查询的以下方面:

  • query() 方法中的 XQuery 构造 XML。

  • 关键字namespace用于在 XQuery Prolog中定义命名空间前缀。 执行此操作的原因为 ProductModelName 属性值是从 CatalogDescription xml 类型列(具有与其关联的架构)中检索的。

结果如下:

<Product ProductID="771" ProductModelID="19"   
         ProductModelName="Mountain 100"   
         ListPrice="3399.99" DiscountPrice="2500" />  

另请参阅

SQL Server XQuery 扩展函数
类型化的 XML 与非类型化的 XML 的比较
XML 数据 (SQL Server)
创建 XML 数据的实例
xml 数据类型方法
XML 数据修改语言 (XML DML)