更新时间: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