在SQL Server中更新大量XML记录的最佳方法

问题描述

最近刚开始使用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 (将#修改为@)

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...