从两个临时表中插入

时间:2018-10-18 08:57:48

标签: sql sql-server

我有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

感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

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

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!我猜这里varchar(10)

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

答案 1 :(得分:0)

您需要创建一个变量

declare @query varchar(MAX)='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'

execute( @query)