使用IF在SQL Server中创建表时出错

时间:2015-12-03 22:15:07

标签: sql-server-2008

尝试创建proc时出现以下错误:

  

Msg 2714,Level 16,State 1,Procedure create_table_test,Line 11
  数据库中已经有一个名为'#tmp'的对象。

该过程基于IF语句创建临时表,但SQL Server无法识别创建表语句是否在IF中,并且只会执行一个。任何“干净”的方式?

create procedure [dbo].[create_table_test]
AS
BEGIN
    set nocount on

    if 1=1
        create table #tmp (field1 int)
    else
        create table #tmp (field1 varchar(10))
end

2 个答案:

答案 0 :(得分:0)

如果您乐意使用全局临时表,则可以将表的创建分配到两个触发器。这样,SQL Parser就不会感到困惑。

create procedure [dbo].[create_tmpint]
AS
BEGIN

    set nocount on
    create table ##tmp (field1 int)

end
go


drop procedure create_tmpvar
go
create procedure [dbo].[create_tmpvar]
AS
BEGIN

    set nocount on
    create table ##tmp (field1 varchar(10))

end
go

drop procedure create_table_test
go
create procedure [dbo].[create_table_test]
AS
BEGIN

    set nocount on

    if 1=1 begin
        exec [dbo].[create_tmpint]  
    end    
    else 
        exec [dbo].[create_tmpvar]  


    insert into ##tmp values(1)

    select * from ##tmp

end
go

如果你运行exec [dbo].[create_table_test],你将获得返回的值。

答案 1 :(得分:0)

您可以使用此代码:

CREATE TABLE #tmp (tempColumn int)

IF 1=1
    ALTER TABLE #tmp ADD field1 int
ELSE
    ALTER TABLE #tmp ADD field1 varchar(10)

ALTER TABLE #tmp DROP COLUMN tempColumn