我在表格中有XML
列,其结构如下
<md xmlns="http://www.intellipayment.com" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<dist>
<ml>
<S>368.72</S>
<src>26249201</src>
<t>26249202</t>
</ml>
<ml>
....
</ml>
</dist>
</md>
我想选择所有src并逐个执行操作。
所以我的SQL语句是:
while @i <= @xmlCount
begin
select
@CurrentSrc = AssignmentDistribution.value('(/*:md/*:dist/*:ml/*:src/text())[sql:variable("@i")]', 'varchar(50)')
from
table
where
id = 1234
set @i = @i + 1
end
我收到此错误:
XQuery [autodeals.AssignmentDistribution.value()]:'value()'需要单例(或空序列),找到类型为'xdt:untypedAtomic *'的操作数
但是,如果我用静态数字1,2,3,4替换SQL变量,它会正确显示结果。
有人可以告诉我我做错了吗?
由于
答案 0 :(得分:3)
这可能是因为sql:variable()
返回xdt:anyAtomicType
,我不确定。但这是一种可能的替代方法,首先使用query()
,不强制只返回单例,然后使用varchar(50)
函数将返回值转换为value()
:
select @CurrentSrc = AssignmentDistribution
.query('(/*:md/*:dist/*:ml/*:src/text())[sql:variable("@i")]')
.value('.', 'varchar(50)')
FROM table where id = 1234
答案 1 :(得分:1)
如果您在src
电话中使用此方法,则无需手动执行任何循环操作 - 您将;WITH XMLNAMESPACES(DEFAULT 'http://www.intellipayment.com'),
SrcFromXml AS
(
SELECT
Id,
Src = XC.value('(src)[1]', 'int')
FROM
table
CROSS APPLY
AssignmentDistribution.nodes('/md/dist/ml') AS XT(XC)
)
SELECT *
FROM SrcFromXml
值视为一个漂亮的关系数据集,并且您可以操作他们......
canvas.toSVG({width: '1120mm', height: '841mm'});