Copie tablas de una base de datos a otra en SQL Server

325

Tengo una base de datos llamada foo y una base de datos llamada bar. Tengo una tabla en foo llamada tblFoobar que quiero mover (datos y todo) a la barra de base de datos desde la base de datos foo. ¿Cuál es la instrucción SQL para hacer esto?

RyanKeeter
fuente

Respuestas:

208

En SQL Server? y en el mismo servidor de base de datos? Use nombres de tres partes.

INSERT INTO bar..tblFoobar( *fieldlist* )
SELECT *fieldlist* FROM foo..tblFoobar

Esto solo mueve los datos. Si desea mover la definición de la tabla (y otros atributos como permisos e índices), tendrá que hacer algo más.

Amy B
fuente
También tendrá que establecer por separado los permisos de la tabla, creo.
Ken Ray
1
Si también necesita insertar inserciones de identidad, el Asistente de importación de datos tiene una opción para eso ^^ - refiriéndose a la otra respuesta
Clarence Liu
13
@TahaRehmanSiddiqui: Porque responde a la pregunta;) No preguntó cómo copiarlo entre servidores de bases de datos. Pero la mayoría de las personas que buscan esa respuesta terminan aquí, porque Google la da como primer resultado :)
Maarten Kieft
1
@RyanB sí, eso está permitido.
Amy B
1
@Tom OP y muchas personas que vienen a esta pregunta están buscando una "declaración SQL", no una herramienta.
Amy B
535

La tarea "Importar datos" de SQL Server Management Studio (haga clic con el botón derecho en el nombre de la base de datos, luego las tareas) hará la mayor parte de esto por usted. Ejecútelo desde la base de datos en la que desea copiar los datos.

Si las tablas no existen, las creará para usted, pero probablemente tendrá que recrear cualquier índice y demás. Si las tablas existen, agregará los datos nuevos de forma predeterminada, pero puede ajustarlos (editar asignaciones) para eliminar todos los datos existentes.

Lo uso todo el tiempo y funciona bastante bien.

David
fuente
1
Parece que no puedo encontrar esta opción. ¿Hay algo versión específica aquí?
Nerrve
35
Realmente no se puede decir que es una mejor respuesta en general. Por ejemplo, no se puede utilizar la automatización desde un script. Por cierto, el autor solicitó específicamente una "declaración de SQL ...". Pero, por supuesto, es una gran respuesta, pero no una mejor;).
Grizzly
3
El autor solicitó mover "(datos y todo)"; Así que esperaba que esta respuesta hiciera eso. Crea la tabla pero no crea ninguna clave o índice; así que no hay una gran mejora con respecto a la respuesta SQL.
Unubar
¿Es posible especificar una WHEREcondición usando la tarea Importar datos? No pude encontrar una manera de hacerlo.
aplastar
1
sí, esta es la forma correcta como se menciona aquí también, pero identityy las foreign keyreferencias se eliminan en la base de datos de destino, ¿alguna solución?
shaijut
106

Esto debería funcionar:

SELECT * 
INTO DestinationDB..MyDestinationTable 
FROM SourceDB..MySourceTable 

Será no copiar constaints, incumplimientos o índices. La tabla creada no tendrá un índice agrupado.

Alternativamente, usted podría:

INSERT INTO DestinationDB..MyDestinationTable 
SELECT * FROM SourceDB..MySourceTable

Si su tabla de destino existe y está vacía.

leoinfo
fuente
¿Hay algún problema si primero copia la estructura de la tabla base (campos y datos) y luego aplica un script de parche para crear permisos, índices, restricciones y propiedades extendidas?
leoinfo
44
Esto no insertará valores para las columnas de identidad en SQL Server 2008. Eso solo se permite cuando usa una lista de columnas e IDENTITY_INSERT está ACTIVADO para la tabla de destino.
Lucas Wilson-Richter
@Lucas - Tienes razón "mitad" :). Sin embargo, la primera instrucción SQL copia TODOS los datos, incluidos los valores dentro de las columnas de identidad. Como dije, las restricciones no se crean. Pero se pueden crear fácilmente en el DB de origen y aplicarse al DB de destino una vez que se mueven todos los datos.
leoinfo
La segunda versión ( INSERT INTO...) funcionó para mí en Oracle.
vapcguy
¿Funciona esto si las 2 bases de datos están en servidores totalmente diferentes con diferentes cadenas de conexión? Si no, ¿cómo manejas eso?
Alexander Ryan Baggett
46

Si solo es una tabla, entonces todo lo que necesita hacer es

  • Definición de tabla de script
  • Crear nueva tabla en otra base de datos
  • Actualizar reglas, índices, permisos y demás
  • Importar datos (varias inserciones en ejemplos ya se muestran arriba)

