首页 > 解决方案 > SQL XQuery - XML 数据类型方法“修改”的参数 1 必须是字符串文字

问题描述

我有以下 SQL 片段:

declare @idx int = 1

while (@idx <= @NumThresholds)
begin
    declare @strIdx nvarchar(100) = convert(varchar(100), @idx)
    declare @xqueryString nvarchar(max) = concat('replace value of (//*:ElecTariffElements/*:ThresholdMatrix/*:Thresholds/*:BlockThreshold/text())[', @strIdx, '] with "0"')
    set @xml.modify(@xqueryString)
    set @idx = @idx + 1
end

我想更新BlockThreshold元素的每个值。

但是我得到了错误:

XML 数据类型方法“modify”的参数 1 必须是字符串文字。

我也尝试过使用sql:variable("@strIdx")类似的东西:

declare @idx int = 1

while (@idx <= @NumThresholds)
begin
    declare @strIdx nvarchar(100) = convert(varchar(100), @idx)
    set @xml.modify('replace value of (//*:ElecTariffElements/*:ThresholdMatrix/*:Thresholds/*:BlockThreshold/text())[sql:variable("@strIdx")] with "0"')
    set @idx = @idx + 1
end

但这然后我得到这个错误:

XQuery [modify()]:只有 'http://www.w3.org/2001/XMLSchema#decimal?'、'http://www.w3.org/2001/XMLSchema#boolean?' 或 'node()*' 表达式允许作为谓词,找到 'xs:string ?'

我只想遍历元素并替换值,但这似乎比我预期的要困难得多。

任何帮助是极大的赞赏!

标签: sql-serverxquerystring-literals

解决方案


declare @xml xml = N'
<ElecTariffElements>
<ThresholdMatrix>
<Thresholds>
<BlockThreshold>1</BlockThreshold>
<BlockThreshold>2</BlockThreshold>
<BlockThreshold>3</BlockThreshold>
<BlockThreshold>4</BlockThreshold>
<BlockThreshold>4</BlockThreshold>
</Thresholds>
</ThresholdMatrix>
</ElecTariffElements>
';


declare @idx int = 1;
declare @NumThresholds int = @xml.value('count(//*:ElecTariffElements/*:ThresholdMatrix/*:Thresholds/*:BlockThreshold)', 'int');
select @NumThresholds, @xml;

while (@idx <= @NumThresholds)
begin
    set @xml.modify('replace value of (//*:ElecTariffElements/*:ThresholdMatrix/*:Thresholds/*:BlockThreshold/text())[sql:variable("@idx")][1] with 0');
    select @xml;
    set @idx = @idx + 1;
end

select @xml;

推荐阅读