假设我们有简单的表T1,它有三列:
CREATE TABLE T1(C1 INT PRIMARY KEY, C2 VARCHAR(20), C3 XML)
现在我们创建简单的数据:
INSERT INTO T1 VALUES(1, 'Test', '<Element></Element>')
然后我想修改第三列来实现这样的目标:
<Element>Test</Element>
这意味着,C2被插入到XML中。
所以我想用变量做到这一点:
DECLARE @test VARCHAR(20) = 'Example'
UPDATE
T1
SET
@test = C2,
C3.modify('
replace value of
(/Element/text())[1]
with sql:variable("@test") ')
不幸的是结果是:
<Element>Example</Element>
我做错了什么?
答案 0 :(得分:2)
您正在使用它的同一语句中修改基础变量;这在SQL Server中不起作用。之一:
将变量赋值和用法拆分为两个单独的语句:
DECLARE @test VARCHAR(20);
select @test = t.C2
from T1 t;
UPDATE t SET C3.modify('
replace value of (/Element/text())[1] with sql:variable("@test")
')
from T1 t;
OR
直接使用列的值:
UPDATE t SET C3.modify('
replace value of (/Element/text())[1] with sql:column("t.C2")
')
from T1 t;
除非您在变量值计算背后有一些复杂的逻辑,否则由于性能原因,第二个选项是首选 - 您只需触摸一次表,而不是两次。此外,如果您需要更新超过1行,每个行都有不同的值,强烈建议使用第二个变体。