2015-09-08 4 views
0

В настоящее время у меня есть хранимая процедура, которая запускает множество разных запросов. Один запрос, в частности, будет выполнять массовую вставку CSV-файла, хранящегося на моем компьютере, когда файл доступен, эта вставка большого объема отлично работает. К сожалению, у меня не всегда есть файл для получения этого запроса, в результате моя хранимая процедура останавливается и бросает ошибку, когда этот файл не существует. Каков хороший способ справиться с этой ситуацией, чтобы хранимая процедура продолжала выполняться полностью, даже если нет файла для запроса объемной вставки для извлечения?Как пропустить ошибку в хранимой процедуре

Я попытался сыграть с блоком try catch, но он все равно дал мне те же проблемы, когда я попытался выполнить процедуру. С учетом сказанного это могло быть просто потому, что я не реализовал блок try catch правильно. Я открыт для других способов, кроме блоков try catch, это был тот, который я видел больше всего.

+0

TRY/CATCH работает, но это не относится к ошибке. Это больше похоже на подавление ошибки. Почему бы не проверить наличие файла и только попытаться обработать его, если он существует? –

+1

Как выглядел ваш блок catch? Блоки «try catch» хороши для непредсказуемых ошибок - поскольку это предсказуемо, лучше использовать оператор 'if'. См. Системную хранимую процедуру: dbo.xp_fileexist – PeteGO

+0

@SeanLange Я думал об этом изначально, но мне было трудно найти способ проверить наличие файла. – Jcmoney1010

ответ

1

Вы должны быть в состоянии сделать попробовать поймать так:

BEGIN TRY 
    -- Code that might error here 
END TRY 
BEGIN CATCH 
    -- Handle the error here 
END CATCH 

Но в вашем случае, если ваша ошибка является предсказуемым, и вы можете проверить на наличие файлов и затем использовать if заявление только сделать если он существует.

Вот как проверить наличие файла.

Замените @path на ваш путь к файлу. Например: N'C:\Temp\Test.csv'

DECLARE @result INT 
EXEC master.dbo.xp_fileexist @path, @result OUTPUT 

IF (@result = 1) 
BEGIN 
    -- Do your bulk insert here. 
END 
+0

Фрагмент проверки работоспособности работал отлично! У меня есть вопрос относительно 'Try..Catch'. Если вы используете хранимую процедуру, можете ли вы запустить попытку в начале хранимой процедуры, а затем завершить ее в конце процедуры или это необходимо выполнить для каждого запроса? – Jcmoney1010

+0

Вы можете сделать это таким образом - предположив, что вы можете получить то, что вам нужно для обработки ошибки, из 'ERROR_MESSAGE()', 'ERROR_LINE()' и т. Д. – PeteGO