我正在编写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
任何人都可以对此提供一些见解吗?
答案 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