如何基于SQL Server中的标志创建连续的行值字符串

时间:2012-03-20 04:26:48

标签: sql sql-server sql-server-2008 tsql

我正在使用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'

在不使用用户定义的函数或用户定义的存储过程的情况下实现此目的的最佳方法是什么?

感谢您的帮助。

3 个答案:

答案 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 APPLYFOR_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