Una cosa que tendrá que considerar es otras actualizaciones, como la migración de otros objetos en el futuro. Tenga en cuenta que sus tablas de origen y destino no tienen el mismo nombre. Esto significa que también tendrá que hacer cambios si depende de objetos como vistas, procedimientos almacenados y otros.

Con uno o varios objetos puede ir manualmente sin problemas. Sin embargo, cuando hay más que unas pocas actualizaciones, las herramientas de comparación de terceros son muy útiles. En este momento estoy usando ApexSQL Diff para migraciones de esquemas, pero no puedes equivocarte con ninguna otra herramienta.

Igor Voplov
fuente
23
  1. Guión del create tableManagement Studio, ejecute esa secuencia de comandos en la barra para crear la tabla. (Haga clic con el botón derecho en la tabla en el explorador de objetos, la tabla de scripts como, crear para ...)

  2. INSERT bar.[schema].table SELECT * FROM foo.[schema].table

ScottStonehouse
fuente
1
Me gusta este enfoque. Seleccionar * no funcionará si hay una columna de identidad, sin embargo, deberá enumerar explícitamente los nombres de las columnas. También deberá hacerlo SET IDENTITY_INSERT TblName ONen ese caso.
JeremyWeir
16

También puede usar el Asistente para generar scripts de SQL Server para ayudar a guiar la creación de scripts de SQL que pueden hacer lo siguiente:

  • copia el esquema de la tabla
  • cualquier restricción (identidad, valores predeterminados, etc.)
  • datos dentro de la tabla
  • y muchas otras opciones si es necesario

Buen ejemplo de flujo de trabajo para SQL Server 2008 con capturas de pantalla que se muestran aquí .

Ryan
fuente
Ver mis comentarios anteriores:?!? "¿Cómo ha llegado esto 508/171 Votos y Ryan de 'Oct 11 '11 a las 23:41' respuesta sólo recibe 13 hasta la fecha de Ryan es la única respuesta que la respuesta de la q de la operación. Por completo . Debido a que se maneja estos escenarios (que, por cierto, el OP NO excluyó de su q.): a) Identidad ( muy común), b) Restricciones, c) Disparadores, d) Índices, e) Permisos, d) copia de Esquema Y Datos ( Sugerencia: la parte "y todo" de las operaciones "(datos y todo)" implica también el esquema.) Y e) genera "sentencias SQL" que la operación especificó que, incluso si no quiso decir que literalmente es mejor tener que no.".
Tom
1
Nota: Esta respuesta solo es práctica cuando el número de filas no es "excesivo" (es decir, tablas de búsqueda / transacciones pequeñas) y no hay valores de columna "grandes". Para ellos, usaría la Respuesta de Ryan solo para generar el Script para la Creación de la Tabla (incluyendo Atributos de Columna y Sub-Objetos), y luego usaría la Respuesta "Insertar en Seleccionar" de David B. Para las Tablas individuales (en lugar de la A de Ryan), también puede usar SSMS, Explorador de objetos, Tabla de clic derecho, Tabla de secuencia de comandos como, CREAR en, pero primero debe asegurarse de que Herramientas, Opciones, Explorador de objetos de SQL Server y Opciones de secuencia de comandos sean establecer como se desee.
Tom
9

Puede ir de esta manera: (un ejemplo general)

insert into QualityAssuranceDB.dbo.Customers (columnA, ColumnB)
Select columnA, columnB from DeveloperDB.dbo.Customers

Además, si necesita generar los nombres de columna y poner una cláusula de inserción, use:

    select (name + ',') as TableColumns from sys.columns 
where object_id = object_id('YourTableName')

Copie el resultado y péguelo en la ventana de consulta para representar los nombres de columna de su tabla e incluso esto también excluirá la columna de identidad:

    select (name + ',') as TableColumns from sys.columns 
where object_id = object_id('YourTableName') and is_identity = 0

Recuerde que el script para copiar filas funcionará si las bases de datos pertenecen a la misma ubicación.


Puedes probar esto.

select * into <Destination_table> from <Servername>.<DatabaseName>.dbo.<sourceTable>

El nombre del servidor es opcional si ambos DB están en el mismo servidor.

Nunca sin esperanza
fuente
1

Si hay una tabla existente y queremos copiar solo datos, podemos probar esta consulta.

insertar en Destination_Existing_Tbl seleccione col1, col2 FROM Source_Tbl

Mohan
fuente
0

Copiar datos

INSERT INTO Alfestonline..url_details(url,[status],recycle) 
SELECT url,status,recycle FROM AlfestonlineOld..url_details
Arun Prasad ES
fuente