2008-10-23 7 views
1

Dans mon eternalsaga 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.L'équivalent de la base de données SET IDENTITY_INSERT OFF

Cependant, parce que le script original contenait

SET IDENTITY_INSERT [Table] OFF 

et SET est une commande de session à l'échelle, ce paramètre se perd sur chaque appel SQL, ce qui signifie que chaque ligne est défaillante. Y at-il un moyen de définir IDENTITY_INSERT off pour la table entière, à l'échelle de la base de données juste pour que je puisse faire ces appels individuels sans qu'ils échouent? Ou peut-être que je peux lui dire d'ignorer la spécification d'identité en ajoutant une commande à chaque ligne?

Répondre

5

BULK INSERT ne fonctionnera pas pour vous? Ou l'Assistant Importation/Exportation SQL Server (here ou here)? Je sais que l'importation/exportation peut désactiver l'insertion d'identité pour toute l'importation. Je suis raisonnablement certain que vous pouvez le faire juste avant BULK INSERT

+0

Vous pouvez également consulter l'utilitaire bcp pour ce faire, il est spécialement conçu pour cette tâche. http://msdn.microsoft.com/en-us/library/ms162802.aspx Il existe une option de ligne de commande permettant à bcp de remplacer la colonne d'identité par un fichier spécifié à partir de vos données d'importation. – esarjeant

+0

J'ai fini par devoir convertir mon script SQL en un fichier délimité par des tabulations, puis utiliser bcp pour l'importer. C'était beaucoup plus compliqué que ça aurait dû être! – tags2k

0

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

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

si l'application exécutera 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; 
0

Quelque chose ne va d'autre à accéder à/insérer à la table alors que c'est de 1,4 million emplois d'insertion est en cours. Si ce n'est pas le cas, vous pouvez simplement désactiver l'identité sur la colonne PK pendant la durée du travail.

Questions connexes