@@ ОШИБКА в SQL Server 2005 - PullRequest
       2

@@ ОШИБКА в SQL Server 2005

3 голосов
/ 06 июня 2011

Я научился использовать SCOPE_IDENTITY() вместо @@IDENTITY, чтобы получить последнее значение идентификатора, вставленное в заданную область, что может быть весьма полезно в сценариях с высоким параллелизмом.Есть ли эквивалент этой функции для переменной @@ ERROR?Я имею в виду, есть ли способ убедиться, что всякий раз, когда я пишу

IF (@@ERROR <> 0) RETURN

, я фактически заставляю функцию возвращаться, потому что самая последняя команда в этой области вызвала ошибку

Ответы [ 2 ]

6 голосов
/ 06 июня 2011

From Books Online:

@@ ERROR возвращает информацию об ошибке только сразу после инструкции Transact-SQL, которая генерирует ошибку.

@@ Ошибка только в пределахтекущая сфераТаким образом, он должен иметь значение для того, что отправляло proc в блок catch независимо от того, какой из нескольких операторов был ошибочным.

5 голосов
/ 07 июня 2011

Запись IF (@@ERROR <> 0) после каждого утверждения просто не сработает. Это требует слишком большой дисциплины. Вы должны перейти к BEGIN TRY/BEGIN CATCH. Обработка исключений и вложенные транзакции показывает шаблон процедур T-SQL, который обрабатывает как исключения, так и вложенные транзакции (что необходимо учитывать для обеспечения надежности вашего кода T-SQL):

create procedure [usp_my_procedure_name]
as
begin
    set nocount on;
    declare @trancount int;
    set @trancount = @@trancount;
    begin try
        if @trancount = 0
            begin transaction
        else
            save transaction usp_my_procedure_name;

        -- Do the actual work here

lbexit:
        if @trancount = 0   
            commit;
    end try
    begin catch
        declare @error int, @message varchar(4000), @xstate int;
        select @error = ERROR_NUMBER(), @message = ERROR_MESSAGE(), @xstate = XACT_STATE();
        if @xstate = -1
            rollback;
        if @xstate = 1 and @trancount = 0
            rollback
        if @xstate = 1 and @trancount > 0
            rollback transaction usp_my_procedure_name;

        raiserror ('usp_my_procedure_name: %d: %s', 16, 1, @error, @message) ;
        return;
    end catch   
end

Также см. Обработка ошибок в SQL 2005 и более поздних версиях для более глубокого обсуждения всей этой темы.

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