У меня есть таблица, которая может выводить любое количество различных столбцов (от 'Level1' до 'Level'N).
Мне нужно выполнить левое соединение для каждого из этих динамических столбцов с CTE
Я написал следующий скрипт, но получаю эту ошибку:
Msg102, уровень 15, состояние 1, строка 15 Неверный синтаксис рядом с «10».
Для устранения неполадок я попытался удалить каждую из переменных в CTE, но безуспешно.
Любая помощь будет высоко ценится!
DECLARE @rel varchar(4) = CAST('X112' AS varchar(4))
DECLARE @todaysdate date = CONVERT(date,GETDATE())
--create cte
DECLARE @sqltext varchar(MAX) =
' WITH CTE AS
(
SELECT
ID
,STARTDATE
,ENDDATE
,NEWID
FROM Tbl
WHERE TYPE = ''' + @rel + '''
AND ENDDATE >= ' + CAST(@todaysdate AS varchar(30)) +' AND STARTDATE <= ' + CAST(@todaysdate AS varchar(30)) +'
)
SELECT ID, NEWID, Level';
--find max lvl, convert to str
DECLARE @counter int = (SELECT MAX(lvl) FROM tbl2)
DECLARE @counterstring varchar(3)
SET @counterstring = CAST(@counter AS varchar(3))
WHILE @counter != 0
BEGIN
SET @sqltext = @sqltext + @counterstring + ' INTO tbl3 '
+ ' FROM tbl2 a '
+ ' LEFT JOIN CTE c ON a.Level' + @counterstring + ' = c.NEWID'
SET @counter = @counter - 1
END
EXEC(@sqltext)
--edited version
DECLARE @rel varchar(4) = CAST('X112' AS varchar(4))
DECLARE @todaysdate date = CONVERT(date,GETDATE())
DECLARE @sqltext varchar(MAX) =
' WITH CTE AS
(
SELECT
ID
,STARTDATE
,ENDDATE AS mgmt_ENDDA
,NEWID
FROM tbl
WHERE SUBTY = ''' + @rel + '''
AND ENDDATE >= ' + CAST(@todaysdate AS varchar(30)) +' AND STARTDATE <= ' + CAST(@todaysdate AS varchar(30)) +'
)
INSERT INTO tbl3
SELECT ID, NEWID, Level';
DECLARE @counter int = (SELECT MAX(lvl) FROM tbl2)
DECLARE @counterstring varchar(3)
WHILE @counter != 0
BEGIN
SET @counterstring = CAST(@counter AS varchar(3))
SET @sqltext = @sqltext + @counterstring
+ ' FROM tbl2 a '
+ ' LEFT JOIN CTE c ON a.Level' + @counterstring + ' = c.NEWID'
SET @counter = @counter - 1
END
EXEC(@sqltext)