Уровень Raiserror 16, который не прерывает процедуру

Привет всем. У меня есть хранимая процедура, которая проверяет, существует ли batch_id в таблице с именем valid. Если существует, я хочу прервать оставшуюся часть процедуры. У меня есть

If exists(select batch_id 
          from valid
          Where batch_id=@bid)
Raiserror ('file has been extracted already',16,1)

Но это не прерывает остальную часть процедуры


person Duncan Lamb    schedule 16.04.2013    source источник
comment
Не могли бы вы опубликовать тело процедуры?   -  person gotqn    schedule 16.04.2013
comment
SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO ALTER proc [Lamb].[ETL] as SET ANSI_NULLS ON; УСТАНОВИТЬ QUOTED_IDENTIFIER ON; ВКЛЮЧИТЬ ANSI_PADDING; массовая вставка Lamb.temp1 из 'c:\temp\Locality_Extract_01.csv' с (fieldterminator = ','); вставить в Lamb.temp (PostCode, Suburb, State) выбрать * из Lamb.temp1 по штатам; если существует (выберите Batch_id из lamb.Invalid_locality, где Batch_id = 1) raiserror («файл уже извлечен», 16, 1)   -  person Duncan Lamb    schedule 16.04.2013


Ответы (1)


raiserror не прерывает пакет, ср. документация Microsoft. У вас могло сложиться такое впечатление, потому что некоторые клиенты могут отменить запрос из-за ошибок выше определенного порога серьезности.

Чтобы выйти из процедуры при ошибке, вызовите ошибку и верните отрицательный статус. Обычно я return -50000 - @@error убеждаюсь, что нахожусь в указанном диапазоне.

person James K. Lowden    schedule 17.04.2013
comment
Вы также можете попробовать использовать команду THROW вместо RAISERROR. Я считаю, что это всегда завершает пакет, если только он не используется внутри блока TRY. - person Stainy; 14.06.2013