首页 > 解决方案 > 从两个临时表 INSERT INTO

问题描述

我有 2 个临时表,每个表都有数据。

我想使用两个临时表中的数据在真实表中插入数据

我只是尝试了类似的方法,但无法正常工作!

INSERT INTO list_'+CONVERT(VARCHAR,@listid)+'.dbo.members_optout_snapshot(listid,optout,nbreEmail,nbreSMS,date_snapshot)
SELECT listid, optout, nbEmail, date FROM #tmpOptout
UNION ALL
SELECT listid, optout, nbSMS, date FROM #tmpOptoutSMS

谢谢您的帮助 !

标签: sqlsql-server

解决方案


您不能将变量用作对象名称的一部分或替换。例如,以下失败:

DECLARE @object sysname = N'Columns';
SELECT *
FROM sys.@object;

您需要使用动态 SQL:

DECLARE @object sysname = N'Columns';
DECLARE @SQL nvarchar(MAX);
SET @SQL = N'SELECT * FROM sys.' + QUOTENAME(@object) + N';';
EXEC sp_executesql @SQL;

对于您所拥有的,这将意味着:

DECLARE @SQL nvarchar(MAX);
SET @SQL = N'
INSERT INTO ' + QUOTENAME('list_' + CONVERT(varchar(10),@listid))  + N'.dbo.members_optout_snapshot (listid,
                                                optout,
                                                nbreEmail,
                                                nbreSMS,
                                                date_snapshot)
SELECT listid,
       optout,
       nbEmail,
       date
FROM #tmpOptout
UNION ALL
SELECT listid,
       optout,
       nbSMS,
       date
FROM #tmpOptoutSMS;';
PRINT @SQL; --Your Best friend
EXEC sp_executesql @SQL;

注 1:这是未经测试的。使用你最好的朋友来帮助你调试。

注意2:不要声明varchar没有长度的a!我已经猜到varchar(10)这里了。

注 3:这是基于 OP 的原始不完整问题。Squirrel 注意到INSERTandSELECT子句中的列数不匹配(分别为 5 和 4 列);因此这个查询仍然会失败。不过,我并没有解决这一点,因为我要回答的问题是关于原始格式的,并且 OP 似乎正在尝试使用变量作为对象名称。我将离开松鼠来解决他在回答中注意到的问题。


推荐阅读