Estoy tratando de hacer esta consulta
INSERT INTO dbo.tbl_A_archive
SELECT *
FROM SERVER0031.DB.dbo.tbl_A
pero incluso después de correr
set identity_insert dbo.tbl_A_archive on
Recibo este mensaje de error
Un valor explícito para la columna de identidad en la tabla 'dbo.tbl_A_archive' solo se puede especificar cuando se utiliza una lista de columnas y IDENTITY_INSERT está ACTIVADO.
tbl_A
es una tabla enorme en filas y ancho, es decir, tiene MUCHAS columnas. No quiero tener que escribir todas las columnas manualmente. ¿Cómo puedo hacer que esto funcione?
sql-server
jhowe
fuente
fuente
Respuestas:
Resumen
SQL Server no le permitirá insertar un valor explícito en una columna de identidad a menos que use una lista de columnas. Por lo tanto, tiene las siguientes opciones:
O
tbl_A_archive
una columna normal, sin identidad : 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? Solo usa un int regular en su lugar.Detalles sobre la solución 1
En vez de
necesitas escribir
con
field1, field2, ...
contener 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, tiene las siguientes opciones:
O
Identity Specification
/(Is Identity)
de la columna de identidad en su tabla de archivoNo
. 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á desarmarTools
/Options
/Designers
/Table and Database Designers
/Prevent saving changes that require table re-creation
.O
fuente
Debe hacer una lista de columnas para su instrucción INSERT:
no como "INSERTAR en la tabla A SELECCIONAR ........"
fuente
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 el Explorador de objetos y elija Tabla de secuencias de comandos como -> SELECCIONAR para -> Nueva ventana del editor de consultas .
Si no lo está, una consulta similar a esta debería ayudar como punto de partida:
fuente
De acuerdo con la respuesta de Heinzi. Para la opción del primer segundo, aquí hay una consulta que genera una lista de columnas separadas por comas en una tabla:
Para tablas grandes, esto puede ahorrar mucho trabajo de escritura :)
fuente
Si la tabla "archivo" está destinada a ser una copia exacta de su tabla principal, entonces le sugiero que elimine el hecho de que la identificación es una columna de identidad. De esa manera te permitirá insertarlos.
Alternativamente, puede permitir y no permitir las inserciones de identidad para la tabla con la siguiente instrucción
Finalmente, si necesita que la columna de identidad funcione como está, siempre puede ejecutar el proceso almacenado.
Esto le devolverá todas las columnas de la tabla que luego puede cortar y pegar en su consulta. (Esto es SIEMPRE mejor que usar un *)
fuente
Para la instrucción SQL, también debe especificar la lista de columnas. Por ej.
en vez de
fuente
Ambos funcionarán, pero si aún obtiene un error al usar el n. ° 1, vaya al n. ° 2
1)
2)
fuente
Para completar todos los nombres de columna en una lista delimitada por comas para una instrucción Select para las soluciones mencionadas para esta pregunta, utilizo las siguientes opciones, ya que son un poco menos detalladas que la mayoría de las respuestas aquí. Sin embargo, la mayoría de las respuestas aquí todavía son perfectamente aceptables.
1)
2) Este es probablemente el enfoque más simple para crear columnas, si tiene SSMS de SQL Server.
fuente
Debe especificar el nombre de las columnas que desea insertar si hay una columna de identidad. Entonces el comando será así a continuación:
Si su tabla tiene muchas columnas, obtenga el nombre de esas columnas con este comando.
(después de eliminar la última coma (',')) Simplemente copie el nombre de las columnas anteriores.
fuente
Esto debería funcionar. Acabo de encontrarme con tu problema:
Desafortunadamente, parece que necesita una lista de las columnas, incluida la columna de identidad, para insertar registros que especifiquen la identidad. Sin embargo , NO TIENE que enumerar las columnas en SELECT. Como sugirió @Dave Cluderay, esto dará como resultado una lista formateada para que copie y pegue (si tiene menos de 200000 caracteres).
Agregué USE porque estoy cambiando entre instancias.
fuente
Así no
fuente
Este fragmento de código muestra cómo insertar en la tabla cuando la columna de clave primaria de identidad está activada.
fuente
Por si desea insertar sus valores de una tabla a otra a través de un procedimiento almacenado. He utilizado este y este , el último, que es casi como la respuesta de Andomar.
fuente
Hay una o más columnas que tienen la propiedad de incremento automático o el valor de ese atributo se calculará como restricciones. Estás intentando modificar esa columna.
Hay dos maneras de resolverlo 1) Mencione explícitamente otras columnas y establezca sus valores solamente y la clave primaria o el valor de columna de incremento automático se establecerán automáticamente.
2) Puede activar INDENTITY_INSERT luego ejecutar su consulta de inserción y finalmente desactivar IDENTITY_INSERT.
Sugerencia: siga el primer paso porque es un enfoque más adecuado y eficiente.
Para obtener más información, lea este artículo sobre SQL-helper .
fuente
Asegúrese de que los nombres de columna, los tipos de datos y el orden en la tabla desde la que selecciona los registros sean exactamente los mismos que en la tabla de destino. La única diferencia debería ser que la tabla de destino tiene una columna de identidad como la primera columna, que no está allí en la tabla de origen.
Estaba enfrentando un problema similar cuando estaba ejecutando "INSERT INTO table_Dest SELECT * FROM table_source_linked_server_excel". Las mesas tenían 115 columnas.
Tenía dos tablas de este tipo donde estaba cargando datos de Excel (como servidor vinculado) en tablas en la base de datos. En las tablas de la base de datos, había agregado una columna de identidad llamada 'id' que no estaba allí en Excel de origen. Para una tabla, la consulta se ejecutó correctamente y en otra recibí el error "Un valor explícito para la columna de identidad en la tabla solo se puede especificar cuando se usa una lista de columnas y IDENTITY_INSERT está en SQL Server". Esto fue desconcertante ya que el escenario era exactamente el mismo para ambas consultas. Así que investigué esto y lo que encontré fue que en la consulta donde recibía un error con INSERT INTO ... SELECT *:
Después de hacer los dos cambios anteriores, la consulta INSERT INTO ... SELECT * se ejecutó correctamente. La columna de identidad en la tabla de destino generó valores de identidad para cada fila insertada como se esperaba.
Por lo tanto, aunque la tabla de destino puede tener una columna de identidad que no está en la tabla de origen, INSERT INTO ... SELECT * se ejecutará correctamente si los nombres, los tipos de datos y el orden de las columnas en el origen y el destino son exactamente los mismos.
Espero que ayude a alguien.
fuente
Creo que este error ocurre debido a la falta de coincidencia con el número de columnas en la definición de la tabla y el número de columnas en la consulta de inserción. Además, la longitud de la columna se omite con el valor introducido. Así que solo revise la definición de la tabla para resolver este problema
fuente