Это то, что раздражало разработчиков SQL Server в течение многих лет. Наконец, с SQL Server 2017 CU12 с флагом трассировки 460 они дают вам лучшее сообщение об ошибке, например:
Сообщение 2628, уровень 16, состояние 6, имя процедуры процедуры, номер строки строки
Строка или двоичные данные будут усечены в таблице "%. * Ls", столбец
"%. * Ls. Усеченное значение: ‘%. * Ls
Способ обойти это сейчас заключается в добавлении оператора print
после каждой вставки. Затем, когда вы видите распечатку rows affected
, вы можете увидеть, что вы печатаете.
...
insert into table1
select...
print 'table1 insert complete'
insert into table2
select...
print 'table2 insert complete'
Это не скажет вам, какой столбец, но сузит его до правильной вставки. Вы также можете добавить SET NOCOUNT ON
вверху вашего скрипта, если вы не хотите, чтобы сообщение о поврежденных строках было распечатано.
Еще одно дополнение, если вы действительно используете BULK INSERT и не просто используете термин в целом, вы можете указать ERRORFILE
. Это запишет строки, которые вызвали ошибку в вашей команде BULK INSERT
. Важно знать, что по умолчанию BULK INSERT
завершится, если будет 10 ошибок или меньше. Вы можете переопределить это, указав MAXERRORS
в вашей команде BULK INSERT
.