2014-03-19 29 views
0

我有一個報表定義表,其中列表號爲的列號爲的逗號分隔列表將被使用。然後有一個列信息表。我要回去時給定的報告ID 列名逗號分隔的列表:TSQL將逗號分隔的數字列表轉換爲以逗號分隔的另一個表格的名稱列表

create table #Reports (ID int, Title varchar(100), ColumnNumbers varchar(100)) 
insert #Reports values (1, 'My Report Title', '1,3') 

create table #ReportColumnMaping (ColumnNumber int, ColumnName varchar(100)) 
insert #ReportColumnMaping values (1, 'Column1') 
insert #ReportColumnMaping values (2, 'Column2') 
insert #ReportColumnMaping values (3, 'Column3') 

我需要回到列的標題和列表報告ID = 1,其採用Col1中& COL3:

'My Report Title', 'Column1, Column3' 

我已經在動態SQL的存儲過程中完成了它,但我認爲它應該可以在涉及遞歸CTE的單個語句中進行,但無法讓我的頭部繞過它。任何例子非常感謝!

回答

0

希望這可以幫助,它可能有一些功能,你不需要它,它並沒有讓你100%。

CREATE FUNCTION [dbo].[fnSplit] (@sep char(1), @source varchar(1000)) 
    RETURNS table 
    AS 
    RETURN (
     WITH Lines(LineNumber, BeginPos, EndPos) AS (
      SELECT 1, 1, CHARINDEX(@sep, @source) 
      UNION ALL 
      SELECT LineNumber + 1, EndPos + 1, CHARINDEX(@sep, @source, EndPos + 1) 
      FROM Lines 
      WHERE EndPos > 0 
     ) 
     SELECT LineNumber, 
      RTRIM(LTRIM(SUBSTRING(@source, BeginPos, CASE WHEN EndPos > 0 THEN EndPos-BeginPos ELSE 1000 END))) AS result 
     FROM Lines 
    ) 

則...

SELECT r.Title, c.ColumnName 
FROM #Reports r 
    CROSS APPLY [dbo].[fnSplit](',', r.ColumnNumbers) s 
    INNER JOIN #ReportColumnMaping c ON c.ColumnNumber = s.result