142 votes

IDENTITY_INSERT est défini sur OFF - Comment l'activer ?

J'ai une base de données d'archive de fichiers supprimés qui stocke l'ID du fichier qui a été supprimé. Je veux que l'administrateur puisse restaurer le fichier (ainsi que le même ID pour relier les fichiers). Je ne veux pas désactiver l'insertion d'identité sur l'ensemble de la table, car l'incrémentation de un fonctionne très bien. Dans ma procédure de stockage de TBL_Content j'ai quelque chose comme ceci

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
SET IDENTITY_INSERT tbl_content ON
GO

ALTER procedure [dbo].[spInsertDeletedIntoTBLContent]
@ContentID int, 
...commande d'insertion...
SET IDENTITY_INSERT tbl_content OFF

Mais je continue à obtenir la même erreur :

Cannot insert explicit value for identity column in table 'TBL_Content' when IDENTITY_INSERT is set to OFF.

Une aide quelconque ?

216voto

David Points 65209

Devriez-vous plutôt activer l'insertion d'identité dans la procédure stockée ? Il semble que vous l'activiez seulement lorsque vous modifiez la procédure stockée, pas lorsque vous l'appelez réellement. Essayez :

ALTER procedure [dbo].[spInsertDeletedIntoTBLContent]
@ContentID int, 

SET IDENTITY_INSERT tbl_content ON

...commande d'insertion...

SET IDENTITY_INSERT tbl_content OFF
GO

25voto

NYSystemsAnalyst Points 6197

Je crois que cela doit être fait en une seule requête. Fondamentalement, les instructions GO divisent vos commandes en plusieurs lots et cela cause le problème. Modifiez-le comme ceci :

SET IDENTITY_INSERT tbl_content ON
/* GO */

...commande d'insertion...

SET IDENTITY_INSERT tbl_content OFF
GO

18voto

Abe Miessler Points 34869

Ne devriez-vous pas activer identity_Insert, insérer les enregistrements, puis le désactiver de nouveau?

Comme ceci :

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
SET IDENTITY_INSERT tbl_content ON
GO

ALTER procedure [dbo].[spInsertDeletedIntoTBLContent]
@ContentID int,
SET IDENTITY_INSERT tbl_content ON
...commande d'insertion...
SET IDENTITY_INSERT tbl_content OFF

14voto

Edu Points 1192

Rappel

SQL Server ne permet qu'à une seule table d'avoir la propriété IDENTITY_INSERT activée.

Cela ne fonctionne pas:

SET IDENTITY_INSERT TableA ON
SET IDENTITY_INSERT TableB ON
... INSERT ON TableA ...
... INSERT ON TableB ...
SET IDENTITY_INSERT TableA OFF
SET IDENTITY_INSERT TableB OFF

A la place:

SET IDENTITY_INSERT TableA ON
... INSERT ON TableA ...
SET IDENTITY_INSERT TableA OFF
SET IDENTITY_INSERT TableB ON
... INSERT ON TableB ...
SET IDENTITY_INSERT TableB OFF

7voto

DoesEatOats Points 21

La référence: http://technet.microsoft.com/en-us/library/aa259221%28v=sql.80%29.aspx

Ma table est nommée Genre avec les 3 colonnes Id, Name et SortOrder

Le code que j'ai utilisé est le suivant:

SET IDENTITY_INSERT Genre ON

INSERT INTO Genre(Id, Name, SortOrder)VALUES (12,'Moody Blues', 20)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X