Saltar al contenido

Solo se puede especificar un valor explícito para la columna de identidad en la tabla cuando se usa una lista de columnas e IDENTITY_INSERT está en SQL Server

Nuestros mejores investigadores han agotado sus depósitos de café, por su búsqueda diariamente por la solución, hasta que Asia halló la solución en Beanstalk así que hoy la compartimos aquí.

Solución:

SET IDENTITY_INSERT tableA ON

Tienes que hacer una lista de columnas para tu instrucción INSERT:

INSERT Into tableA ([id], [c2], [c3], [c4], [c5] ) 
SELECT [id], [c2], [c3], [c4], [c5] FROM tableB

no como “INSERT Into tableA SELECT ……..”

SET IDENTITY_INSERT tableA OFF

Resumen

SQL Server no le permitirá insertar un valor explícito en una columna de identidad a menos que use una lista de columnas. Así, tienes las siguientes opciones:

  1. Haga una lista de columnas (ya sea manualmente o usando herramientas, vea a continuación)

O

  1. hacer la columna de identidad en tbl_A_archive un habitual, no identidad columna: si su tabla es una tabla de archivo y siempre especifica un valor explícito para la columna de identidad, ¿por qué necesita una columna de identidad? Simplemente use un int regular en su lugar.

Detalles sobre la solución 1

En vez de

SET IDENTITY_INSERT archive_table ON;

INSERT INTO archive_table
  SELECT *
  FROM source_table;

SET IDENTITY_INSERT archive_table OFF;

tienes que escribir

SET IDENTITY_INSERT archive_table ON;

INSERT INTO archive_table (field1, field2, ...)
  SELECT field1, field2, ...
  FROM source_table;

SET IDENTITY_INSERT archive_table OFF;

con field1, field2, ... que contiene los nombres de todas las columnas en sus tablas. Si desea generar automáticamente esa lista de columnas, eche un vistazo a la respuesta de Dave o la respuesta de Andomar.


Detalles sobre la solución 2

Desafortunadamente, no es posible simplemente “cambiar el tipo” de una columna int de identidad a una columna int sin identidad. Básicamente, tienes las siguientes opciones:

  • Si la tabla de archivo aún no contiene datos, suelte la columna y agregue una nueva sin identidad.

O

  • Utilice SQL Server Management Studio para configurar el Identity Specification/(Is Identity) propiedad de la columna de identidad en su tabla de archivo para No. Detrás de escena, esto creará una secuencia de comandos para volver a crear la tabla y copiar los datos existentes, por lo que, para hacerlo, también deberá desactivar Tools/Options/Designers/Table and Database Designers/Prevent saving changes that require table re-creation.

O

  • Utilice una de las soluciones alternativas descritas en esta respuesta: Eliminar identidad de una columna en una tabla

Si está utilizando SQL Server Management Studio, no tiene que escribir la lista de columnas usted mismo, simplemente haga clic con el botón derecho en la tabla en Explorador de objetos y elige Tabla de scripts como -> SELECCIONA para -> Nueva ventana del editor de consultas.

Si no es así, entonces una consulta similar a esta debería ayudar como punto de partida:

SELECT SUBSTRING(
    (SELECT ', ' + QUOTENAME(COLUMN_NAME)
        FROM INFORMATION_SCHEMA.COLUMNS
        WHERE TABLE_NAME = 'tbl_A'
        ORDER BY ORDINAL_POSITION
        FOR XML path('')),
    3,
    200000);

Aquí tienes las comentarios y puntuaciones

Recuerda que puedes difundir este enunciado si te ayudó.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags : /

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *