结合XML参数

时间:2014-01-09 00:00:59

标签: xml sql-server-2008 tsql xquery

我需要一些XML查询帮助 我想知道如何将多行数据合并为一行 对于我的问题:(当前查询)

SELECT 
    Name = Paravalue.value('Name[1]', 'VARCHAR(250)'),
    Value = Paravalue.value('Value[1]', 'VARCHAR(250)')
FROM (
        SELECT CONVERT(XML,Parameters) as ParameterXML FROM ReportServer.dbo.Subscriptions WHERE SubscriptionID = 'Test'
     ) a
CROSS APPLY ParameterXML.nodes('/ParameterValues/ParameterValue') p ( Paravalue )

结果:

  Name                   Value
1 IncludeNotSubmitted    True
2 EndDate                NULL
3 StartDate              NULL

我想要的结果是:

  Parameter Values               
1 IncludeNotSubmitted: True  EndDate: NULL StartDate: NULL

任何人都可以指出我正确的方向吗?

2009年1月编辑: 错过了包含实际的XML

<ParameterValues>
<ParameterValue>
<Name>IncludeNotSubmitted</Name>
<Value>True</Value>
</ParameterValue>
<ParameterValue>
<Name>EndDate</Name>
</ParameterValue>
<ParameterValue>
<Name>StartDate</Name
</ParameterValue>
</ParameterValues>

2 个答案:

答案 0 :(得分:0)

您是否尝试在单个查询中完成此操作?如果没有,您可以将xml查询的结果插入到表值变量中,然后使用表值变量的所有行填充变量,如下所示:

--make a table valued variable
declare @sample table (
    Id int identity(1,1),
    Name varchar(50),
    Value varchar(50)
)

--put some test data in it
--here you would select using you xml query from your post
insert @sample (Name, Value)
select 'IncludeNotSubmitted', 'True'
union all
select 'EndDate', null
union all
select 'StartDate', null

--we're going to store the combined values in this variable
declare @combinedString varchar(max) = ''
select @combinedString = @combinedString + Name + ':' + isnull(Value, 'NULL') + '   ' 
from @sample

select @combinedString

--results:
-- IncludeNotSubmitted:True   EndDate:NULL   StartDate:NULL   

答案 1 :(得分:0)

您可以使用公用表表达式 FOR XML PATH 在单个查询中解决此问题:

;WITH cte AS
(
    SELECT 
        Name = Paravalue.value('@Name[1]', 'VARCHAR(250)'),
        Value = Paravalue.value('@Value[1]', 'VARCHAR(250)'),
        SubscriptionID
    FROM (
            SELECT CONVERT(XML,[Parameters]) as ParameterXML, SubscriptionID FROM ReportServer.dbo.Subscriptions WHERE SubscriptionID = 'Test'
         ) a
    CROSS APPLY ParameterXML.nodes('/ParameterValues/ParameterValue') p ( Paravalue )
)
SELECT  STUFF((select ', ' + Name + ': ' + value as [text()]
        FROM cte xt
        WHERE xt.SubscriptionID = t.SubscriptionID
        FOR XML PATH('')), 1, 2, '')
FROM cte t
GROUP BY SubscriptionID

我假设参数字段中的XML数据如下所示:

<ParameterValues>
    <ParameterValue Name="IncludeNotSubmitted" Value="True" />
    <ParameterValue Name="StartDate" Value="null" />
    <ParameterValue Name="EndDate" Value="null" />
</ParameterValues>