Cómo copiar una fila de una tabla de SQL Server a otra

93

Tengo dos tablas idénticas y necesito copiar filas de una tabla a otra. ¿Cuál es la mejor forma de hacerlo? (Necesito copiar programáticamente solo algunas filas, no necesito usar la utilidad de copia masiva).

rp.
fuente

Respuestas:

120

Siempre que no haya columnas de identidad, puede simplemente

INSERT INTO TableNew
SELECT * FROM TableOld
WHERE [Conditions]
Scott Nichols
fuente
23
Tenga cuidado con esta sintaxis, ya que no funcionará si Table2 tiene una columna de identidad y se romperá en el futuro si Table1 alguna vez cambia sin que Table2 cambie en sincronización (me quemó antes). Esta solución puede ser perfecta para su caso, solo tenga en cuenta estas consideraciones.
Michael Haren
11
Puede usar SET IDENTITY_INSERT < table > ON(y SET IDENTITY_INSERT < table > OFF) para deshabilitar temporalmente la columna de identidad en la tabla en la que está tratando de insertar. Me funcionó al intentar restaurar algunos registros faltantes en medio del conjunto de datos.
nickb
1
¿Qué pasa si la clave principal en la tabla1 existe en la tabla2 como una clave externa? Tengo lo mismo y no sé qué hacer ... en la tabla2 identifique la clave externa AS "Technology_idTechnology" y en la tabla 1, está allí como "idTechnology" Quiero copiar todas las entradas de la tabla1 a table2, cuando idTechnology coincide en ambas tablas ..
ZelelB
71

Sintaxis alternativa:

INSERT tbl (Col1, Col2, ..., ColN)
  SELECT Col1, Col2, ..., ColN
  FROM Tbl2
  WHERE ...

La consulta de selección puede (por supuesto) incluir expresiones, declaraciones de casos, constantes / literales, etc.

Michael Haren
fuente
2
Esto es genial cuando las tablas difieren ligeramente. Tengo algunas columnas adicionales en mi segunda tabla y la respuesta aceptada no funciona con MSSQL, ya que deben ser idénticas.
Tony M
39

La respuesta de Jarrett crea una nueva tabla.

La respuesta de Scott se inserta en una tabla existente con la misma estructura.

También puede insertar en una tabla con estructura diferente:

INSERT Table2
(columnX, columnY)
SELECT column1, column2 FROM Table1
WHERE [Conditions]
ScottStonehouse
fuente
6
@ScottStonehouse: si recopila todas las demás respuestas en esta respuesta como lo ha hecho pero con código (haciéndola completa), definitivamente se convertirá en la mejor respuesta.
Michael Haren
6
INSERT INTO DestTable
SELECT * FROM SourceTable
WHERE ... 

funciona en SQL Server

Kaniu
fuente
2
Esto solo funciona cuando DestTable no existe. Obtendrá un error si se crea DestTable antes de esta consulta.
Un desarrollador web
2
En realidad, falla si la tabla de destino no existe. Puede causar errores si la DestTable existente no está vacía.
Kaniu
5
SELECT * INTO < new_table > FROM < existing_table > WHERE < clause >
Jarrett Meyer
fuente
1
¿Hay alguna forma de hacer esto si estas dos tablas están en bases de datos diff en sql-server?
Naresh
9
¡Por supuesto! Simplemente califique completamente la base de datos. [nombre del servidor]. [esquema]. [tabla]. Por ejemploSELECT * INTO [SQLTEST].[dbo].[EMPLOYEES] FROM [SQLPROD].[dbo].[EMPLOYEES]
Jarrett Meyer
4
Esto crea una nueva tabla, que no es lo que pide el OP.
Conrad