Выполняются ли операторы после END в хранимой процедуре? - PullRequest
4 голосов
/ 22 июля 2011

Выполняются ли операторы после END в хранимой процедуре?

Я обнаружил, что моя хранимая процедура включает в себя процедуру удаления после блока BEGIN / END. Тем не менее, каждый раз, когда я выполняю хранимую процедуру в другом месте кода, кажется, что он работает нормально, и pvd_sp_yyy не удаляется. Я не уверен почему? Во-первых, я беспокоюсь об этом, и поэтому я собираюсь удалить дополнительное заявление, независимо от того.

У кого-нибудь есть идеи по этому поводу?

Спасибо

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go


ALTER PROCEDURE [dbo].[pvd_xxx]
    @var
AS

BEGIN

    DECLARE @RETURN int

    SET @RETURN = 0

    IF EXISTS (
        SELECT * FROM table1
        WHERE name = @var
    )
    BEGIN
        SET @RETURN = 1
    END

    RETURN @RETURN

END


IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[pvd_sp_yyy]') AND type in (N'P', N'PC'))
    DROP PROCEDURE [pvd_sp_yyy]

Ответы [ 3 ]

7 голосов
/ 22 июля 2011

BEGIN / END не являются пределами хранимой процедуры.Конец пакета (обычно GO):

Итак, да, код выполняется.

Это также означает, что BEGIN / END не нужны ... как скобки вокруг параметров.Это SQL: не высокоуровневый клиентский язык.

Я довольно часто оставляю GRANT EXECUTE внутри хранимого процесса ...:)

2 голосов
/ 22 июля 2011

Да, так как все, что вы объявили, это блок кода. Содержимое процедуры не заканчивается до тех пор, пока вы не введете GO для выполнения пакета.

0 голосов
/ 22 июля 2011

Если вы действительно хотите, чтобы DROP PROCEDURE выполнялся, тогда он должен быть единственным оператором в пакете, поэтому разделите ваши ALTER PROCEDURE и DROP PROCEDURE с GO.

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