2013-07-26 3 views
4

У меня есть следующий код, чтобы сделать объемную вставку в SQL Server (taken from the example at the bottom of here):Массовая вставка неудача: Явное значение должно быть указано

SET IDENTITY_INSERT [dbo].Reporting_DriverScoreCard ON 

EXECUTE XP_CMDSHELL 'BCP AT100Reporting.dbo.Reported_Driver_ScoreCard out D:\temp\Reported_Driver_ScoreCard.txt -T -n' 
BULK INSERT [dbo].Reporting_DriverScoreCard 
FROM 'D:\temp\Reported_Driver_ScoreCard.txt' 
WITH 
(
    DATAFILETYPE = 'native', 
    ERRORFILE = 'D:\temp\error.txt', 
    MAXERRORS = 10000 
); 

SET IDENTITY_INSERT [dbo].Reporting_DriverScoreCard OFF 

Однако, когда я запускаю эту команду, она потерпит неудачу и дать мне это сообщение об ошибке:

Explicit value must be specified for identity column in table 'Reporting_DriverScoreCard' either when IDENTITY_INSERT is set to ON or when a replication user is inserting into a NOT FOR REPLICATION identity column.

Я думаю, что это происходит потому, что есть дополнительная линия на конце текстового файла создается таким образом он пытается вставить пустую строку, когда он попадет в конец файла (и все остальные строки имеют идентификаторы s et для них.)

Есть ли способ заставить это работать правильно, поскольку у меня есть несколько массивных dbs, которые я пытаюсь использовать?

+0

Вы проверили там * есть * дополнительная строка? Предоставляет ли файл идентификационные значения, как указано в сообщении? Как быстро BULK INSERT выполняется за считанные секунды? Неудачно ли оно или в конце? – usr

+0

В конце этого не получается, я добавил следующие значения в выражения '-e' в BCP и' KEEPIDENTITY' в объемную вставку, но я не могу проверить файл, поскольку он слишком велик, чтобы открыть – Pete

+0

Используйте шестнадцатеричный редактор или скопировать только первый и последний мега файл в новое место. Или экспортируйте меньше данных с помощью представления или запроса. – usr

ответ

2

Как оказалось, мне нужны были правильные аргументы, добавляющие к запросу. В конце концов, это запрос, который работал для меня:

EXECUTE XP_CMDSHELL 'BCP AT100Reporting.dbo.Reported_Driver_ScoreCard out D:\temp\Reported_Driver_ScoreCard.dat -T -E -n -k' 

SET IDENTITY_INSERT [dbo].Reporting_DriverScoreCard ON 

BULK INSERT [dbo].Reporting_DriverScoreCard 
FROM 'D:\temp\Reported_Driver_ScoreCard.dat' 
WITH 
(
    KEEPIDENTITY, 
    BATCHSIZE = 5000, 
    DATAFILETYPE = 'native', 
    ERRORFILE = 'D:\temp\error.txt', 
    MAXERRORS = 10000, 
    KEEPNULLS 
); 

SET IDENTITY_INSERT [dbo].Reporting_DriverScoreCard OFF 
Смежные вопросы