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
这会经过我的记录,看起来像下面这样:
现在,如果我要搜索标签的东西,贝宝它应该当分区位于数据列上时返回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>
答
我认为这是做你想要什么:
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')
基本上,它通过订单数据标签,生成一个统一的表格,然后加入你的原始查询到...
在你想要的输出''中''测试'从哪里来?无法在原始输出中的任何地方看到它...... –