Присоединяйтесь, используя динамические имена столбцов SQL Server - PullRequest
0 голосов
/ 29 марта 2019

У меня есть таблица, которая может выводить любое количество различных столбцов (от '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)


Ответы [ 2 ]

0 голосов
/ 29 марта 2019

Можете ли вы изменить это так и попробовать еще раз?

--edited version
DECLARE @rel varchar(4) = CAST('A012' 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';

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 + CHAR(10) +'SELECT ID, NEWID, Level'+@counterstring

        SET @sqltext = @sqltext + ' FROM tbl2 a '
                                + ' LEFT JOIN CTE c ON a.Level' + @counterstring + ' = c.NEWID'

        SET @counter = @counter - 1

        IF @counter <> 0
            SET @sqltext = @sqltext + CHAR(10) + ' UNION '


END

EXEC(@sqltext)

Вы можете попробовать «UNION ALL» вместо «UNION», если вы не хотите избавляться от дубликатов данных. Надеюсь, это поможет

0 голосов
/ 29 марта 2019

Так как select * into запрос создает новую таблицу каждый раз, я предполагаю, что вы пытаетесь создать 'n' количество таблиц для 'n' уровней, с результатом, полученным объединением с n-ным столбцом.У меня есть 2 предложения для вас

  1. Поместите запрос выбора в цикл while и добавьте ';'в конце цикла, чтобы разделить запросы выбора.
  2. вместо INTO tbl3 используйте INTO tbl + @counterstring как select * into, чтобы создать новую таблицу

Надеюсь, это поможет вам

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...