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
这就是我想要的。如果该过程不存在,请创建它,然后更改正确的代码。如果该过程确实存在,则创建失败,并且alter使用新代码更新代码。
它为管理员创建了一个不同的问题,因为如果存储过程已经存在,则create会引发误导性错误。当然,当你想要的结果出现时你不应该看到红色错误文本,这会产生误导。
有没有人有办法压制红色文字?我尝试过的所有内容都会导致“创建/更改过程必须是查询批处理中的第一个语句”错误。
答案 0 :(得分: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
答案 1 :(得分: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
')
注意:
答案 2 :(得分:5)
最后,SQL Server实现了与Create或Replace等效的等效日期。他们的等价物是“创造或改变”。从SQL Server 2016 SP1开始提供此功能。用法示例:
use [myDatabase]
go
Create or Alter procedure myProcedure as
begin
-- procedure code here
end
go