问题描述
最近刚开始使用XQuery。我正在编写可以更新任意XML文档的T-SQL代码。用户输入的XPath定义要更新的节点(例如:// nodename)。该代码对现有的节点数据进行了一些转换(假设它增加了100)。
我有一个使用.modify()进行迭代的XQuery解决方案,但是它看起来很慢(需要定期运行数百万个XML文档),并且使用动态SQL来处理用户输入的任意XPath。
我不禁感到有一种更优雅,更高效的方法。
CREATE PROCEDURE dbo.ModifyXML
@var_xpath VARCHAR(max),@var_rec XML,@new_xml XML OUTPUT
AS
SET NOCOUNT ON
DECLARE @sql_matches NVARCHAR(max);
DECLARE @sql_modify NVARCHAR(max);
DECLARE @sql_get_new NVARCHAR(max);
DECLARE @new_value INTEGER;
DECLARE @i INTEGER;
SET @sql_modify = N'';
SET @new_xml = @var_rec
SET @i = 1;
-- Get original data value in the first node
SET @sql_get_new = N'SET @new_value = dbo.my_transform(@xml.value(N''(' + @var_xpath + '/text())[1]'',''INTEGER''));';
EXECUTE sp_executesql @sql_get_new,N'@xml XML,@new_value INTEGER OUTPUT',@xml = @var_rec,@new_value = @new_value OUTPUT;
WHILE @new_value is not NULL
BEGIN
-- Replace the original value with the new value in the XML.
-- This is a dynamic SQL string and is appended to the previous one,... to be executed once the loop exits
SET @sql_modify = @sql_modify + N'SET @new_xml.modify(''replace value of (' + @var_xpath + '/text())[' + CAST(@i AS NVARCHAR(max)) +'] with "' + CAST(@new_value AS NVARCHAR(max)) + '"'');';
-- Next match
SET @i = @i + 1;
-- Create masked value from original
SET @sql_get_new = N'SET @new_value = dbo.my_transform(@xml.value(N''(' + @var_xpath + '/text())[' + CAST(@i AS NVARCHAR(max)) + ']'',''INTEGER''));';
EXECUTE sp_executesql @sql_get_new,@new_value = @new_value OUTPUT;
END
-- Execute the accumulated dynamic SQL modification queries
IF @sql_modify <> '' EXECUTE sp_executesql @sql_modify,N'@new_xml XML OUTPUT',@new_xml = @new_xml OUTPUT;
GO
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)