Sql server 在SQL Server中使用变量更新xml

Sql server 在SQL Server中使用变量更新xml,sql-server,xml,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>Example</Element> 示例 我做错了什么?您正在使用同一语句修改基础变量;这在SQL Serv

假设我们有一个简单的表T1,它有三列:

CREATE TABLE T1(C1 INT PRIMARY KEY, C2 VARCHAR(20), C3 XML)
现在我们创建简单的数据:

INSERT INTO T1 VALUES(1, 'Test', '<Element></Element>')
不幸的是,结果是:

<Element>Example</Element>
示例

我做错了什么?

您正在使用同一语句修改基础变量;这在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; 

直接使用列的值:

UPDATE t SET C3.modify('
  replace value of (/Element/text())[1] with sql:column("t.C2")
  ')
from T1 t;

除非变量值计算背后有一些复杂的逻辑,否则出于性能原因,第二个选项是首选的-您只需触摸表一次,而不是两次。另外,如果您需要更新超过1行,则强烈建议使用第二个变量,每个行具有不同的值。

看起来您正在同时更新和设置变量,因此更新使用原始值(执行
update
时的值)。这就是我要查找的。你能告诉我怎么才能像你说的那样使用两个独立的语句吗?
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; 
UPDATE t SET C3.modify('
  replace value of (/Element/text())[1] with sql:column("t.C2")
  ')
from T1 t;