Question

Dans mon éternelle saga pour insérer 1,4 million de lignes de données à partir d'un script SQL , J'ai écrit une application WinForms de base qui prend chaque ligne du script et l'exécute individuellement.

Cependant, parce que le script d'origine contenait

SET IDENTITY_INSERT [Table] OFF

et SET est une commande de session, ce paramètre est perdu à chaque appel SQL, ce qui signifie que chaque ligne échoue. Existe-t-il un moyen de désactiver IDENTITY_INSERT pour l’ensemble de la table, à l’échelle de la base de données, afin que je puisse effectuer ces appels individuels sans échec? Ou peut-être que je peux lui dire d'ignorer la spécification d'identité en ajoutant une commande à chaque ligne?

Était-ce utile?

La solution

INSÉRER EN VRAC ne fonctionnera pas pour vous? Ou l'Assistant d'importation / exportation SQL Server ( ici ou ici )? Je sais que l'import / export peut désactiver l'insertion d'identité pour toute l'importation. Je suis raisonnablement certain que vous pouvez le faire juste avant BULK INSERT

Autres conseils

Je pense que IDENTITY INSERT ne peut être remplacé qu'une table à la fois, par session.

Vous devrez peut-être grouper 2 ou 300 instructions d'insertion à la fois et faire précéder chaque lot avec l'identificateur insert.

afin que l'application exécute un bloc comme celui-ci ....

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;

Est-ce que quelque chose d'autre va accéder / insérer dans la table alors que 1,4 million de travaux d'insertion sont en cours.

Sinon, vous pouvez simplement désactiver l'identité sur la colonne PK pendant la durée du travail?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top