有条件地使用TSQL创建存储过程

时间:2013-09-30 07:10:33

标签: sql sql-server-2008 tsql

我正在编写db更新脚本,它基本上从数据库中检索当前版本号,然后在版本有效时创建一些存储过程。如果当前版本与预期版本不匹配,则应跳过执行代码。

但是当我编写脚本时遇到问题因为CREATE PROCEDURE必须是批处理中的第一个语句,所以我不可能在create procedure语句之前插入if .. else语句。

我也尝试过使用GOTO,但无济于事,因为GOTO并没有跨越多个批次。同样的事情适用于RETURN和RAISEERROR - 其余的代码仍将执行。

示例脚本:

IF @Version = '1.0' --doesn't work
BEGIN
    CREATE PROCEDURE dbo.uspCreateAccount
    AS BEGIN
    --The rest of the code goes here
    END
END

任何人都可以对此提供一些见解吗?

2 个答案:

答案 0 :(得分:4)

您可以使用exec在新范围内运行SQL命令。即使dbo.YourProc已存在,以下代码段也会运行,因为exec()中的SQL命令在这种情况下永远不会被解析。

if not exists (select * from sys.procedures where name = 'YourProc')
    exec ('create procedure dbo.YourProc as select 1 as a')
go
alter procedure dbo.YourProc
as
select ...

如果该过程不存在,则此构造将创建一个空存根过程。如果该过程存在,则运行alter。因此,它保留了对程序授予的权利。

答案 1 :(得分:4)

您可以使用exec功能完成此操作。

IF @Version = '1.0'
BEGIN
    --Drop it if it already exists
    IF OBJECT_ID('uspCreateAccount', 'P') IS NOT NULL
        EXEC ('DROP PROCEDURE uspCreateAccount')
    --Recreate it.
    EXEC('
          CREATE PROCEDURE uspCreateAccount
          AS BEGIN
          --The rest of the code goes here
          END
    ')
END
相关问题