TSQL查询xml输出

TSQL查询xml输出

问题描述:

我有一个查询,我正在为我的页面上的某些搜索结果运行。该存储过程是这样的:TSQL查询xml输出

BEGIN 
SET NOCOUNT ON; 
BEGIN 
    SELECT * 
    FROM (SELECT id, 
        data, 
        dataType, 
        dataLocation, 
        tag, 
        whoAdded, 
        whenAdded, 
        notes, 
        ROW_NUMBER() OVER (PARTITION BY data ORDER BY whenAdded DESC) AS rn 
      FROM Tags_Accounts 
      WHERE tag IN (SELECT * 
          FROM dbo.splitstring (@tags))) AS a 
    WHERE rn = 1 
    FOR XML PATH ('results'), TYPE, ELEMENTS, ROOT ('root'); 
END 
END 

这会经过我的记录,看起来像下面这样:

enter image description here

现在,如果我要搜索标签的东西,贝宝它应该当分区位于数据列上时返回2个结果。

XML输出为的结果如下:

  <root> 
       <results> 
       <id>43</id> 
       <data>123333</data> 
       <dataType>1</dataType> 
       <dataLocation>AF</dataLocation> 
       <tag>paypal</tag> 
       <whoAdded>chussey</whoAdded> 
       <whenAdded>2013-11-22T11:01:50.117</whenAdded> 
       <rn>1</rn> 
       </results> 
       <results> 
       <id>41</id> 
       <data>12345</data> 
       <dataType>1</dataType> 
       <dataLocation>AF</dataLocation> 
       <tag>paypal</tag> 
       <whoAdded>chussey</whoAdded> 
       <whenAdded>2013-11-22T10:59:39.277</whenAdded> 
       <rn>1</rn> 
       </results> 
       <results> 
       <id>50</id> 
       <data>RGG</data> 
       <dataType>2</dataType> 
       <dataLocation>AF</dataLocation> 
       <tag>stuff</tag> 
       <whoAdded>chussey</whoAdded> 
       <whenAdded>2013-11-22T22:25:41.393</whenAdded> 
       <rn>1</rn> 
       </results> 
      </root> 

它包括在2个结果PayPal作为数据是在数据栏不同。它返回了1条记录,因为数据已经在标签PayPal的结果中找到匹配。

我的问题:有什么办法可以做到现在正在做的事情,但在<Tag></Tag>包括所有与数据列中的数据相匹配的标签?

例如,因为标签stuff与另一个标签Paypal一起被发现,它会将它们包括在一起。

这个目标是找到包含搜索标签的任何数据。如果找到该数据,并且该数据有多个标签,则会包含所有标签。

<results> 
    <id>50</id> 
    <data>RGG</data> 
    <dataType>2</dataType> 
    <dataLocation>AF</dataLocation> 
    <tag>stuff, testing</tag> 
    <whoAdded>chussey</whoAdded> 
    <whenAdded>2013-11-22T22:25:41.393</whenAdded> 
    <rn>1</rn> 
</results> 
+0

在你想要的输出''中''测试'从哪里来?无法在原始输出中的任何地方看到它...... –

我认为这是做你想要什么:

WITH OrderedTags 
AS 
(
    SELECT id, 
      data, 
      dataType, 
      dataLocation, 
      CAST(tag as NVARCHAR(max)) as tag, 
      whoAdded, 
      whenAdded, 
      notes, 
      ROW_NUMBER() OVER (PARTITION BY data ORDER BY tag, id) AS rn 
    FROM Tags_Accounts T 
) 
,RecurseTags (data, tags, rn) 
AS 
(
--Anchor 
    SELECT data, 
      tag as tags, 
      rn 
    FROM OrderedTags T 
    WHERE rn = 1 
    UNION ALL 
--Recurse 
    SELECT R.data, 
      tags + N', ' + tag, 
      T.rn 
    FROM RecurseTags R 
    JOIN OrderedTags T 
     ON T.data = R.data 
     AND T.rn = R.rn + 1 
) 
,CommaSeparatedTags(data, tags) 
AS 
(
    SELECT data, tags 
    FROM 
    (
     SELECT data, 
       tags, 
       ROW_NUMBER() OVER (PARTITION BY data ORDER BY rn DESC) AS rn 
     FROM RecurseTags 
    ) T 
    WHERE rn = 1 
) 
,RequiredRows 
AS 
(
    SELECT * FROM(
    SELECT A.id, 
      A.data, 
      A.dataType, 
      A.dataLocation, 
      C.tags as tag, 
      A.whoAdded, 
      A.whenAdded, 
      A.notes, 
      ROW_NUMBER() OVER (PARTITION BY A.data ORDER BY A.whenAdded DESC) AS rn 
    FROM OrderedTags A 
    JOIN dbo.splitstring (@tags) T 
     ON T.Value = A.tag 
    JOIN CommaSeparatedTags C 
     ON C.data = A.data) A 
    WHERE rn = 1 
) 
SELECT * FROM RequiredRows 
FOR XML PATH ('results'), TYPE, ELEMENTS, ROOT ('root') 

基本上,它通过订单数据标签,生成一个统一的表格,然后加入你的原始查询到...

+0

这看起来不错,我认为它会工作,但我在加入时出现错误“无效的列名'值'” – SBB

+0

通过将其更改为名称代替。这工作完美!我自己从来没有得到过,非常感谢您花时间阅读并提供代码 - 救命! – SBB