我有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
感谢您的帮助!
答案 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已经注意到INSERT
和SELECT
子句中的列数不匹配(分别为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)