Как я могу продолжить выполнение текущего блока после сбоя INSERT? - PullRequest
0 голосов
/ 26 ноября 2011

Рассмотрим следующую таблицу:

CREATE TABLE [dbo].[OrderingTest](
    [ColKey] [int] IDENTITY(1,1) NOT NULL,
    [Col0] [int] NULL,
    [Col1] [int] NOT NULL,
    [Col2] [int] NOT NULL
) ON [PRIMARY]

... и следующую партию:

BEGIN
  INSERT INTO OrderingTest(Col0,Col1,Col2)
  VALUES (1,NULL,3);

  SELECT SCOPE_IDENTITY();
END;

Таблица Test не допускает значения NULL в Col1, поэтомувставка не удастся.Я надеялся проверить на неудачу, используя значение SCOPE_IDENTITY() на данный момент.Однако вместо того, чтобы SELECT SCOPE_IDENTITY() выдает одну строку со столбцом NULL в качестве вывода, выполнение пакета заканчивается после неудачной вставки, и строка SELECT SCOPE_IDENTITY() никогда не выполняется.

ОБНОВЛЕНИЕ:

Я ошибся, результат SCOPE_IDENTITY() был отображен на панели результатов.Я был сбит с толку, потому что SSMS переключил панель «Сообщения» в фокус вместо панели «Результаты» (поскольку произошла ошибка).

Однако после сбоя INSERT вместо NULL отображается последнее значение столбца идентификатора, ColKey.Я думал, что SCOPE_IDENTITY() должен возвращать NULL, если INSERT не удается.

1 Ответ

1 голос
/ 26 ноября 2011

Я попробовал эти команды:

BEGIN   
    DECLARE @theKey INT
    BEGIN TRY
        INSERT INTO OrderingTest(Col0,Col1,Col2)   
        VALUES (1,NULL,3);    
        SELECT @theKey = SCOPE_IDENTITY();      
    END TRY
    BEGIN CATCH
         SET @theKey = - 1
    END CATCH
    select @theKey
END; 

И следующее

BEGIN   
    DECLARE @theKey INT
    SET @theKey = 1
        INSERT INTO OrderingTest(Col0,Col1,Col2)   
        VALUES (1,NULL,3);    
        SELECT @theKey = SCOPE_IDENTITY();      
    select @theKey

END; 

В обоих случаях было выполнено SELECT @theKey, хотя во втором примере сообщение об ошибке былоотображается в окне печати.Обратите внимание, что в вашем примере вы пытаетесь вставить в таблицу TEST, а не в таблицу OrderingTest.Это выдаст ошибку и не запустит SELECT.Вы уверены, что ваш пример верен?

Обратите внимание, что в этом примере SCOPE_IDENTITY возвращает идентификатор последней успешной вставки, а не NULL

BEGIN   
INSERT INTO OrderingTest(Col0,Col1,Col2)   VALUES (1,2,3);    

INSERT INTO OrderingTest(Col0,Col1,Col2)   VALUES (1,NULL,3);    
SELECT SCOPE_IDENTITY(); 
END; 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...