我得到錯誤
SELECT INTO 陳述句不能包含將值分配給變數的 SELECT 陳述句
當我在 Microsoft SQL Server 2016 上運行以下代碼行時。我試圖使用這些代碼從服務器查詢多個表(后綴為“EY_RCMTxn_20”),然后將合并結果命名為#RCMTxn。我能夠查詢多個表,但未能將其命名為#RCMTxn。
如何解決此錯誤?
DROP TABLE IF EXISTS #RCMTxn
DECLARE @sql VARCHAR(MAX)
SET @sql = ''
SELECT @sql = @sql '
UNION ALL
SELECT * FROM [' name ']'
INTO #RCMTxn
FROM sys.tables
WHERE name LIKE '%EY_RCMTxn_20%'
SET @sql = STUFF(@sql,1,15,'')
EXEC(@sql)
我使用@Charlieface 建議的以下腳本在外部創建了一個名為#RCMTxn 的本地臨時表,并在動態SQL 中使用它。但是,我無法將資料插入臨時表。運行腳本時出現“752277 行受影響”,但運行“SELECT * FROM #RCMTxn”時回傳零行。
DROP TABLE IF EXISTS #RCMTxn;
CREATE TABLE #RCMTxn(
MemberAccountNo VARCHAR(8),
CardHolderNo VARCHAR(2),
ActivityDate Date,
Clubhouse NVARCHAR(255),
Complex NVARCHAR(255)
)
DECLARE @sep nvarchar(100) = '
UNION ALL
';
DECLARE @sql nvarchar(max) = '
SELECT *
INTO #RCMTxn
FROM (
'
STUFF((
SELECT @sep 'SELECT * FROM ' QUOTENAME(name) '
'
FROM sys.tables
WHERE name LIKE '%EY_RCMTxn_20%'
FOR XML PATH(''), TYPE
).value('text()[1]','nvarchar(max)'), 1, LEN(@sep), '')
'
) t;
';
EXEC sp_executesql @sql;
SELECT * FROM #RCMTxn
uj5u.com熱心網友回復:
看起來你想要INTO里面的動態 SQL。
還:
- 您需要正確轉義表名
- 用于
nvarchar(max)動態 SQL - 不要
SET @var =用于聚合。使用STRING_AGG或FOR XML聚合。
DROP TABLE IF EXISTS #RCMTxn;
DECLARE @sql nvarchar(max) = '
SELECT *
INTO #RCMTxn
FROM (
'
(
SELECT STRING_AGG(
'SELECT * FROM ' QUOTENAME(name), '
UNION ALL
' )
FROM sys.tables
WHERE name LIKE '%EY_RCMTxn_20%'
) '
) t;
';
EXEC sp_executesql @sql;
對于舊版本的 SQL Server,您可以使用以下命令:
DROP TABLE IF EXISTS #RCMTxn;
DECLARE @sep nvarchar(100) = '
UNION ALL
';
DECLARE @sql nvarchar(max) = '
SELECT *
INTO #RCMTxn
FROM (
'
STUFF((
SELECT @sep 'SELECT * FROM ' QUOTENAME(name) '
'
FROM sys.tables
WHERE name LIKE '%EY_RCMTxn_20%'
FOR XML PATH(''), TYPE
).value('text()[1]','nvarchar(max)'), 1, LEN(@sep), '')
'
) t;
';
EXEC sp_executesql @sql;
或者,您可以在外面創建表并執行正常INSERT
DROP TABLE IF EXISTS #RCMTxn;
CREATE TABLE #RMCTxn (Column1 ...);
DECLARE @sep nvarchar(100) = '
UNION ALL
';
DECLARE @sql nvarchar(max) = '
INSERT #RMCTxn (Column1 ...)
'
STUFF((
SELECT @sep 'SELECT * FROM ' QUOTENAME(name) '
'
FROM sys.tables
WHERE name LIKE '%EY_RCMTxn_20%'
FOR XML PATH(''), TYPE
).value('text()[1]','nvarchar(max)'), 1, LEN(@sep), '')
'
;
';
EXEC sp_executesql @sql;
請注意,無論您對臨時表做什么,都可能沒有。
uj5u.com熱心網友回復:
你能把你的作業分成更多的步驟嗎?像這樣:
DROP TABLE IF EXISTS #RCMTxn
DECLARE @sql VARCHAR(MAX);
SET @sql = ''
SELECT @sql = @sql '
UNION ALL
SELECT * FROM [' name ']'
FROM sys.tables
WHERE name LIKE '%EY_RCMTxn_20%';
SET @sql = STUFF(@sql,1,15,'')
SELECT @sql as sql
INTO #RCMTxn;
EXEC(@sql);
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/476858.html
