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?
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
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
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
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
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)
Ajouter cette ligne au-dessus de votre requête
SET IDENTITY_INSERT tbl_content ON
Ajoute aussi
SET IDENTITY_INSERT Genre ON
INSERT INTO Genre(Id, Name, SortOrder)VALUES (12,'Moody Blues', 20)
SET IDENTITY_INSERT Genre OFF