SQL Server 变量给我单例错误

Ken*_*Lam 3 xml sql-server-2008

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>
Run Code Online (Sandbox Code Playgroud)

我想选择所有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
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

XQuery [autodeals.AssignmentDistribution.value()]:“value()”需要单例(或空序列),找到“xdt:untypedAtomic *”类型的操作数

但是,如果我用静态数字 1、2、3、4 ..... 替换 SQL 变量,它将正确显示结果。

有人可以告诉我我做错了什么吗?

谢谢

har*_*r07 5

这可能是因为sql:variable()return 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
Run Code Online (Sandbox Code Playgroud)