SQL Server 2008 R2:通过函数从变量查询xml节点

阿卜杜勒·雷曼(Abdul Rehman)说

我有两个单独的具有相同子结构的xml变量。(即,只有根和第一个节点名称不同,其余结构相同。)我想创建一个函数,该函数采用xml变量和根节点的名称,并向我返回一个包含所有项目的表。

这些是我的xml定义(为简洁起见,简称)

declare @CartXml xml
Set @CartXml = ' <carts> 
<cart RefID="1" >

<Item SrNo="1" ProductCode="12" Qty="5">
</Item>

<Item SrNo="2" ProductCode="12" Qty="3">
</Item>
</cart>
</carts> '


declare @ProdXml xml
Set @ProdXml = ' <Products> 
<Product RefID="1" >

<Item SrNo="1" ProductCode="12" Qty="5">
</Item>

<Item SrNo="2" ProductCode="12" Qty="3">
</Item>
</Product>
</Products> '

我可以通过诸如以下语句来查询

 SELECT Hdr.x.value('@RefID', 'varchar(max)') CartID ,
       Det.*
 FROM   @CartXml.nodes('//carts/cart') AS Hdr(x)
 CROSS  APPLY 
          (
           SELECT 
            Det.c.value('@SrNo', 'varchar(max)') SrNo,
            Det.c.value('@ProductCode', 'varchar(max)') ProductCode,
            Det.c.value('@Qty', 'varchar(max)') Qty
            FROM   Hdr.x.nodes('Item') AS Det(c)
           ) Det

在上面的查询中,将// carts / cart替换为// Products / Product,并将@CartXml替换为@ProdXml,将得到相同的输出。

封装在函数中时,此查询不起作用。

Create function fnTempGetprodInfoFromXml( @xml xml, @rootnode varchar(50))
returns table 
as
Return (
 SELECT Hdr.x.value('@RefID', 'varchar(max)') CartID ,
       Det.*
 FROM   @xml.nodes('//*[local-name()=sql:variable("@rootnode")]') AS Hdr(x)
 CROSS  APPLY 
          (
           SELECT 
            Det.c.value('@SrNo', 'varchar(max)') SrNo,
            Det.c.value('@ProductCode', 'varchar(max)') ProductCode,
            Det.c.value('@Qty', 'varchar(max)') Qty
            FROM   Hdr.x.nodes('Item') AS Det(c)
           ) Det
)
Go


--These Dont Work
Select * from fnTempGetprodInfoFromXml(@cartxml,'carts/cart')
Select * from fnTempGetprodInfoFromXml(@ProdXml,'Products/Product')

我觉得将node变量传递给函数中的xml.nodes时存在一些问题。我希望我可以传递'// carts / cart'而不是'carts / cart',但是函数不能编译。

这是功能所需的输出。

CartID  SrNo ProductCode    Qty
1       1     12            5
1       2     12            3

提前致谢。

加雷斯

您不能将参数传递给nodes函数,它必须是字符串文字。

您的选择是稍微修改您的函数以接受修剪后的XML:

CREATE FUNCTION fnTempGetprodInfoFromXml (@xml XML)
RETURNS TABLE
AS
RETURN
(   SELECT  Det.c.value('@SrNo', 'varchar(max)') AS SrNo,
            Det.c.value('@ProductCode', 'varchar(max)') AS ProductCode,
            Det.c.value('@Qty', 'varchar(max)') AS Qty
    FROM    @xml.nodes('*/*/Item') AS Det(c)

);

然后稍微改一下

DECLARE @Xml XML
SET @Xml = '<carts><cart RefID="1" ><Item SrNo="1" ProductCode="12" Qty="5">
            </Item><Item SrNo="2" ProductCode="12" Qty="3"></Item></cart></carts>';

 SELECT Hdr.x.value('@RefID', 'varchar(max)') CartID ,
        Det.*
 FROM   @Xml.nodes('//carts/cart') AS Hdr (x)
        CROSS APPLY fnTempGetprodInfoFromXml(x.query('*')) AS Det;

或者,如果您想更通用,则可以使函数使用通配符返回第二级的所有项目,例如

DECLARE @Xml XML
SET @Xml = '<carts><cart RefID="1" ><Item SrNo="1" ProductCode="12" Qty="5">
            </Item><Item SrNo="2" ProductCode="12" Qty="3"></Item></cart></carts>';

SELECT  Hdr.x.value('@RefID', 'varchar(max)') CartID ,
        Det.*
FROM    @xml.nodes('*/*') AS Hdr(x)
        CROSS APPLY
        (   SELECT  Det.c.value('@SrNo', 'varchar(max)') AS SrNo,
                    Det.c.value('@ProductCode', 'varchar(max)') AS ProductCode,
                    Det.c.value('@Qty', 'varchar(max)') AS Qty
            FROM    hdr.x.nodes('Item') AS Det(c)
        ) Det;

除此之外,您还必须使用动态SQL,这意味着您无法使用函数。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在SQL Server 2008 R2中查询复杂的XML

来自分类Dev

节点JS和SQL Server 2008 R2 Express

来自分类Dev

SQL Server 2008 R2:查询性能

来自分类Dev

SQL Server 2008 R2:调整查询

来自分类Dev

SQL Server 2008 R2:递归查询

来自分类Dev

从2008 R2创建SQL Server 2008备份

来自分类Dev

使用SQL Server 2008 R2在数据透视表查询中的聚合函数

来自分类Dev

查询SQL Server 2008 R2 XML数据类型的最简单方法?

来自分类Dev

SQL Server 2008 R2:从 SQL Server 查询 MS Access

来自分类Dev

日期类型为空的SQL Server 2016 Convert函数与SQL Server 2008 R2不同

来自分类Dev

通过OPENXML SQL Server 2008解析XML

来自分类Dev

如何使用SQL查询在SQL SERVER 2008 R2中获得表定义?

来自分类Dev

SQL Server 2008 R2使用SQL查询引用表的聚集索引

来自分类Dev

GETDATE()函数SQL Server 2008 R2与Windows Server时间有所不同

来自分类Dev

SQL Server 2008 R2中的NULL相等

来自分类Dev

SQL Server 2008 R2中奇怪的CAST()行为

来自分类Dev

Dapper读取SqlHierachyId列(SQL Server 2008 R2)

来自分类Dev

连接行值SQL Server 2008 R2

来自分类Dev

替换SQL Server 2008 R2中的游标

来自分类Dev

连续数字-SQL Server 2008 R2

来自分类Dev

SQL Server 2008 R2不使用分配的内存

来自分类Dev

与分组等效的LAG / LEAD(SQL Server 2008 R2)

来自分类Dev

无法连接到SQL Server 2008 R2

来自分类Dev

SQL Server 2008 R2的Try_Convert

来自分类Dev

转义字符SQL Server 2008 R2 [%]

来自分类Dev

无法在SQL Server 2008 R2中设置条件

来自分类Dev

SQL Server 2008 R2触发器位置

来自分类Dev

SQL Server 2008 R2:数据透视表

来自分类Dev

在SQL Server 2008 R2中插入几何值