У меня есть эта экспресс-хранимая процедура SQL Server 2012:

CREATE PROCEDURE GetNewCodes
    @gintNewCodes bigint,   
    @presNewCodes tinyint,
    @levelNewCodes bigint,
    @quantityNewCodes smallint
AS

-- Get new codes from INCIC database.
DECLARE @return_value int,
        @xmlGenerated xml,
        @xmlString NVARCHAR(MAX)

SET NOCOUNT ON;

    -- Set that this stored procedure is running
    update dbo.RunningSPs with (serializable) set conf_value = 1
    where sp_name = N'GetNewCodes'

    if @@rowcount = 0
    begin
        insert dbo.RunningSPs(sp_name, conf_value) values (N'GetNewCodes', 1)
    end

EXEC    @return_value = [INCIC].[dbo].[ReadCodeBuffer]
        @gint = @gintNewCodes,
        @pres = @presNewCodes,
        @level = @levelNewCodes,
        @quantity = @quantityNewCodes,
        @xmlGenerated = @xmlGenerated OUTPUT

SET @xmlString = cast(@xmlGenerated as nvarchar(max))

EXEC dbo.ProcessCodes @XmlString = @xmlString

    update dbo.RunningSPs with (serializable) set conf_value = 0
    where sp_name = N'GetNewCodes'

GO

И я хочу ВСЕГДА выполнять это:

    update dbo.RunningSPs with (serializable) set conf_value = 0
    where sp_name = N'GetNewCodes'

Даже если я получаю сообщение об ошибке.

Как я могу это сделать?

0
VansFannel 8 Апр 2014 в 17:33

2 ответа

Лучший ответ

Использовать

BEGIN TRY

    -- Actual code gets here

END TRY
BEGIN CATCH

    -- Log error (if case)

END CATCH

-- Always executing code
update dbo.RunningSPs with (serializable) set conf_value = 0
where sp_name = N'GetNewCodes'
2
bjnr 8 Апр 2014 в 13:35

Невозможно выполнить оператор, если он создает ошибку. Если вы заключите оператор в блок TRY CATCH, он перехватит ошибку, но выполнение оператора будет прервано

Например, следующие два блока кода. Первый ничего не вернет, но второй вернет 5, а также PRINT сообщение.

BEGIN TRY
SELECT 5/0
PRINT 'Do something'
END TRY
BEGIN CATCH
END CATCH

BEGIN TRY
SELECT 5/1
PRINT 'Do something'
END TRY
BEGIN CATCH
END CATCH
0
user275683user275683 8 Апр 2014 в 14:07