Banco de dados de largura equivalente a SET IDENTITY_INSERT OFF
-
04-07-2019 - |
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?
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?