Copie (des centaines de) tables d'un serveur à un autre (avec SSMS)

27

J'ai plusieurs centaines (actuellement 466, mais toujours en croissance) de tables que je dois copier d'un serveur à un autre.

Je n'ai jamais eu à le faire auparavant, donc je ne sais pas du tout comment l'aborder. Tous les tableaux sont au même format:Cart<Eight character customer number>

Cela fait partie d'un projet plus vaste dont je fusionne tous ces Cart<Number>tableaux en un seul Carts, mais c'est une toute autre question.

Quelqu'un a-t-il une meilleure méthode que je peux utiliser pour copier tous ces tableaux? Les noms de base de données sur les deux serveurs sont les mêmes, si cela vous aide. Et comme je l'ai dit plus tôt, j'ai le sacompte afin que je puisse faire tout ce qui est nécessaire pour obtenir les données de A à B. Les deux serveurs sont également dans la même batterie de serveurs.

410_Gone
la source
2
Peut-être d'intérêt dba.stackexchange.com/questions/30473/…
billinkc

Réponses:

21

Vous pouvez utiliser la tâche "Exporter les données" de SQL Server Management Studio. Faites un clic droit sur la base de données dans SSMS, sélectionnez Tâches puis "Exporter les données". Il lancera un assistant interactif qui permettra de copier des tables d'un serveur à un autre, mais vous devrez recréer les index vous-même. L'assistant crée un package SSIS temporaire (bien que vous puissiez également choisir de l'enregistrer) et est relativement rapide.

Alex
la source
4
Peut également effectuer la même tâche d'exportation via PowerShell si vous êtes intéressé. Un script similaire pour effectuer cette action se trouve dans ma réponse ici: dba.stackexchange.com/a/122149/507
Shawn Melton
pourquoi l'import / export ne copie-t-il pas les index et les dépendances? ne serait-il pas trop difficile de recréer les indices de 466 tableaux?
Vini
@Vini, vous pouvez également utiliser l'assistant de génération de scripts, qui vous permet de copier des index (je ne sais pas s'il génère de manière fiable un script dans un ordre de dépendance approprié, cependant - j'ai toujours utilisé RedGate SQL Compare pour cela).
Aaron Bertrand
@AaronBertrand: OK. Moi aussi, j'avais la même question. Mais quand j'ai importé datetime a également été converti en smalldatetime
Vini
23

Voici une approche rapide et sale qui n'a besoin que d'un serveur lié, dans chaque direction, avec des privilèges suffisants, la compatibilité de classement et l'accès aux données activé. Vous l'exécutez sur le serveur lié source pour générer le SQL dynamique qui sera exécuté sur le serveur lié de destination.

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;
Aaron Bertrand
la source
19

Si vous voulez que quelque chose qui puisse être scripté soit facilement réexécutable lorsque vous testez cela et apportez des modifications mineures, consultez ma réponse ici:

Importer des données d'une base de données vers un autre script

Cette réponse décrit l'utilisation d'une procédure stockée SQLCLR qui utilise la SqlBulkCopyclasse dans .NET. L'utilisation de cette procédure stockée peut être effectuée dans un curseur qui parcourt les tables. Cela permet de modifier facilement le processus ainsi que de prendre en compte les nouvelles tables, ou d'exclure facilement une ou plusieurs tables via une WHEREcondition dans la requête du curseur.

Solomon Rutzky
la source