IDENTITY_INSERT está desactivado - ¿Cómo activarlo?

111

Tengo una base de datos de archivo de archivos eliminados que almacena la ID del archivo que se eliminó, quiero que el administrador pueda restaurar el archivo (así como la misma ID para vincular archivos). No quiero quitar identity_insert de toda la tabla, ya que el incremento en uno funciona muy bien. En mi TBL_Contentprocedimiento de inserción para almacenar tengo algo como esto

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

Pero sigo recibiendo el mismo error:

No se puede insertar un valor explícito para la columna de identidad en la tabla 'TBL_Content' cuando IDENTITY_INSERT está establecido en OFF.

¿Alguna ayuda?

Fantasmas
fuente

Respuestas:

173

En su lugar, ¿debería activar la inserción de identidad dentro del procedimiento almacenado? Parece que lo está activando solo cuando cambia el procedimiento almacenado, no cuando realmente lo llama. Tratar:

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

SET IDENTITY_INSERT tbl_content ON

...insert command...

SET IDENTITY_INSERT tbl_content OFF
GO
David
fuente
16

¿No debería configurar identity_Insert ON, insertar los registros y luego apagarlo?

Me gusta esto:

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
fuente
14

Creo que debe hacerse en un solo lote de consultas. Básicamente, las declaraciones GO están dividiendo sus comandos en varios lotes y eso está causando el problema. Cámbielo a esto:

SET IDENTITY_INSERT tbl_content ON
/* GO */

...insert command...

SET IDENTITY_INSERT tbl_content OFF
GO
DCNYAM
fuente
1
Tienes razon. ¡Este es el punto! El siguiente lote de comandos para insertar debe comenzar con SET IDENTITY_INSERT tbl_content ON; comando de nuevo.
Jettero
9

Recordatorio

SQL Server solo permite que una tabla tenga la propiedad IDENTITY_INSERT establecida en ON.

Esto no funciona:

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

En lugar:

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
fuente
4

Agregue esta línea encima de su consulta

SET IDENTITY_INSERT tbl_content ON
Ankit
fuente
2

Añadir set off también

 SET IDENTITY_INSERT Genre ON

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

    SET IDENTITY_INSERT Genre  OFF
Narayan Yerrabachu
fuente