在SQL Server中选择多个XML节点以附加值

时间:2013-09-11 21:45:28

标签: sql sql-server xml sql-server-2012

我试图将一些节点附加到数据库中的现有XML。 XML如下所示:

<Parameters>
  <Parameter>
    <Name>ColumnsToDisplay</Name>
    <Value>Priority</Value>
    <Value>Description</Value>
    <Value>Asset ID</Value>
  </Parameter>
</Parameters>

每个参数的值数可能不同。我正在尝试通过添加一些新值来更新XML,如下面的查询。它有点不稳定,但这是我可以让FOR XML AUTO工作的唯一方法。

set @NewXML =
(
select * from 
    (
    SELECT  
        Parameter.C.value('Name[1]', 'varchar(256)') as Name,
        Parameter.C.value('Value[1]', 'varchar(256)') AS Value
    FROM tblSavedReportParameters
    CROSS APPLY ParameterXML.nodes('//Parameter') Parameter(C)
    where savedreportid = @SavedReportID
    union 
    select  'FilterType' as Name, '#All' as Value
    union 
    select  'FilterText' as Name, '#All' as value
    ) as Parameter for xml Auto, elements, root('Parameters') 
)

除了新XML只返回每个参数的第一个值之外,一切都很有效。我在值节点上尝试了各种CROSS APPLY和INNER JOINS,但是无法获得语法。它目前看起来像这样:

<Parameters>
  <Parameter>
    <Name>ColumnsToDisplay</Name>
    <Value>Priority</Value>
  </Parameter>
  <Parameter>
    <Name>FilterText</Name>
    <Value>#All</Value>
  </Parameter>
  <Parameter>
    <Name>FilterType</Name>
    <Value>#All</Value>
  </Parameter>
</Parameters>

如何更新查询以返回每个参数的所有值?谢谢!

1 个答案:

答案 0 :(得分:1)

set @NewXML = 
(
  select (
         select T.ParameterXML.query('Parameters/Parameter')
         from tblSavedReportParameters as T
         where T.savedreportid = @SavedReportID 
         ),
         (
         select P.Name, P.Value
         from (
              select 'FilterType' as Name, '#All' as Value
              union all
              select 'FilterText', '#All'
              ) as P
         for xml path('Parameter'), type
         )
  for xml path('Parameters')
)

此查询构建两个XML列,然后使用for xml path('Parameters')进行组合。第一列包含XML中的所有Parameters,第二列包含所有新Parameters

相关问题