我有一个报告定义表,其中包含要使用的逗号分隔的列号列表。然后是一个列信息表。我需要在给定报告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的单个语句中实现,但无法理解它。任何例子都非常感谢!
答案 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