[英]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條建議給你
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.