Я пытаюсь собрать все ошибки формата и ограничения, содержащиеся в файле, используя BULK INSERT
. Мне нужна точная строка в файле для каждой ошибки и описание ошибки.Массовая вставка - поймать все ошибки ограничения
В настоящее время я использую параметр ERRORFILE
для сбора всех ошибок форматирования, содержащихся в файле. Это дает мне то, что мне нужно, но только для ошибок форматирования.
Я хочу сделать то же самое с ошибками ограничения. Если я использую опцию CHECK_CONSTRAINTS
, я могу поймать ошибку, но объемная вставка завершается. Есть ли способ, чтобы объемная вставка продолжала вставлять строки после обнаружения нарушения ограничений, чтобы я мог собирать все ошибки ограничения?
я могу сделать проверку ограничений на временную таблицу, где строки вставляются (после того, как основная вставка выполнена), но я не хочу следовать этому подходу, потому что:
- Я не могу получить точная строка в файле, где находится нарушение ограничения и
- из соображений производительности, так как файл может содержать миллионы строк
Update
Входной файл представляет собой табуляцией текстовый файл с 3-мя столбцами: ID, название, описание
Ниже приведен код, который я использую для чтения/проверки файла:
create table #MyTable (ID int not null, Name varchar(20) not null, Description varchar(60) not null)
alter table #MyTable add check (ID != 1)
begin try
execute sp_executesql 'bulk insert #MyTable from ''' + @FilePath + ''' with (maxerrors = 1000,check_constraints,errorfile='''[email protected]+''')'
end try
begin catch
-- Here I am logging the constraint validation error
end catch
желаемый результат - таблица со всеми форматами и ограничениями, найденными в файле. В настоящее время я получаю все ошибки формата в указанном errorfile
и я набухают вставить errorfile
, чтобы получить ошибки в таблице со структурой
RowNumber int, ErrorDescription nvarchar(max) not null
Я хочу эту таблицу, чтобы содержать все ошибки ограничений тоже, в дополнение к формату ошибки. В настоящее время запрос завершается, когда возникает первая ошибка ограничения (из-за поведения CHECK_CONSTRAINTS
).
Я думаю, вы можете пропустить все строки файла самостоятельно и выполнить каждую команду вставки в блоке try catch. Это не будет быстрым, но с миллионами строк ничего нет – GuidoG