我试图将一些节点附加到数据库中的现有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>
如何更新查询以返回每个参数的所有值?谢谢!
答案 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
。