Вот трюк, который я использовал.
-- for testing, not needed for real -- DROP PROCEDURE dbo.uspDoSomething
GO
IF NOT EXISTS ( SELECT * FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_TYPE = 'PROCEDURE' and ROUTINE_NAME = 'uspDoSomething' )
BEGIN
EXEC ( 'CREATE PROCEDURE dbo.uspDoSomething(@i INT) AS BEGIN RAISERROR (''Stubbed version'' , 16, -1) END' )
END
GO
--test only
EXEC dbo.uspDoSomething 0
GO
ALTER PROCEDURE dbo.uspDoSomething(@PatientKey INT)
AS
BEGIN
SELECT @@VERSION
END
GO
--test only
EXEC dbo.uspDoSomething 0
GO
Помните, что ALTER не изменяет все РАЗРЕШЕНИЯ, которые вы имеете на сценарий.
DROP / ADD необходимо повторно применить разрешения.
Обратите внимание, вы изначально не упоминали свою версию sql-сервера. Этот трюк работает с 2014 года и раньше. Очевидно, что более новые версии с CREATE OR ALTER предпочтительнее, чем EXEC с динамическим sql.