我需要元素的名称也是变量(是程序的参数)
而不是这个,哪个工作正常:
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
但它不起作用!我怎么能这样做?
答案 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;