使用SQL Server中的变量更新xml

时间:2017-03-16 12:41:35

标签: sql-server xml

假设我们有简单的表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>

我做错了什么?

1 个答案:

答案 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行,每个行都有不同的值,强烈建议使用第二个变体。