SQL Server变量给我单例错误

时间:2015-12-12 00:50:15

标签: 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>

我想选择所有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变量,它会正确显示结果。

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

由于

2 个答案:

答案 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'});