2013-12-03 2 views
1

У меня есть массовая вставка внутри попытки - поймать блок:SQL ошибка Capture BULK INSERT 4863

BEGIN TRY 
    BULK INSERT dbo.EQUIP_STATUS_CODE 
    FROM 'filepath\filename.csv' 
    WITH (MAXERRORS = 1, FIELDTERMINATOR = ',') 
END TRY 
BEGIN CATCH 
    EXECUTE dbo.ERROR_LOG_CSV; 
END CATCH 

Я хотел бы быть в состоянии захватить следующую ошибку, когда это происходит:

Bulk load data conversion error (truncation)

Но кажется, что я не могу, хотя уровень 16, который попадает в диапазон try-catch. Мне было интересно, есть ли способ зафиксировать эту ошибку, когда это произойдет.

Перед тем, как уточнил MAXERRORS к 1 я получил эту ошибку:

Cannot fetch a row from OLE DB provider "BULK" for linked server "(null)".

Поскольку бывшая ошибка гораздо более описательным к проблеме, то есть один я хотел бы записать.

ответ

4

Хотя моя компетенция - это больше Oracle, чем SQL Server, в любом случае я попытаюсь как-то помочь с этой проблемой. Я обнаружил, что ваша ситуация уже находится в bugtracker SQL Server (идентификатор ошибки: 592960) со статусом «Не исправляется» с 2010 года. Вы можете посмотреть соответствующее обсуждение на connect.microsoft.com (в настоящий момент хост недоступен, поэтому я использовал google cache).

2

Александр дал вам ответ, но вы должны внимательно прочитать журнал ошибок и подумать о том, что может произойти. SQL Server (ошибка идентификатора: 592960)

Вы пытаетесь навалом вставить непосредственно из файла данных в таблицу данных?

Из статьи есть несоответствие в типах данных или усечении. У механизма SQL есть ошибка, которая не сообщает об этом как об ошибке.

Цитата от первого лица, сообщившего об ошибке - «Несмотря на уровень серьезности, равный 16, я не вижу ошибки, пойманной конструкцией TRY/CATCH. Код не прерывается и продолжается гладко, как если бы ошибка не была произошло «.

Вы изучили, какие поля могут содержать плохие данные?

Вот несколько предложений.

1 - COMMA DELIMITED FILES PROBLEMATIC - Я всегда ненавижу формат с разделителями-запятыми, поскольку запятые могут быть в потоке данных. Попробуйте использовать символ типа тильда ~ в качестве разделителя, который встречается реже. Может ли проблема заключаться в том, что в текстовом поле есть запятая? Таким образом, добавление поля в поток данных?

2 - USE STAGING TABLE - Иногда лучше импортировать данные из файла в промежуточную таблицу, которая определяется столбцами как varchar (x). Это позволяет получить данные в таблицу.

Затем запишите хранимую процедуру для проверки данных в столбцах перед передачей в производственную таблицу. Пометьте любые плохие строки как подозреваемые.

Вставьте данные из промежуточного стола в производство, оставив позади любые плохие строки.

Отправьте электронное письмо кому-то, чтобы посмотреть на плохие данные. Если это повторная передача файла данных, вам нужно исправить его в источнике.

3 - ОБРАТНАЯ ПРОЦЕССА С ИНСТРУМЕНТОМ ETL - Не записывайте этот материал в Двигатель. Службы интеграции SQL Server (SSIS) - отличный инструмент для загрузки нагрузки (ETL).

В соединении есть опции, которые можно указать, что текст указан "", устраняет вышеуказанную дополнительную запятую. Вы можете отправлять строки, которые не могут импортироваться в производственную таблицу, в таблицу больниц для проверки.

Таким образом, в двигателе есть ошибка.

Однако я бы определенно подумал об изменении файла в формате тильды и/или использовании промежуточной таблицы. Еще лучше, если у вас есть время, перепишите процесс с помощью пакета SSIS!

С уважением

J

PS: Я даю Александера очков, так как он нашел ошибку на SQL подключения. Однако, я думаю, формат файла является основной причиной.

0

Это, вероятно, поймать эту ошибку, потому что он ловит ошибку Msg 4860:

Q: TRY doesn't CATCH error in BULK INSERT

BEGIN TRY 
    DECLARE @cmd varchar(1000) 
    SET @cmd = 'BULK INSERT [dbo].[tblABC] 
    FROM ''C:\temp.txt'' 
    WITH (DATAFILETYPE = ''widechar'',FIELDTERMINATOR = '';'',ROWTERMINATOR = ''\n'')' 
    EXECUTE (@cmd) 
END TRY 

BEGIN CATCH 
select error_message() 
END CATCH