将SQL变量附加到查询中

时间:2018-02-15 06:38:50

标签: sql-server xml

我想将Id(While Counter)附加到我的XML查询中,如您所见:

declare @id int
declare @rejectpart xml 
set @id=0
while  (@id <12)
begin

 select @rejectpart.value('(/Rejectedparameters/parameter/name)[sql:variable("@id")]', 'varchar(max)') 
begin
select 0
end
set @id=@id+1
end

但是当我想运行我的查询时会收到此错误:

XQuery [value()]: 'value()' requires a singleton (or empty sequence), found operand of type 'xdt:untypedAtomic *'

我的输入XML:

<Rejectedparameters>
  <parameter>
    <name>CO</name>
    <value>8.72</value>
  </parameter>
  <parameter>
    <name>CO2</name>
    <value>6.49</value>
  </parameter>
  <parameter>
    <name>HC</name>
    <value>659</value>
  </parameter>
  <parameter>
    <name>O2</name>
    <value>1.5</value>
  </parameter>
  <parameter>
    <name>BackRightBrake</name>
    <value>1.35</value>
  </parameter>
  <parameter>
    <name>BackLeftBrake</name>
    <value>0.63</value>
  </parameter>
  <parameter>
    <name>BackBrake</name>
    <value>53.33</value>
  </parameter>
  <parameter>
    <name>CarBody</name>
    <value>0</value>
  </parameter>
  <parameter>
    <name>SoundStandard</name>
    <value>0</value>
  </parameter>
  <parameter>
    <name>NoSmoke</name>
    <value>0</value>
  </parameter>
</Rejectedparameters>

2 个答案:

答案 0 :(得分:2)

<强>溶液(approach1)

我想这就是你的解决方案应该如何:

select @rejectpart.value('(/Rejectedparameters/parameter/name/@id)[1]', 'varchar(max)')

<强> approach2

虽然我在寻找解决方案,但你期待这样的事吗?运行。这样我就可以更好地了解您的问题。

declare @xmldata xml;
set @xmldata = 
'<Rejectedparameters>
  <parameter>
    <name>CO</name>
    <value>8.72</value>
  </parameter>
  <parameter>
    <name>CO2</name>
    <value>6.49</value>
  </parameter>
  <parameter>
    <name>HC</name>
    <value>659</value>
  </parameter>
  <parameter>
    <name>O2</name>
    <value>1.5</value>
  </parameter>
  <parameter>
    <name>BackRightBrake</name>
    <value>1.35</value>
  </parameter>
  <parameter>
    <name>BackLeftBrake</name>
    <value>0.63</value>
  </parameter>
  <parameter>
    <name>BackBrake</name>
    <value>53.33</value>
  </parameter>
  <parameter>
    <name>CarBody</name>
    <value>0</value>
  </parameter>
  <parameter>
    <name>SoundStandard</name>
    <value>0</value>
  </parameter>
  <parameter>
    <name>NoSmoke</name>
    <value>0</value>
  </parameter>
</Rejectedparameters>'

select 
  pd.value('name[1]','char(11)'),
  pd.value('value[1]','char(11)')
from @xmlData.nodes('//Rejectedparameters/parameter')  as i(pd);

答案 1 :(得分:2)

SQL Server无法确定您的XQuery是否返回单例。您可以将整个表达式包装在(...)[1]中以修复它,因此XQuery变为如下所示:

((/Rejectedparameters/parameter/name)[sql:variable("@id")])[1]

但是嵌套的括号令人困惑,在parameter上设置位置谓词会使它看起来更清晰:

(/Rejectedparameters/parameter[sql:variable("@id")]/name)[1]