web-dev-qa-db-fra.com

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

J'ai une base de données d'archives de fichiers supprimés qui stocke l'ID du fichier qui a été supprimé. Je souhaite que l'administrateur puisse restaurer le fichier (ainsi que le même identifiant pour la liaison de fichiers). Je ne veux pas enlever identity_insert à la totalité de la table, car l'incrément augmente de 1%. Dans ma procédure d'insertion dans le magasin 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, 
...insert command...
SET IDENTITY_INSERT tbl_content OFF

Mais je continue à avoir 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?

86
Spooks

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

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

SET IDENTITY_INSERT tbl_content ON

...insert command...

SET IDENTITY_INSERT tbl_content OFF
GO
139
David

Ne devriez-vous pas configurer identity_Insert ON, insérer les enregistrements puis les 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
15
Abe Miessler

Je crois que cela doit être fait en un seul lot de requête. Fondamentalement, les instructions GO divisent vos commandes en plusieurs lots, ce qui 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
11
DCNYAM

Rappel

SQL Server permet uniquement à une table d'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
9
Edu

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

Ma table s'appelle Genre avec les 3 colonnes de 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) 
5
DoesEatOats

Ajouter cette ligne au-dessus de votre requête

SET IDENTITY_INSERT tbl_content ON
3
Ankit

Ajoute aussi

 SET IDENTITY_INSERT Genre ON

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

    SET IDENTITY_INSERT Genre  OFF
0