J'ai trouvé que BCP était plus efficace que certains des outils pour obtenir des données dans une version antérieure de SQL Server et pour extraire des données de RDS. (Merci @ivan_posdeev.)
Je génère d'abord le schéma en cliquant avec le bouton droit sur la base de données dans SQL Server Management Studio, Tâches, Générer des scripts. Cochez tous les objets, dans les objets avancés, assurez-vous que tout ce dont vous avez besoin sera scripté (statistiques, index, etc.), décochez "UTILISER la base de données" si votre base de données de destination a un nom différent, définissez la compatibilité avec la version de votre base de données de destination et générez un fichier qui crée votre schéma. Créer une base de données sur votre destination et exécuter ce fichier sur ( à l' aide osql, sqlcmdou l'interface graphique).
Pour déplacer les données, exécutez la requête suivante deux fois sur la base de données source , commentant d'abord la deuxième colonne pour générer le fichier de commandes pour extraire les données, puis commentant la première colonne pour générer le fichier de commandes d'importation à exécuter sur votre destination. (Vous devez ajouter vos serveurs source et de destination, les noms d'instance, les répertoires de fichiers de sortie et d'entrée, les noms d'utilisateur et les mots de passe. Pour utiliser la sécurité intégrée, remplacez simplement les options -Uet -Ppar -T.)
Cela prend en charge Unicode, si vous n'en avez pas besoin, changez le -Ncommutateur dans les deux instructions en -n.
SELECT
'bcp SOURCEDATABASE.' + s.Name + '.' + t.NAME + ' out d:\dbdump\' + s.Name + '.' + t.NAME + '.dat -N -S SOURCESERVER\INSTANCE -UUSER -PPASSWORD'
-- 'bcp DESTINATIONDATASE.' + s.Name + '.' + t.NAME + ' in d:\dbdump\' + s.Name + '.' + t.NAME + '.dat -N -S DESTINATIONSERVER\INSTANCE -UUSER -PPASSWORD -E -h TABLOCK -b 1000 -e d:\dbdump\' + s.Name + '.' + t.NAME + '.ERRORS.dat'
FROM
sys.tables t
INNER JOIN
sys.indexes i ON t.OBJECT_ID = i.object_id
LEFT OUTER JOIN
sys.schemas s ON t.schema_id = s.schema_id
ORDER BY
s.Name, t.NAME
Après avoir exécuté les fichiers de vérification nommés schema.tablename.ERRORS.dat - inclura toutes les lignes qui ont échoué, vides si aucune ne l'a fait.
Référence MSDN pour BCP ici , promenade plus conviviale à travers les options BCP ici .
J'ai trouvé cela largement supérieur à la génération de scripts et à tous les outils que j'ai essayés. Il fonctionne également sur les bases de données RDS (qui ne permettent pas les sauvegardes). Les fichiers de données générés représentent 30% de la taille des scripts SQL, leur exécution prend une fraction du temps et est beaucoup plus fiable. (Les scripts générés par SQL Server pour les données de script se sont toujours déclenchés, parfois de manière prévisible parfois non, le SQL généré n'était pas compatible avec 2008R2 (par exemple, utilisé nvarchar(0), souvent ne s'est pas terminé sans raison perceptible, etc. BCP réplique également toutes les violations de contraintes , comme l'intégrité référentielle.).