使用select into即时创建表

时间:2016-06-01 18:47:21

标签: sql-server sql-server-2012

我正在尝试使用动态SQL用来自多个服务器之一的数据填充临时表,具体取决于声明的变量。源数据将来可能会添加更多列,因此我希望能够根据当前存在的列创建目标临时表,而无需显式定义它。

我尝试使用以下方法创建一个包含相应列的空表:

<leaflet markers={{markers}} />

或者:

Select top 1 * into #tempTable from MyTable
Delete from #tempTable

两者都创建了一个空表,但是当我尝试插入它时:

Select * into #tempTable from MyTable where 1 = 0

我收到此错误:

  

Msg 213,Level 16,State 7,Line 1   列名或提供的值数与表定义不匹配。

declare @sql varchar(max) = 'Select * from ' + case when @server = '1' then 'Server1.' else 'Server2.' end + 'database.dbo.MyTable' Insert into #tempTable exec(@sql) 可以自行运行。即使我在同一台服务器上使用同一个表,我也会收到此错误。这是否可以修复,或者我是否必须返回使用exec(@sql)明确定义表?

2 个答案:

答案 0 :(得分:1)

(感谢有用的评论者@XQbert)

使用仅为ID的列替换临时表中的(Int, Identity)int会导致

Insert into #tempTable
    exec(@sql)

按预期运作。

语法和

declare @sql varchar(max) = 'Insert into #tempTable Select * from ' 
+ case when @server = '1' then 'Server1.' else 'Server2.' end
+ 'database.dbo.MyTable'

exec(@sql)

工作,但使动态sql的insert部分产生了更有用的错误消息以进行故障排除。

答案 1 :(得分:1)

如何使用全局临时表。使用全局临时表有一些缺点,因为它可以从多个用户和数据库进行访问。 ref http://sqlmag.com/t-sql/temporary-tables-local-vs-global

DECLARE @sql nvarchar(max) = 'SELECT * INTO ##tempTable FROM ' 
+ case when @server = '1' THEN 'Server1.' ELSE 'Server2.' END
+ 'database.dbo.MyTable'

EXECUTE sp_executesql (@sql)

SELECT * FROM ##tempTable