如果在sql server中不存在,则创建存储过程

qui*_*ker 20 sql sql-server

Oracle确实"创建或替换"语句.Sql server似乎没有 - 如果你是从Enterprise Manager编写脚本,它反而建议"删除并创建".在您对存储过程进行授权的任何情况下,丢弃和创建都是不可取的,因为它会丢弃您的数据库管理团队所做的任何授权.您真的需要"创建或替换"来帮助开发人员和管理员之间分离conerns.

我最近一直在做的是:

use [myDatabase]
go

create procedure myProcedure as
begin
  print 'placeholder'
end
go

alter procedure myProcedure as
begin
  -- real sproc code here
end
go
Run Code Online (Sandbox Code Playgroud)

这就是我想要的.如果该过程不存在,请创建它,然后更改正确的代码.如果该过程确实存在,则创建失败,并且alter使用新代码更新代码.

它为管理员创建了一个不同的问题,因为如果存储过程已经存在,则create会引发误导性错误.当然,当您想要的结果发生时,您不应该看到红色错误文本,这会产生误导.

有没有人有办法压制红色文字?我尝试过的所有内容都会导致'创建/更改程序必须是查询批处理中的第一个语句'以某种方式出错.

Ric*_*iwi 49

这将有效并保持权限不变:

use [myDatabase]
go
if object_id('dbo.myProcedure', 'p') is null
    exec ('create procedure myProcedure as select 1')
go
alter procedure myProcedure as
SET NOCOUNT ON
  -- real sproc code here. you don't really need BEGIN-END
go
Run Code Online (Sandbox Code Playgroud)


RBa*_*ung 10

像这样:

IF  NOT EXISTS (SELECT * FROM sys.objects 
                WHERE object_id = OBJECT_ID(N'[dbo].[myProcedure]') 
                  AND type in (N'P', N'PC'))
BEGIN
    EXEC('
        create procedure myProcedure as
        begin
            print ''placeholder''
        end
        ')
END

EXEC('
    alter procedure myProcedure as
    begin
      -- real sproc code here
    end
    ')
Run Code Online (Sandbox Code Playgroud)

笔记:

  1. 记得在动态SQL字符串中加倍引号.
  2. 为了便于阅读,我缩进了它,但这也会为您的实际程序列表添加额外的缩进空格.如果您不这样做,那么只需减少动态SQL文本上的缩进级别.


dan*_*ler 5

最后,SQL Server实现了与Create或Replace等效的等效日期.他们的等价物是"创造或改变".从SQL Server 2016 SP1开始提供此功能.用法示例:

use [myDatabase]
go

Create or Alter procedure myProcedure as
begin
  -- procedure code here
end
go
Run Code Online (Sandbox Code Playgroud)