首页 > 解决方案 > 用表的所有行都具有从值和到值替换列

问题描述

给定一个 c 列和一个包含 a 和 b 列的表,我希望获得以下信息:

  1. 替换(c,a1,b1)
  2. 替换(c,a2,b2)
  3. 替换(c,a3,b3)
  4. ...

我当前具有预期结果的解决方案:

DECLARE @replacemap VARCHAR(MAX) = '\\\\test\\test,\\\\success\\success;\\\\test2\\test2,\\\\success\\success;';

DECLARE @delim_val VARCHAR(1) = ',';
DECLARE @delim_line VARCHAR(1) = ';';
DECLARE @sql_xml XML = Cast('<root><U>'+ Replace(@replacemap, @delim_line, '</U><U>')+ '</U></root>' AS XML);
DECLARE @replaceTable TABLE(from_value VARCHAR(MAX), to_value VARCHAR(MAX))

INSERT INTO @replaceTable (from_value, to_value)
SELECT 
    X.Y.value('(U)[1]', 'VARCHAR(40)') AS from_value,
    X.Y.value('(U)[2]', 'VARCHAR(40)') AS to_value
FROM
(
SELECT Cast('<root><U>'+ Replace(f.x.value('.', 'VARCHAR(MAX)'), @delim_val, '</U><U>')+ '</U></root>' AS XML) AS xml_
FROM @sql_xml.nodes('/root/U') f(x)
WHERE f.x.value('.', 'VARCHAR(MAX)') <> ''
)T
OUTER APPLY T.xml_.nodes('root') as X(Y)

DECLARE @testTable TABLE(test_values VARCHAR(MAX));
INSERT INTO @testTable (test_values)
VALUES
    ('\\\\test\\test'),
    ('\\\\test2\\test2'),
    ('Leavemealone')

DECLARE @currFrom NVARCHAR(MAX);
DECLARE @currTo NVARCHAR(MAX);

DECLARE cursor_replace CURSOR
FOR SELECT from_value, to_value
FROM @replaceTable

OPEN cursor_replace

FETCH NEXT FROM cursor_replace INTO
    @currFrom, @currTo;

WHILE @@FETCH_STATUS = 0
    BEGIN
        UPDATE @testTable SET test_values = REPLACE(test_values, @currFrom, @currTo)
        FETCH NEXT FROM cursor_replace INTO
        @currFrom, @currTo;
    END
CLOSE cursor_replace
DEALLOCATE cursor_replace

select * from @testTable

我想知道 CURSOR 是否可以避免。此外,也许您可​​以找到一种更简洁的方法来从输入 @replacemap(设置格式)创建表 @replaceTable。

标签: sqlreplace

解决方案


推荐阅读