例如,如果您有一个经常从网站调用的函数/存储过程,则可能会导致问题。
存储的过程将被丢弃几毫秒/秒,在此期间,所有查询都将失败。
如果你做一个改变,你就不会有这个问题。
新创建的存储过程的模板通常是这种形式:
IF EXISTS (SELECT * FROM sysobjects WHERE type = 'P' AND name = '<name>')
BEGIN
DROP PROCEDURE <name>
END
GO
CREATE PROCEDURE <name>
......
但是,相反的更好,imo:
如果 storedproc/function/etc 不存在,请使用虚拟 select 语句创建它。然后,alter 将始终有效 - 它永远不会被丢弃。
我们有一个存储过程,所以我们的存储过程/函数通常是这样的:
EXEC Utils.pAssureExistance 'Schema.pStoredProc'
GO
ALTER PROCECURE Schema.pStoredProc
...
我们对函数使用相同的存储过程:
EXEC Utils.pAssureExistance 'Schema.fFunction'
GO
ALTER FUNCTION Schema.fFunction
...
在 Utils.pAssureExistance 中,我们执行 IF 并查看“.”之后的第一个字符:如果是“f”,我们创建一个虚拟函数,如果是“p”,我们创建一个虚拟存储过程。
但请注意,如果您创建一个虚拟标量函数,并且您的 ALTER 位于表值函数上,则 ALTER FUNCTION 将失败,说明它不兼容。
同样,Utils.pAssureExistance 可以很方便,带有一个额外的可选参数
EXEC Utils.pAssureExistance 'Schema.fFunction', 'TableValuedFunction'
将创建一个虚拟表值函数,
另外,我可能是错的,但我认为如果您执行删除过程并且查询当前正在使用存储过程,它将失败。
但是,alter 过程将等待所有查询停止使用存储过程,然后对其进行更改。如果查询“锁定”存储过程的时间过长(比如几秒钟),ALTER 将停止等待锁定,并且无论如何都会更改存储过程:使用存储过程的查询可能会在那时失败。