¿Cómo activar y desactivar IDENTITY_INSERT usando SQL Server 2008?

461

¿Por qué recibo un error al insertar cuando IDENTITY_INSERTestá desactivado?

¿Cómo lo activo correctamente en SQL Server 2008? ¿Es mediante el uso de SQL Server Management Studio?

He ejecutado esta consulta:

SET IDENTITY_INSERT Database. dbo. Baskets ON

Luego recibí el mensaje en la consola que indica que los comandos se completaron con éxito. Sin embargo, cuando ejecuto la aplicación, todavía me da el error que se muestra a continuación:

Cannot insert explicit value for identity column in table 'Baskets' when 
IDENTITY_INSERT is set to OFF.
Principiante
fuente
Expanda esta pregunta para que podamos entender lo que está tratando de hacer. ¿Qué enunciado está ejecutando cuando encuentra este error y cuál es el texto real del mensaje de error?
Matt Gibson
Aunque haya hecho otra pregunta, debe aceptar una respuesta aquí: contestamos lo que solicitó .
gbn
8
Me horroriza la idea de que alguien esté tratando de enviar valores de identidad desde una aplicación. Esto no es algo que debería estar haciendo, excepto por la migración de datos poco frecuente. Si está haciendo esto con suficiente frecuencia como para ejecutarlo desde una aplicación, entonces probablemente deba volver a visitar el diseño de su tabla.
HLGEM
Estoy usando esto en mi copia de seguridad con script SQL. Durante la restauración, esto me permite cargar los datos en una tabla autoincrementada con valores originales. La copia de seguridad con script me permitió degradar la base de datos SQL. La realización del Management Studio de la copia de seguridad con script crea un script que no se puede cargar si almaceno datos binarios en un campo de texto.
Jettero

Respuestas:

771

Vía SQL según MSDN

SET IDENTITY_INSERT sometableWithIdentity ON

INSERT INTO sometableWithIdentity 
    (IdentityColumn, col2, col3, ...)
VALUES 
    (AnIdentityValue, col2value, col3value, ...)

SET IDENTITY_INSERT sometableWithIdentity OFF

El mensaje de error completo le dice exactamente qué está mal ...

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

gbn
fuente
@Beginner: lo eres, de ahí el error. ¿Cómo debemos saber que no desea insertar valores? Solo tenemos un mensaje de error
gbn
3
El error es de mi aplicación cuando hago DB.SaveChanges ();
Principiante
55
No, simplemente deje de enviar un valor para la columna de identidad. O configúrelo si lo desea en su aplicación si desea enviar un valor ..... pero entonces ¿por qué tener una columna con la propiedad de identidad establecida para generar valores? No podemos decidir por usted
gbn
22
@Beginner: la configuración solo es aplicable en la sesión actual (nadie lo señaló para esta pregunta), por lo que su aplicación tendría que activarla para que la aplicación realice tales inserciones (y probablemente sea mejor activarla rápidamente) se apaga nuevamente cuando se terminan tales inserciones, como gbn shows). La forma en que estaba insertando un valor en la columna de identidad sin darse cuenta de que no está claro, pero tal vez las versiones anteriores de SQL Server lo incluirían implícitamente con todas las columnas cuando las columnas de inserción explícita no están especificadas (?) Como parece sugerir Ismael.
Rob Parker
2
@Rob, creo que tienes un punto y yo personalmente no puedo revisar el código de cualquier código que no se inserte sin especificar columnas. Aparte del tiempo perdido en un error, esta es una práctica arriesgada y puede terminar con serios problemas de integridad de datos si los datos de la columna no coinciden correctamente.
HLGEM
59

Tuve un problema en el que no me permitía insertarlo incluso después de configurar IDENTITY_INSERT ON.

El problema fue que no especifiqué los nombres de columna y por alguna razón no me gustó.

INSERT INTO tbl Values(vals)

Básicamente, haga todo el INSERT INTO en valores tbl (cols) (vals)

Ismael
fuente
66
no hagas preguntas en el panel de respuestas.
Duk
44
esto era exactamente lo que quería de mí, especificar la lista de columnas (ambas columnas sobre la mesa, bla)
Maslow
36

Importar: debe escribir columnas en la INSERTdeclaración

INSERT INTO TABLE
SELECT * FROM    

No es correcto.

Insert into Table(Field1,...)
Select (Field1,...) from TABLE

Es correcto

R.Alonso
fuente
2
Gracias, eso fue muy útil
José Romero
1
Si tiene columnas idénticas en ambas tablas, puede hacerlo sin enumerar las columnas en la selección (Campo1 ...) de esta manera ... Insertar en la Tabla (Campo1, ...) Seleccione * de la TABLA ... y si tiene Campo de identidad para insertar primero hacer ** SET IDENTITY_INSERT Table_name ON
user3590235
@ user3590235 Es una suposición arriesgada, que la lista de columnas es idéntica. Fuera de las consultas manuales del usuario, nunca haga eso, porque le garantizo que romperá PROD algún día cuando alguien más modifique la definición de la tabla sin actualizar su referencia.
Elaskanator
5

Sé que este es un hilo antiguo, pero me topé con esto. Si el usuario está intentando ejecutar inserciones en la columna Identidad después de alguna otra sesión Establecer IDENTITY_INSERT ON, entonces está obligado a obtener el error anterior.

El establecimiento del valor Insertar identidad y los siguientes comandos Insertar DML se ejecutarán en la misma sesión.

Aquí @Beginner estaba configurando Identity Insert ON por separado y luego ejecutaba las inserciones desde su aplicación. Es por eso que obtuvo el siguiente error:

Cannot insert explicit value for identity column in table 'Baskets' when 
IDENTITY_INSERT is set to OFF.
aok
fuente
0

Esto es probable cuando tiene un campo PRIMARY KEY y está insertando un valor que se está duplicando o tiene el indicador INSERT_IDENTITY activado.

seanyp20001
fuente
0

Parece necesario poner un SET IDENTITY_INSERT Database.dbo.Baskets ON;antes de cada INSERTlote de envío de SQL .

Puede enviar varios INSERT ... VALUES ...comandos comenzados con una SET IDENTITY_INSERT ... ON;cadena al principio. Simplemente no coloque ningún separador de lotes entre.

No sé por qué SET IDENTITY_INSERT ... ONdeja de funcionar después del bloqueo de envío (por ejemplo: .ExecuteNonQuery()en C #). Tuve que poner de SET IDENTITY_INSERT ... ON;nuevo al comienzo de la siguiente cadena de comandos SQL.

Jettero
fuente
tal vez esto responda su pregunta: stackoverflow.com/questions/5791941/…
Demetris Leptos
0

Otra opción es donde tiene tablas como 'tipo' o 'estado', por ejemplo, OrderStatus, donde siempre desea controlar el valor de Id, crear la columna Id (Clave primaria) sin que sea una columna de identidad es el primer lugar.

Robert Brooker
fuente
-1

Debe agregar el comando 'ir' después de configurar la inserción de identidad. Ejemplo:

SET IDENTITY_INSERT sometableWithIdentity ON
go

INSERT sometableWithIdentity (IdentityColumn, col2, col3, ...)
VALUES (AnIdentityValue, col2value, col3value, ...)

SET IDENTITY_INSERT sometableWithIdentity OFF
go
Bruce
fuente
55
Esta pregunta tiene cuatro años y tiene una respuesta aceptada. Su respuesta duplica la respuesta aceptada
Ghost
13
Bueno, no es una duplicación exacta: sí incluyó los comandos "ir" ...;)
RoastBeast