在xquery中修改sql server xml元素名称变量

时间:2014-01-09 02:44:28

标签: sql xml xquery

我需要元素的名称也是变量(是程序的参数)

而不是这个,哪个工作正常:

DECLARE @VAR VARCHAR(5)
SET @VAR = 'false'
UPDATE CURVES
  SET CURVEENTITY.modify(
    'replace value of (/ElementName/text())[1] with  sql:variable("@VAR")') 
  WHERE ID = 3

但我想要这样的事情:

DECLARE @VAR VARCHAR(5)
DECLARE @VAR2 VARCHAR(20)
SET @VAR = 'false'
SET @VAR2 = 'ElementName'
UPDATE CURVES
  SET CURVEENTITY.modify(
    'replace value of (/sql:variable("@VAR2")/text())[1] with sql:variable("@VAR")') 
  WHERE ID = 3

但它不起作用!我怎么能这样做?

2 个答案:

答案 0 :(得分:7)

您可以在谓词中使用local-name()来查找要修改的节点。

declare @var2 varchar(50) = 'ElementName'
declare @var varchar(50) = 'false'

update CURVES
set CURVEENTITY.modify('replace value of ((*[local-name() = sql:variable("@var2")]/text())[1]) 
                        with sql:variable("@var")')
where ID = 3

答案 1 :(得分:2)

AFAIK你无法使用xquery中的/sql:variable动态地动态组合路径 - 你可以将路径构建为字符串然后使用动态sql来执行它(在这种情况下你可以像很好地替代sql:variables)。

e.g。

DECLARE @sql NVARCHAR(MAX);
SET @sql = N'UPDATE CURVES
            SET CURVEENTITY.modify(''replace value of (/' + @var2 
                     + '/text())[1] with "' + @var + '"'') 
            WHERE ID = 3';
exec sp_executesql @sql;            

SQL Fiddle here