XQuery 扩展函数 - sql:column()

适用范围:SQL Server

如主题“绑定关系数据内部 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 insert 语句的源表达式的上下文中引用 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、ProductNameProductPrice 属性值是从 Product 表中获取的

  • ProductModel 表中检索 ProductModelID 属性值。

  • 为了使查询更有趣,ProductModelName 属性值是从 xml 类型的 CatalogDescription 列获取的 由于未存储所有产品型号的 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 中的命名空间关键字定义查询正文中使用的 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 分配给 @x xml 类型的变量

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  

另请参阅

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