我正在使用SQL Server 2008r2。
这是我想要完成的事情:
我有一张设计表:
Flag Text
________________________
0 'No Error'
1 'Bad Data'
2 'Bad Header'
4 'Unknown error'
我的第二张表是设计的:
ID Flags
_______________________
500 0
501 3
502 4
504 6
550 0
第二个表中的标志表示第一个表中标志的按位组合(例如Flags = 3是'Bad Data'和'Bad Header',Flags = 6是'Bad Header'和'Unknown error')
我想要一个会产生以下内容的查询:
ID ConcatText
____________________________
500 'No Error'
501 'Bad Data, Bad Header'
502 'Unknown error'
504 'Bad Header, Unknown error'
550 'No Error'
在不使用用户定义的函数或用户定义的存储过程的情况下实现此目的的最佳方法是什么?
感谢您的帮助。
答案 0 :(得分:2)
This article确切地解释了如何实现这一目标。它将它一步一步地组合在一起,以便您了解正在发生的事情。它基本上结合了SQL中的按位运算符,然后其余的完成类似于hkf发布的。希望这对你有帮助:))
我相信这将转化为:
SELECT a.id,
REPLACE(REPLACE(REPLACE(
(
SELECT TEXT
FROM FlagTable AS b
WHERE a.flags & b.flag <> 0
ORDER BY b.text FOR XML Raw
)
, '"/><row value="', ', '), '<row value="', ''), '"/>', '')
AS 'attributes'
FROM FlagMappingTable AS a
ORDER BY a.id;
答案 1 :(得分:0)
您需要CROSS APPLY
和FOR_XML_PATH()
请参阅Simulating group_concat MySQL function in Microsoft SQL Server 2005?
答案 2 :(得分:0)
哦,我喜欢按位,真的,不是讽刺。我认为这是最简单的。你有CTE可用,我说用它们! 试试这个。我借用Concatenate many rows into a single text string?借用我自己的连接方式来借位。 *我为错误道歉,这是未经测试并用记事本写的。
WITH lines AS
(
SELECT
row_number() over(order by ID) lineid,
FlagMap.ID
, Flag.Text AS ConcatText
FROM
FlagMap
LEFT JOIN
Flags
ON FlagMap.Flags & Flags.Flag = Flags.Flag
OR (FlagMap.Flags = 0 AND Flag.Flag = 0)
),
result_lines AS
(
SELECT
lineid,
cast(ConcatText as nvarchar(max)) ConcatText
FROM
lines
WHERE
lineid = 1
UNION ALL
SELECT
l.lineid,
cast(r.ConcatText + N', ' + l.ConcatText AS nvarchar(max))
FROM
lines l
INNER JOIN
result_lines r
on
l.lineid = r.lineid + 1
)
SELECT
ID
, ConcatText
FROM
result_lines
ORDER BY
ID DESC