如果条件不能在动态sql内部工作

时间:2015-10-28 09:09:49

标签: sql sql-server dynamicquery

在下面的动态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)

任何人都可以告诉我们为什么会这样吗?

2 个答案:

答案 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)