IDENTITY_INSERT è impostato su OFF - Come attivarlo?


112

Ho un database di archivio di file cancellato che memorizza l'ID del file che è stato cancellato, desidero che l'amministratore sia in grado di ripristinare il file (così come lo stesso ID per il collegamento dei file). Non voglio togliere identity_insert dall'intera tabella, poiché l'incremento di uno funziona alla grande. Nel mio inserto per TBL_Contentmemorizzare la procedura ho qualcosa di simile

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

Ma continuo a ricevere lo stesso errore:

Impossibile inserire un valore esplicito per la colonna Identity nella tabella "TBL_Content" quando IDENTITY_INSERT è impostato su OFF.

Qualsiasi aiuto?

Risposte:


174

Dovresti invece impostare l'inserimento dell'identità su attivo all'interno della stored procedure? Sembra che tu lo stia impostando solo quando si modifica la stored procedure, non quando la si chiama effettivamente. Provare:

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

SET IDENTITY_INSERT tbl_content ON

...insert command...

SET IDENTITY_INSERT tbl_content OFF
GO

16

Non dovresti impostare identity_Insert su ON, inserire i record e poi spegnerlo?

Come questo:

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

Credo che debba essere fatto in un singolo batch di query. Fondamentalmente, le istruzioni GO suddividono i tuoi comandi in più batch e questo sta causando il problema. Cambialo in questo:

SET IDENTITY_INSERT tbl_content ON
/* GO */

...insert command...

SET IDENTITY_INSERT tbl_content OFF
GO

1
Hai ragione. Questo è il punto! Il successivo batch di comandi per l'inserimento dovrebbe iniziare con SET IDENTITY_INSERT tbl_content ON; comando di nuovo.
Jettero

9

Promemoria

SQL Server consente solo a una tabella di avere la proprietà IDENTITY_INSERT impostata su ON.

Questo non funziona:

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

Anziché:

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

Aggiungi questa riga sopra Query

SET IDENTITY_INSERT tbl_content ON

2

Aggiungi anche il set

 SET IDENTITY_INSERT Genre ON

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

    SET IDENTITY_INSERT Genre  OFF
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.