web-dev-qa-db-fra.com

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

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> tables à une table Carts, mais c'est une toute autre question.

Quelqu'un a-t-il une méthode de meilleures pratiques 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 compte sa 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.

27
Der Kommissar

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.

21
Alex

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;
23
Aaron Bertrand

Vous pouvez utiliser BCP OUT et BULK INSERT INTO dans la base de données de destination. Vous pouvez utiliser ce script

Vous pouvez également utiliser SSIS (importation/exportation de données) pour effectuer le transfert de données .

19
Kin Shah

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 classe SqlBulkCopy 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 condition WHERE dans la requête de curseur.

19
Solomon Rutzky