【问题标题】:SQL XQuery - The argument 1 of the XML data type method "modify" must be a string literalSQL XQuery - XML 数据类型方法“修改”的参数 1 必须是字符串文字
【发布时间】:2020-10-09 00:00:33
【问题描述】:

我有如下的sn-p 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-server xquery string-literals


    【解决方案1】:
    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;
    

    【讨论】:

      猜你喜欢
      • 2020-04-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-07
      • 2018-11-18
      • 2022-08-21
      • 2023-02-14
      • 2021-06-02
      相关资源
      最近更新 更多