Copiar (cientos de) tablas de un servidor a otro (con SSMS)


27

Tengo varios cientos (actualmente 466, pero cada vez más) tablas que tengo que copiar de un servidor a otro.

Nunca he tenido que hacer esto antes, así que no estoy seguro de cómo abordarlo. Todas las tablas están en el mismo formato:Cart<Eight character customer number>

Esto es parte de un proyecto más amplio del cual estoy fusionando todas estas Cart<Number>tablas en una Cartstabla, pero esa es una pregunta completamente diferente.

¿Alguien tiene un método de mejores prácticas que pueda usar para copiar todas estas tablas? Los nombres de la base de datos en ambos servidores son los mismos, si eso ayuda. Y como dije antes, tengo la sacuenta para poder hacer lo que sea necesario para obtener los datos de A a B. Ambos servidores también están en la misma granja de servidores.


Respuestas:


21

Puede usar la tarea "Exportar datos" de SQL Server Management Studio. Haga clic derecho en la base de datos en SSMS, seleccione Tareas y luego "Exportar datos". Lanzará un asistente interactivo que permitirá copiar tablas de un servidor a otro, aunque tendrá que recrear los índices usted mismo. El asistente crea un paquete SSIS temporal (aunque también puede optar por guardarlo) y es relativamente rápido.


44
También puede hacer la misma tarea de exportación a través de PowerShell si está interesado. Un guión similar para realizar esta acción está en mi respuesta aquí: dba.stackexchange.com/a/122149/507
Shawn Melton el

¿Por qué la importación / exportación no copia los índices y dependencias? ¿No sería demasiado difícil recrear los índices para 466 tablas?
Vini

@Vini también puede usar el asistente Generate Scripts, que le permite copiar índices (aunque no sé si genera de manera confiable un script en el orden de dependencia adecuado; siempre he usado RedGate SQL Compare para eso).
Aaron Bertrand

@AaronBertrand: OK. Yo también tuve la misma pregunta. Pero cuando importé datetime también se convirtió en smalldatetime
Vini

23

Aquí hay un enfoque rápido y sucio que solo necesita un servidor vinculado, en cada dirección, con suficientes privilegios, compatibilidad de cotejo y acceso a datos habilitado. Ejecuta esto en el servidor vinculado de origen para generar el SQL dinámico que se ejecutará en el servidor vinculado de destino.

DECLARE @sql NVARCHAR(MAX) = N'';

SELECT @sql += N'SELECT * INTO [database].dbo.' + QUOTENAME(name)
  + N' FROM [source_linked_server].[database].dbo.' + QUOTENAME(name) + N';'
FROM sys.tables
WHERE name LIKE N'Cart[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]';

PRINT @sql; -- this will only print 8K, enough to spot check
--EXEC [destination_linked_server].master.sys.sp_executesql @sql;

19

Si desea que algo que se pueda programar se vuelva a ejecutar fácilmente a medida que prueba esto y realiza cambios menores, consulte mi respuesta aquí:

Importar datos de una base de datos a otro script

Esa respuesta describe el uso de un procedimiento almacenado SQLCLR que hace uso de la SqlBulkCopyclase en .NET. El uso de ese procedimiento almacenado se puede hacer en un cursor que recorre las tablas. Esto permite editar fácilmente el proceso, así como contabilizar nuevas tablas, o excluir fácilmente una o más tablas mediante una WHEREcondición en la consulta del cursor.


Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.