T-SQL: остановить обработку остальной части запроса - PullRequest
0 голосов
/ 14 сентября 2010

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

Сценарий

IF NOT EXISTS (SELECT  *
        FROM
            [dbo].[Updates] 
       WHERE 
            RevisionNumber='12.2457.2')
BEGIN
    IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[TestProcedure]') AND type in (N'P', N'PC'))
    DROP PROCEDURE [dbo].[TestProcedure]
    GO

    SET ANSI_NULLS ON
    GO

    SET QUOTED_IDENTIFIER ON
    GO

    CREATE PROCEDURE [dbo].[TestProcedure]
    AS
    BEGIN
        PRINT 'Test';
    END
    GO

    INSERT [dbo].[Updates]
    SELECT '12.2457.2'
END

Приведенный выше запрос не будет работать, поскольку строка, следующая за «GO», обрабатывается как новый запрос. Мы выпускаем обновления каждый день и хотим простоты установки обновлений.

Я ищу что-то вроде заявления "ВОЗВРАТ". Это работает, но не с "GO".

IF EXISTS (SELECT  *
        FROM
            [dbo].[Updates] 
       WHERE 
            RevisionNumber='12.2457.2')
BEGIN
    PRINT 'The update ''12.2457.2'' was already installed.'
    RETURN
END

GO

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

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE PROCEDURE [dbo].[TestProcedure]
AS
BEGIN
    PRINT 'Test';
END
GO

INSERT [dbo].[Updates]
SELECT '12.2457.2'

GO

Обход

BEGIN TRANSACTION

GO

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

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE PROCEDURE [dbo].[TestProcedure]
AS
BEGIN
    PRINT 'Test';
END
GO


IF EXISTS(SELECT TOP 1 1 FROM [dbo].[Updates] WHERE RevisionNumber='12.2457.2')
BEGIN
    ROLLBACK TRANSACTION
    PRINT 'The update was already present in the database. The transaction was rolled back.'
END 
ELSE
BEGIN

    INSERT [dbo].[Updates]
    SELECT '12.2457.2'

    COMMIT TRANSACTION
    PRINT 'The update was sucessfully installed.'
END

Мне нужна идея остановить выполнение остальных строк, эквивалентное ключевому слову «RETURN / END» в Visual Basic. Пожалуйста, помогите!

Ответы [ 3 ]

1 голос
/ 14 сентября 2010

Вы должны условно использовать гипотетическое ключевое слово, чтобы оно имело какое-либо значение, и в этот момент вы могли бы в любом случае просто реорганизовать свой код вокруг условия - то есть, нет случая, когда вам требуется * 1002. * гипотетическое ключевое слово STOP.

В вашем случае подойдет простой NOT EXISTS или ELSE.

1 голос
/ 14 сентября 2010

Для одного оператора:

INSERT [dbo].[Updates]
    (RevisionNumber,...) 
SELECT 
    '12.2457.2', ...
WHERE
    NOT EXISTS (SELECT  *
    FROM
        [dbo].[Updates] 
   WHERE 
        RevisionNumber='12.2457.2')

Для нескольких операторов:

IF NOT EXISTS (SELECT  *
        FROM
            [dbo].[Updates] 
       WHERE 
            RevisionNumber='12.2457.2')
BEGIN

  --do stuff

END

В противном случае сохраненный процесс и ВОЗВРАТ.

Что вы пытаетесь сделатьделать?если нужно остановить повторяющиеся записи, посмотрите этот ответ:

0 голосов
/ 20 августа 2012

Наконец-то есть решение. Кажется лучше, чем обходной путь.

set noexec off / on делает свое дело.

IF EXISTS (SELECT  *
        FROM
            [dbo].[Updates] 
       WHERE 
            RevisionNumber='12.2457.2')
BEGIN
    PRINT 'The update ''12.2457.2'' was already installed.'
    set noexec on
END

GO

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

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE PROCEDURE [dbo].[TestProcedure]
AS
BEGIN
    PRINT 'Test';
END
GO

INSERT [dbo].[Updates]
SELECT '12.2457.2'

GO

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