IDENTITY_INSERT est réglé sur OFF - Comment l'activer?

112

J'ai une base de données d'archives de fichiers supprimée 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 lier les fichiers). Je ne veux pas supprimer identity_insert de toute la table, car l'incrémentation de un fonctionne très bien. Dans ma TBL_Contentprocédure d' insertion pour stocker, j'ai quelque chose comme ça

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
SET IDENTITY_INSERT tbl_content ON
GO

ALTER procedure [dbo].[spInsertDeletedIntoTBLContent]
@ContentID int, 
...insert command...
SET IDENTITY_INSERT tbl_content OFF

Mais j'obtiens toujours la même erreur:

Impossible d'insérer une valeur explicite pour la colonne d'identité dans la table "TBL_Content" lorsque IDENTITY_INSERT est défini sur OFF.

De l'aide?

Spooks
la source

Réponses:

174

Devez-vous à la place définir l'insertion d'identité sur on dans la procédure stockée? Il semble que vous ne l'activez que lorsque vous modifiez la procédure stockée, pas lorsque vous l'appelez. Essayer:

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

SET IDENTITY_INSERT tbl_content ON

...insert command...

SET IDENTITY_INSERT tbl_content OFF
GO
David
la source
16

Ne devriez-vous pas définir identity_Insert ON, insérer les enregistrements puis le désactiver?

Comme ça:

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
...insert command...
SET IDENTITY_INSERT tbl_content OFF
Abe Miessler
la source
14

Je pense que cela doit être fait en un seul lot de requêtes. Fondamentalement, les instructions GO divisent vos commandes en plusieurs lots et cela est à l'origine du problème. Changez-le en ceci:

SET IDENTITY_INSERT tbl_content ON
/* GO */

...insert command...

SET IDENTITY_INSERT tbl_content OFF
GO
DCNYAM
la source
1
Tu as raison. C'est le point! Le prochain lot de commandes pour l'insertion doit commencer par SET IDENTITY_INSERT tbl_content ON; commande à nouveau.
Jettero
9

Rappel

SQL Server n'autorise qu'une seule table à avoir la propriété IDENTITY_INSERT définie sur ON.

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

Au lieu:

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
Edu
la source
4

Ajoutez cette ligne au-dessus de votre requête

SET IDENTITY_INSERT tbl_content ON
Ankit
la source
2

Ajouter un départ aussi

 SET IDENTITY_INSERT Genre ON

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

    SET IDENTITY_INSERT Genre  OFF
Narayan Yerrabachu
la source