2

我正在尝试将一些节点附加到数据库中的现有 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 只返回每个参数的第一个值。我已经在 value 节点上尝试了各种 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>

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

4

1 回答 1

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'). 第一列包含Parameters来自 XML 的所有内容,第二列包含所有新的Parameters.

于 2013-09-12T05:21:01.000 回答