SQL Server 2000: Как выйти из хранимой процедуры?

Class.new()

Создают новый класс во время выполнения. Аргументом может быть класс для получения из, и блок является телом класса. Вы могли бы также хотеть посмотреть const_set/const_get/const_defined? для получения нового класса, правильно зарегистрированного, так, чтобы inspect распечатал имя вместо числа.

Не что-то, в чем Вы нуждаетесь каждый день, но довольно удобный, когда Вы делаете.

60
задан Leigh 29 October 2013 в 21:08
поделиться

6 ответов

Вы можете использовать RETURN , чтобы немедленно остановить выполнение хранимой процедуры. Цитата из электронной документации :

Безоговорочный выход из запроса или процедура. ВОЗВРАТ немедленный и полный и может быть использован в любой момент для выхода из процедуры, пакета или блок операторов. Заявления, что Follow RETURN не выполняются.

Из-за паранойи я попробовал ваш пример, он выводит PRINT и немедленно останавливает выполнение.

83
ответ дан 24 November 2019 в 17:38
поделиться

This works over here.

ALTER PROCEDURE dbo.Archive_Session
    @SessionGUID int
AS 
    BEGIN
        SET NOCOUNT ON
        PRINT 'before raiserror'
        RAISERROR('this is a raised error', 18, 1)
        IF @@Error != 0 
            RETURN
        PRINT 'before return'
        RETURN -1
        PRINT 'after return'
    END
go

EXECUTE dbo.Archive_Session @SessionGUID = 1

Returns

before raiserror
Msg 50000, Level 18, State 1, Procedure Archive_Session, Line 7
this is a raised error
4
ответ дан 24 November 2019 в 17:38
поделиться

Поместите его в TRY / CATCH .

Когда RAISERROR выполняется с серьезностью 11 или выше в блоке TRY, это передает управление ассоциированному CATCH block

Ссылка: MSDN .

РЕДАКТИРОВАТЬ: Это работает для MSSQL 2005+, но я вижу, что теперь вы пояснили, что работаете над MSSQL 2000. Я оставлю это здесь для справки.

10
ответ дан 24 November 2019 в 17:38
поделиться

Если вы не укажете уровень серьезности 20 или выше, ошибка raiserror не остановит выполнение. См. Документацию MSDN .

Обычное решение - включить возврат после каждой ошибки, повышающей :

if @whoops = 1
    begin
    raiserror('Whoops!', 18, 1)
    return -1
    end
28
ответ дан 24 November 2019 в 17:38
поделиться

i figured out why RETURN is not unconditionally returning from the stored procedure. The error i'm seeing is while the stored procedure is being compiled - not when it's being executed.

Consider an imaginary stored procedure:

CREATE PROCEDURE dbo.foo AS

INSERT INTO ExistingTable
EXECUTE LinkedServer.Database.dbo.SomeProcedure

Even though this stord proedure contains an error (maybe it's because the objects have a differnet number of columns, maybe there is a timestamp column in the table, maybe the stored procedure doesn't exist), you can still save it. You can save it because you're referencing a linked server.

But when you actually execute the stored procedure, SQL Server then compiles it, and generates a query plan.

My error is not happening on line 114, it is on line 114. SQL Server cannot compile the stored procedure, that's why it's failing.

And that's why RETURN does not return, because it hasn't even started yet.

9
ответ дан 24 November 2019 в 17:38
поделиться

Это потому, что у вас нет операторов BEGIN и END . Вы не должны видеть распечатки или ошибки при выполнении этого оператора, только Заявление завершено (или что-то в этом роде).

1
ответ дан 24 November 2019 в 17:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: