且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

SQL Server 中的长路径 xquery

更新时间:2022-11-28 18:19:41

如果你用可变路径查询xml实例,你可以试试动态sql:

If you query xml instance with variable path, you may try dynamic sql:

DECLARE @s-s-rXML xml = ...

DECLARE @sql nvarchar(max), @params nvarchar(max), @p1 VARCHAR(MAX)
set @params = '@s-s-rXML xml';

set @p1 = 'variable1';
set @sql = 'SELECT @s-s-rXML.query(''root/' + @p1 + ''')'
exec sp_executesql @sql, @params, @s-s-rXML

set @p1 = 'variable1/variable2';
set @sql = 'SELECT @s-s-rXML.query(''root/' + @p1 + ''')'
exec sp_executesql @sql, @params, @s-s-rXML

或者你可以尝试递归遍历xml实例元素,然后根据路径选择必要的:

Or you may try recursively walk xml instance elements and then select necessary based on path:

DECLARE @s-s-rXML xml = ...

declare @p1 varchar(max)
set @p1 = 'variable1/variable2'

;with cte (path, el) as (
    select t.c.value('local-name(.)', 'varchar(max)'), t.c.query('.')
    from @s-s-rXML.nodes('*') t(c)
    union all
    select cte.path + '/' + t.c.value('local-name(.)', 'varchar(100)'), t.c.query('.')
    from cte
        cross apply el.nodes('*[1]/*') t(c)
)
select el
from cte
where path = 'root/' + @p1