簡體   English   中英

使用動態列名SQL Server加入

[英]Join using dynamic column names SQL Server

我有一個表可以輸出任意數量的不同列(從'Level1'到'Level'N)。

我需要針對CTE在每個動態列上執行左連接

我寫了以下腳本,但一直收到此錯誤:

消息102,級別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)


由於select * into查詢每次創建一個新表,我假設您正在嘗試為'n'個級別創建'n'個表,並通過加入第n列獲得結果。 我有2條建議給你

  1. 在while循環中引入select查詢並追加';' 在循環結束時拆分選擇查詢。
  2. 而不是INTO tbl3使用INTO tbl + @counterstring作為select * into將創建新表

希望這對你有所幫助

你可以像這樣改變它並再試一次嗎?

--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”。 希望這可以幫助

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM