Published on

June 8, 2019

Comprendiendo la declaración SET IDENTITY_INSERT de SQL Server

¿Alguna vez te has encontrado con un error al intentar insertar datos en tablas con columnas de identidad en SQL Server? Si es así, no estás solo. En este artículo, exploraremos el concepto de la declaración SET IDENTITY_INSERT y cómo puede ayudarte a superar este problema.

Comencemos con un escenario en el que tenemos dos tablas con columnas de identidad definidas:

CREATE TABLE dbo.[User] (
    Id int identity,
    UserName varchar(40)
);

CREATE TABLE dbo.StupidQuestions (
    Id bigint identity,
    UserId int,
    Question varchar(400)
);

Ahora, supongamos que queremos copiar los datos de estas tablas en otras dos tablas con fines de prueba:

CREATE TABLE dbo.User_DEV (
    Id int identity,
    UserName varchar(40)
);

CREATE TABLE dbo.StupidQuestions_DEV (
    Id bigint identity,
    UserId int,
    Question varchar(400)
);

Al principio, podríamos pensar que una simple declaración INSERT INTO SELECT haría el trabajo:

INSERT INTO dbo.User_DEV
SELECT Id, UserName
FROM dbo.[User];

INSERT INTO dbo.StupidQuestions_DEV
SELECT Id, UserId, Question
FROM dbo.StupidQuestions;

Sin embargo, al ejecutar estas declaraciones, SQL Server arroja un error indicando que no podemos insertar datos en tablas que contienen columnas de identidad sin habilitar primero las inserciones de identidad. Para solucionar esto, necesitamos usar la declaración SET IDENTITY_INSERT:

SET IDENTITY_INSERT dbo.User_DEV ON;
SET IDENTITY_INSERT dbo.StupidQuestions_DEV ON;

Pero espera, incluso después de habilitar las inserciones de identidad, aún encontramos un error. Esto se debe a que SQL Server solo permite que una tabla tenga habilitada la propiedad IDENTITY_INSERT a la vez dentro de cada sesión.

La solución es simple: habilita las inserciones de identidad y copia los datos de cada tabla uno a la vez:

SET IDENTITY_INSERT dbo.User_DEV ON;
INSERT INTO dbo.User_DEV (Id, UserName)
SELECT Id, UserName
FROM dbo.[User];
SET IDENTITY_INSERT dbo.User_DEV OFF;

SET IDENTITY_INSERT dbo.StupidQuestions_DEV ON;
INSERT INTO dbo.StupidQuestions_DEV (Id, UserId, Question)
SELECT Id, UserId, Question
FROM dbo.StupidQuestions;
SET IDENTITY_INSERT dbo.StupidQuestions_DEV OFF;

En retrospectiva, vale la pena señalar que existen métodos alternativos para mover datos, como utilizar el Asistente de Exportación de Datos en SSMS o un paquete SSIS dedicado. Estas opciones suelen ser más fáciles y convenientes, especialmente cuando se trata de migración de datos entre servidores o actualización regular de tablas con datos de prueba.

Sin embargo, es importante comprender los detalles de implementación y las limitaciones de estos métodos. Al comprender mejor la declaración SET IDENTITY_INSERT de SQL Server, puedes manejar con confianza escenarios en los que necesites insertar datos en tablas con columnas de identidad.

Recuerda, al encontrar errores relacionados con inserciones de identidad, verifica si la propiedad IDENTITY_INSERT está habilitada para la tabla en la que estás intentando insertar. Si no lo está, utiliza la declaración SET IDENTITY_INSERT para habilitarla antes de realizar la operación de inserción.

Eso es todo para este artículo. Esperamos que te haya sido útil para comprender la declaración SET IDENTITY_INSERT de SQL Server. ¡Mantente atento para más consejos y trucos de SQL Server!

Click to rate this post!
[Total: 0 Average: 0]

Let's work together

Send us a message or book free introductory meeting with us using button below.