TSQL将逗号分隔的数字列表转换为逗号分隔的另一个表中的名称列表

时间:2014-03-19 15:30:37

标签: tsql common-table-expression

我有一个报告定义表,其中包含要使用的逗号分隔的列号列表。然后是一个列信息表。我需要在给定报告ID的情况下取回逗号分隔的列名列表:

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的sproc中完成了它,但我认为它应该可以在涉及递归CTE的单个语句中实现,但无法理解它。任何例子都非常感谢!

1 个答案:

答案 0 :(得分: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