Pergunta

Na minha eterna saga para inserir 1,4 milhões de linhas de dados a partir de um script SQL , eu escrevi um aplicativo WinForms básicos que leva cada linha do script e executa-lo individualmente.

No entanto, porque o script original continha

SET IDENTITY_INSERT [Table] OFF

e SET é um comando de toda a sessão, esta definição está se perdendo em cada chamada SQL, o que significa que cada linha está falhando. Existe uma maneira de definir IDENTITY_INSERT off para toda a mesa, banco de dados de largura só assim eu posso fazer essas chamadas individuais sem eles não? Ou, talvez, eu posso dizer a ele para ignorar a especificação de identidade, acrescentando um comando para cada linha?

Foi útil?

Solução

BULK INSERT não vai funcionar para você? Ou no Assistente de SQL Server Import / Export ( aqui ou aqui )? Eu sei importação / exportação pode desligar inserção de identidade para toda a importação. Estou razoavelmente certo de que você pode fazê-lo apenas antes de BULK INSERT

Outras dicas

Eu acredito que Identity INSERT só pode ser substituído uma mesa ao mesmo tempo, por sessão.

Você terá que talvez lote até 2 ou 300 instruções de inserção de cada vez e precedem cada lote com a inserção ident.

para que o aplicativo irá executar um bloco como este ....

SET IDENTITY_INSERT [Table] OFF;
INSERT INTO TABLE VALUES (1, 'a');
INSERT INTO TABLE VALUES (2, 'b');
INSERT INTO TABLE VALUES (3, 'c');
INSERT INTO TABLE VALUES (4, 'd');
INSERT INTO TABLE VALUES (5, 'e');
SET IDENTITY_INSERT [Table] ON;

É qualquer outra coisa vai estar acessando / inserção para a mesa enquanto isso é de 1,4 milhão de trabalho da inserção está acontecendo.

Se não, você poderia simplesmente Desative a identidade na coluna de PK para a duração do trabalho?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top