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?

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

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

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

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


4

Ajoutez cette ligne au-dessus de votre requête

SET IDENTITY_INSERT tbl_content ON

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.