sql - 用表的所有行都具有从值和到值替换列
问题描述
给定一个 c 列和一个包含 a 和 b 列的表,我希望获得以下信息:
- 替换(c,a1,b1)
- 替换(c,a2,b2)
- 替换(c,a3,b3)
- ...
我当前具有预期结果的解决方案:
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。
解决方案
推荐阅读
- reactjs - 收到错误:键入'[null,Dispatch
>]' 不能分配给打字稿反应 - ruby-on-rails - active_storage_drag_and_drop 在 Rails 上不起作用 - 错误:拒绝委托给附件,但附件为零
- slickgrid - 在运行时添加单元格格式
- ios - 如何从 Objective-C 类访问 Swift 类?
- node.js - 解决 mongoose 中的 OverwriteModelError
- python - 尝试使用 python 从 azure 函数触发 url,错误地说“没有 $return 绑定返回非无值”
- excel - 如何比较两个excel表格列表?
- javascript - 如何计算Jquery中孩子的水平
- javascript - 使用角度或javascript附加零的逗号分隔数字
- azure - Why azure-active-directory-spring-boot-starter needs access to Microsoft?