DCN*_*YAM 57 sql t-sql sql-server
在创建存储过程,视图,函数等时,最好对对象执行DROP ... CREATE或ALTER吗?
我已经看过许多"标准"文件,说明要做DROP ... CREATE,但我看到了许多提倡ALTER方法的评论和论据.
ALTER方法保留了安全性,而我听说DROP ... CREATE方法在第一次执行时强制重新编译整个SP而不仅仅是一个语句级别的重新编译.
有人可以告诉我,如果使用一个优于另一个有其他优点/缺点吗?
And*_*mar 53
这是我们的做法:
if object_id('YourSP') is null
exec ('create procedure dbo.YourSP as select 1')
go
alter procedure dbo.YourSP
as
...
Run Code Online (Sandbox Code Playgroud)
如果代码尚不存在,则代码会创建"存根"存储过程,否则会执行更改.这样,即使重复执行脚本,也会保留对过程的任何现有权限.
Rem*_*anu 53
ALTER还将强制重新编译整个过程.语句级别重新编译适用于过程内的语句,例如.单个SELECT,由于基础表发生更改而重新编译,没有对过程进行任何更改.甚至不可能有选择地重新编译ALTER过程中的某些语句,以便了解在服务器必须编译它的ALTER过程之后SQL文本中发生了什么变化.
对于所有对象,ALTER总是更好,因为它保留了所有安全性,所有扩展属性,所有依赖性和所有约束.
从 SQL Server 2016 SP1 开始,您现在可以选择使用CREATE OR ALTER
存储过程、函数、触发器和视图的语法。请参阅SQL Server 数据库引擎博客上的CREATE OR ALTER – SQL Server 2016 SP1 中另一项出色的语言增强功能。例如:
CREATE OR ALTER PROCEDURE dbo.MyProc
AS
BEGIN
SELECT * FROM dbo.MyTable
END;
Run Code Online (Sandbox Code Playgroud)