2012-03-20 20 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 
相關問題