Как проверить, существует ли хранимая процедура перед ее созданием - PullRequest
250 голосов
/ 15 января 2010

У меня есть сценарий SQL, который должен запускаться каждый раз, когда клиент выполняет функцию «управления базой данных». Сценарий включает в себя создание хранимых процедур в клиентской базе данных. Некоторые из этих клиентов могут уже иметь хранимую процедуру при запуске сценария, а некоторые - нет. Мне нужно добавить отсутствующие хранимые процедуры в клиентскую базу данных, но не имеет значения, сколько я пытаюсь изменить синтаксис T-SQL, я получаю

CREATE / ALTER PROCEDURE 'должно быть первым оператором в пакете запроса

Я читал это удаление перед созданием работ, но мне не нравится делать это таким образом.

IF EXISTS (SELECT * FROM sys.objects WHERE type = 'P' AND name = 'MyProc')
DROP PROCEDURE MyProc
GO

CREATE PROCEDURE MyProc
...

Как добавить проверку на наличие хранимой процедуры и создать ее, если она не существует, но изменить ее, если она существует?

Ответы [ 18 ]

3 голосов
/ 18 февраля 2011

У меня, видимо, нет репутации, необходимой для голосования или комментирования, но я просто хотел сказать, что ответ Джеффа с использованием EXEC (sp_executesql может быть лучше) определенно подходит. Удаление и последующее воссоздание хранимой процедуры завершает работу, но есть момент, когда хранимая процедура вообще не существует, и это может быть очень плохо, особенно если это что-то, что будет запустить несколько раз. У меня были всевозможные проблемы с моим приложением, потому что фоновый поток выполнял IF EXISTS DROP ... CREATE в то же время, когда другой поток пытался использовать хранимую процедуру.

3 голосов
/ 16 июля 2018

УПАДАТЬ, ЕСЛИ СУЩЕСТВУЕТ новая функция SQL Server 2016

https://blogs.msdn.microsoft.com/sqlserverstorageengine/2015/11/03/drop-if-exists-new-thing-in-sql-server-2016/

DROP  PROCEDURE IF EXISTS dbo.[procname]
3 голосов
/ 29 августа 2017

Вот скрипт, который я использую. Благодаря этому я избегаю ненужного сбрасывания и воссоздания сохраненных процедур.

IF NOT EXISTS (
    SELECT *
    FROM sys.objects
    WHERE object_id = OBJECT_ID(N'[dbo].[uspMyProcedure]')
    )
BEGIN
  EXEC sp_executesql N'CREATE PROCEDURE [dbo].[uspMyProcedure] AS select 1'
END
GO

ALTER PROCEDURE [dbo].[uspMyProcedure] 
    @variable1 INTEGER  
AS
BEGIN
   -- Stored procedure logic
END
2 голосов
/ 21 мая 2017

Проверьте, существует ли хранимая процедура

IF EXISTS (SELECT * FROM sys.objects 
            WHERE object_id = OBJECT_ID
             (N'[Schema].[Procedure_Name]') AND type IN (N'P', N'PC'))
BEGIN
       DROP PROCEDURE [Schema].[Procedure_Name]
       Print('Proceudre dropped => [Schema].[Procedure_Name]')
END

Проверьте, существует ли IF для триггера и функции, также нажав ссылку ниже http://www.gurujipoint.com/2017/05/check-if-exist-for-trigger-function-and.html

1 голос
/ 08 октября 2013

почему бы тебе не пойти простым путем, как

    IF EXISTS(SELECT * FROM sys.procedures WHERE NAME LIKE 'uspBlackListGetAll')
    BEGIN
         DROP PROCEDURE uspBlackListGetAll
    END
    GO

    CREATE Procedure uspBlackListGetAll

..........

0 голосов
/ 18 октября 2015

В дополнение к ответу от @ Geoff я создал простой инструмент, который генерирует SQL-файл, содержащий операторы для хранимых процедур, представлений, функций и триггеров.

См. MyDbUtils @ CodePlex . enter image description here

0 голосов
/ 30 июня 2014

CREATE Процедура, ЕСЛИ НЕ СУЩЕСТВУЕТ 'Ваше имя процесса' () НАЧИНАЕТСЯ ... КОНЕЦ

0 голосов
/ 01 марта 2016

Интересно! Почему я не пишу весь запрос как

GO
create procedure [dbo].[spAddNewClass] @ClassName varchar(20),@ClassFee int
as
begin
insert into tblClass values (@ClassName,@ClassFee)
end

GO
create procedure [dbo].[spAddNewSection] @SectionName varchar(20),@ClassID       int
as
begin
insert into tblSection values(@SectionName,@ClassID)
end

Go
create procedure test
as
begin 
select * from tblstudent
end

я уже знаю, что первые две процедуры уже существуют, sql выполнит запрос, выдаст ошибку первых двух процедур, но все равно создаст последнюю процедуру SQl сам заботится о том, что уже существует, это то, что я всегда делаю для всех своих клиентов!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...