sql-server - 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 ?'
我只想遍历元素并替换值,但这似乎比我预期的要困难得多。
任何帮助是极大的赞赏!
解决方案
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;
推荐阅读
- javascript - 我无法显示来自本地 API 的数据
- php - 如何展示孩子
- sql - 如果结果为真,则返回列名
- c# - SqlDataAdapter.SelectCommand 没有返回正确的结果
- spring-boot-data-geode - 在@EnableClusterDefinedRegions 之后将@Resource 用于Geode 区域
- material-components-android - 当用户从 NestedScrollView 中启动拖动时,BottomSheet 没有拖动阈值
- ajax - Sails.js 中未触发 Ajax 表单操作
- mysql - MySQL 不准确的计算与平均和日期时间
- python - 来自 GMAIL 编码问题的 Python IMAP
- ios - 应用程序在使用 Xcode 11.3.1 构建后打开时崩溃