我正在尝试使用动态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)
明确定义表?
答案 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