Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 SET XACT_ABORT и BULK INSERT  [new]
нуб987
Guest
в большой процедуре в таблицы заливаются данные из текстовых файлов.
нужно сделать так, чтобы при ошибке в одном из файлов, процедура пропускала его и шла дальше (заливала другие файлы в другие таблицы).

пишу как-то так:
declare
   @TmpSQL varchar(4000)
   , @BulkTable varchar(100)
   , @FileName varchar(100)

set @FileName = 'd:\123.txt'

set @BulkTable = 'tmp123'

set @TmpSQL = '
CREATE TABLE [' + @BulkTable + '] (
   Field1 varchar(100) NULL ,
   Field2 varchar(100) NULL ,
   Field3 varchar(100) NULL 
) ON [PRIMARY]
'
exec(@TmpSQL)

SET XACT_ABORT OFF

begin tran
set @TmpSQL = '
BULK INSERT [' + @BulkTable + ']
   FROM ''' + @FileName + '''
   WITH 
      (
         FIELDTERMINATOR = ''\t'',
         ROWTERMINATOR = ''\n'',
         CODEPAGE = ''RAW'',
         FIRSTROW = 2
         --, LASTROW = 0
      )
'
exec(@TmpSQL)

commit tran

SET XACT_ABORT ON

print 'ok'

и если в файле поля не соответствую созданной таблице, то все это вываливается с такой ошибкой:
автор
Server: Msg 4832, Level 16, State 1, Line 1
Bulk Insert: Unexpected end-of-file (EOF) encountered in data file.
Server: Msg 7399, Level 16, State 1, Line 1
OLE DB provider 'STREAM' reported an error. The provider did not give any information about the error.
OLE DB error trace [OLE/DB Provider 'STREAM' IRowset::GetNextRows returned 0x80004005: The provider did not give any information about the error.].
The statement has been terminated.

и print 'ok' уже не выполняется.
Есть ли возможность сделать задуманное?

ПС. MSSQL2000
1 фев 17, 03:45    [20168253]     Ответить | Цитировать Сообщить модератору
 Re: SET XACT_ABORT и BULK INSERT  [new]
aleks2
Guest
Есть два пути
1. Верняк. Делаешь процедуру загрузки 1 файла/таблицы и дергаешь ее из клиента/скрипта с обработкой ошибки на клиенте.
2. Можно попробовать. Делаешь процедуру загрузки 1 файла/таблицы и дергаешь ее из ДРУГОЙ процедуры с обработкой ошибки.
1 фев 17, 05:55    [20168266]     Ответить | Цитировать Сообщить модератору
 Re: SET XACT_ABORT и BULK INSERT  [new]
aleks2
Guest
Чорт! Третий вариант: джоб с повтором шага при ошибке. Тока надо модифицировать процедуру, шоб она злопамятно помнила "последнюю таблицу" и начинала со "следующей".
По сути, это модификация варианта 1.
1 фев 17, 06:00    [20168269]     Ответить | Цитировать Сообщить модератору
 Re: SET XACT_ABORT и BULK INSERT  [new]
invm
Member

Откуда: Москва
Сообщений: 9845
нуб987,

Делаете loopback линкед-сервер.

Переменную объявляете как
@TmpSQL nvarchar(4000)

Вместо
exec(@TmpSQL)
пишите
exec loopback.MyDB..sp_executesql @TnpSQL
1 фев 17, 10:32    [20168650]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить