在下面的动态sql中,我试图检查临时表(#Table)是否已经存在,如果没有,则使用其他表创建。
但是我的问题是无论IF条件中的值是什么,我总是得到select语句的错误,它在if条件中
数据库中已经有一个名为'#Table'的对象。
下面是sql代码。
declare @sqlstring varchar(max)
set @sqlstring=N'
select * into #Table from mst_country
if(object_id(''tempdb..#Table'') is null)
begin
select * into #Table from mst_country_bkp
end'
exec(@sqlstring)
任何人都可以告诉我们为什么会这样吗?
答案 0 :(得分:3)
完成查询后,您需要删除临时表:
declare @sqlstring varchar(max)
set @sqlstring=N'
IF OBJECT_ID(''tempdb.dbo.#Table'', ''U'') IS NOT NULL
DROP TABLE #Table;
select * into #Table from mst_country
if(object_id(''tempdb..#Table'') is null)
begin
select * into #Table from mst_country_bkp
end'
exec(@sqlstring)
修改强>
问题是你不能在同一个sql语句中有两个SELECT INTO。 This is a leftover from SQL 6.5 which did not have deferred name resolution.试试这个:
declare @sqlstring varchar(max)
set @sqlstring=N'
IF OBJECT_ID(''tempdb.dbo.#Table'', ''U'') IS NOT NULL
DROP TABLE #Table;
select * into #Table from mst_country
insert into #Table(col1,col2,....)
select col1,col2,.... from mst_country_bkp
end'
exec(@sqlstring)
答案 1 :(得分:2)
编译sqlserver时,不允许在同一作用域中创建两次相同的临时表。你实际上可以像这样欺骗sqlserver,所以它没有意识到临时表已经创建了:
declare @sqlstring varchar(max)
set @sqlstring=N'
exec(''select * into #Table from mst_country'')
if(object_id(''tempdb..#Table'') is null)
select * into #Table from mst_country_bkp
'
exec(@sqlstring)