Copia (centinaia di) tabelle da un server a un altro (con SSMS)


27

Ho diverse centinaia (attualmente 466, ma in continua crescita) di tabelle che devo copiare da un server all'altro.

Non ho mai dovuto farlo prima, quindi non sono affatto sicuro su come affrontarlo. Tutte le tabelle sono nello stesso formato:Cart<Eight character customer number>

Questo fa parte di un progetto più ampio di cui sto unendo tutte queste Cart<Number>tabelle in una Cartstabella, ma questa è una domanda completamente diversa.

Qualcuno ha un metodo di best practice che posso usare per copiare tutte queste tabelle? I nomi del database su entrambi i server sono gli stessi, se ciò aiuta. E come ho detto prima, ho l' saaccount in modo da poter fare tutto il necessario per ottenere i dati da A a B. Entrambi i server si trovano anche nella stessa server farm.


Risposte:


21

È possibile utilizzare l'attività "Esporta dati" di SQL Server Management Studio. Fare clic con il tasto destro sul database in SSMS, selezionare Attività e quindi "Esporta dati". Avvierà una procedura guidata interattiva che consentirà di copiare le tabelle da un server all'altro, anche se dovrai ricreare gli indici da solo. La procedura guidata crea un pacchetto SSIS temporaneo (anche se puoi anche scegliere di salvarlo) ed è relativamente veloce.


4
Può anche svolgere la stessa attività di esportazione tramite PowerShell se interessati. Script simile per eseguire questa azione è nella mia risposta qui: dba.stackexchange.com/a/122149/507
Shawn Melton,

perché l'importazione / esportazione non copia gli indici e le dipendenze? non sarebbe troppo difficile ricreare gli indici per 466 tabelle?
Vini,

@Vini puoi anche usare la procedura guidata Genera script, che ti consente di copiare gli indici (non so se genera in modo affidabile uno script nell'ordine corretto delle dipendenze, comunque - per questo ho sempre usato RedGate SQL Compare).
Aaron Bertrand

@AaronBertrand: OK. Anch'io avevo la stessa domanda. Ma quando ho importato il datetime è stato anche convertito in smalldatetime
Vini il

23

Ecco un approccio rapido e sporco che richiede solo un server collegato, in ogni direzione, con privilegi sufficienti, compatibilità delle regole di confronto e accesso ai dati abilitati. Questo viene eseguito sul server collegato di origine per generare l'SQL dinamico che verrà eseguito sul server collegato di destinazione.

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

Se vuoi che qualcosa che può essere copiato sia facilmente rieseguibile mentre lo provi e apporti modifiche minori, controlla la mia risposta qui:

Importa i dati da un database a un altro script

Questa risposta descrive l'uso di una procedura memorizzata SQLCLR che utilizza la SqlBulkCopyclasse in .NET. L'utilizzo di quella procedura memorizzata può essere eseguito in un cursore che scorre attraverso le tabelle. Ciò consente di modificare facilmente il processo, nonché di tenere conto di nuove tabelle o di escludere facilmente una o più tabelle tramite una WHEREcondizione nella query del cursore.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.