如何在SQL Server中有条件地创建存储过程?

时间:2020-03-05 18:51:08  来源:igfitidea点击:

作为集成策略的一部分,我运行了一些SQL脚本来更新数据库。所有这些脚本要做的第一件事就是检查它们是否需要运行,例如:

if @version <> @expects
    begin
        declare @error varchar(100);
        set @error = 'Invalid version. Your version is ' + convert(varchar, @version) + '. This script expects version ' + convert(varchar, @expects) + '.';
        raiserror(@error, 10, 1);
    end
else
    begin
        ...sql statements here...
    end

很棒!除非我需要添加存储过程。 " create proc"命令必须是一批sql命令中的唯一命令。在我的IF语句中放入" create proc"会导致此错误:

'CREATE/ALTER PROCEDURE' must be the first statement in a query batch.

哎哟!如何将CREATE PROC命令放入脚本中,并仅在需要时才执行?

解决方案

回答

这是我想出的:

将其包装在EXEC()中,如下所示:

if @version <> @expects
    begin
        ...snip...
    end
else
    begin
        exec('CREATE PROC MyProc AS SELECT ''Victory!''');
    end

奇迹般有效!

回答

但是请注意存储过程中的单引号,需要通过添加第二个单引号来对其进行"转义"。第一个答案已经做到了,但是以防万一我们错过了它。一个年轻球员的陷阱。

回答

对数据库进行版本控制是一种方法,但是...为什么有条件地创建存储过程。对于视图,存储过程,函数,只需有条件地删除它们,然后每次都重新创建它们即可。如果我们有条件地创建,那么我们将不会清除存在问题的数据库或者另一名开发人员(我们或者我永远不会这样做)在两年前遭受的黑客入侵,他确信他会记得删除一次紧急更新。

回答

我必须承认,我通常会同意@Peter,我有条件地删除然后每次无条件地重新创建。过去,我试图对数据库之间的架构差异(无论有无版本控制)进行第二次猜测时,已经陷入了太多次。

话虽如此,我们自己的建议@Josh非常酷。当然很有趣。 :-)

回答

删除和创建的问题是我们丢失了以前应用于删除对象的任何安全授权。

回答

IF NOT EXISTS(SELECT * FROM sys.procedures WHERE name = 'pr_MyStoredProc')
BEGIN

     CREATE PROCEDURE pr_MyStoredProc AS .....
     SET NOCOUNT ON
END

ALTER PROC pr_MyStoredProc
AS
SELECT * FROM tb_MyTable

回答

在T-SQL中使用"存在"命令查看存储的proc是否存在。如果是这样,请使用"更改",否则请使用"创建"