2

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

但是,当我编写脚本时遇到了一个问题,因为 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

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

4

2 回答 2

4

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

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。因此,它保留了已授予该程序的权利。

于 2013-09-30T07:12:57.427 回答
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
于 2013-09-30T07:14:48.717 回答