Если вы УДАЛИТЕ и СОЗДАЕТЕ процедуру, вы потеряете настройки безопасности. Это может раздражать администратора базы данных или вообще нарушить работу вашего приложения.
Что я делаю, так это создаю тривиальную хранимую процедуру, если она еще не существует. После этого вы можете ИЗМЕНИТЬ хранимую процедуру по своему усмотрению.
IF object_id('YourSp') IS NULL
EXEC ('create procedure dbo.YourSp as select 1')
GO
ALTER PROCEDURE dbo.YourSp
AS
...
Таким образом, настройки безопасности, комментарии и другие метаданные останутся в силе после развертывания.
Самый чистый способ - проверить его существование, отбросить, если он существует, а затем воссоздать его. Вы не можете встроить оператор create proc в оператор IF. Это должно сработать:
IF OBJECT_ID('MySproc', 'P') IS NOT NULL
DROP PROC MySproc
GO
CREATE PROC MySproc
AS
BEGIN
...
END
Если вы имеете дело только с хранимыми процедурами, проще всего будет, вероятно, отбросить процедуру, а затем воссоздать ее. Вы можете сгенерировать весь код для этого с помощью мастера создания сценариев в SQL Server.
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[YourSproc]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[YourSproc]
CREATE PROCEDURE YourSproc...
if not exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[xxx]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
BEGIN
CREATE PROCEDURE dbo.xxx
где xxx
- имя процесса
В дополнение к тому, что уже было сказано, я также хотел бы добавить другой подход и отстаивать использование стратегии дифференциального развертывания сценариев. Вместо создания сценария с отслеживанием состояния, который всегда проверяет текущее состояние и действует в зависимости от этого состояния, разверните его с помощью серии сценариев без отслеживания состояния, которые обновляются с хорошо известных версий . Я использовал эту стратегию, и она приносит свои плоды, поскольку все мои сценарии развертывания теперь полностью бесплатны.
IF OBJECT_ID('SPNAME') IS NULL
-- Does Not Exists
ELSE
-- Exists
Лучшим вариантом может быть использование такого инструмента, как Red-Gate SQL Compare или SQL Examiner, для автоматического сравнения различий и создания сценария миграции.