2012-03-20 18 views
0

我正在使用SQL Server 2008r2。如何基于SQL Server中的标志创建连续的行值字符串

这里就是我试图完成:

我有设计的表:

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 

旗帜在第二表格代表第一个表格中标志的按位组合(例如标志= 3是'坏数据'和'坏标头',标志= 6是'坏标题'和'未知错误')。

我想,这将产生以下的查询:

ID ConcatText 
____________________________ 
500 'No Error' 
501 'Bad Data, Bad Header' 
502 'Unknown error' 
504 'Bad Header, Unknown error' 
550 'No Error' 

什么是实现这一目标而无需使用用户定义的函数,或用户定义的存储过程的最佳方式?

感谢您的任何帮助。

+0

是否有原因使用按位操作而不是创建真正的映射表(501 | 1和501 | 2而不是501 | 3)。这通常会产生更大的可维护性问题。此外,它可能会增加不必要的复杂性,因为您正在运行。 – 2012-03-20 04:30:56

+0

有两个原因。首先,这是我得到处理的,其次,我很好奇这是如何最好地完成的。谢谢。 – Sako73 2012-03-20 04:39:32

回答

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; 
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 
相关问题