Eu descobri que o BCP é mais eficaz do que algumas das ferramentas para obter dados em uma versão anterior do SQL Server e para extrair dados do RDS. (Obrigado @ivan_posdeev.)
Primeiro, giro o esquema clicando com o botão direito do mouse no banco de dados do SQL Server Management Studio, Tarefas, Gerar scripts. Marque todos os objetos, em objetos avançados, assegure que tudo o que você precisa seja script (estatísticas, índices, etc.), desmarque "USE database" se o banco de dados de destino tiver um nome diferente, defina a compatibilidade com a versão do banco de dados de destino e gere uma arquivo que cria seu esquema. Criar um banco de dados sobre o seu destino e executar esse arquivo nele (usando osql, sqlcmdou o GUI).
Para mover os dados, execute a consulta a seguir duas vezes no banco de dados de origem , primeiro comentando a segunda coluna para gerar o arquivo em lotes para extrair dados e, em seguida, comentando a primeira coluna para gerar o arquivo em lotes de importação para execução no seu destino. (Você precisa adicionar seus servidores de origem e destino, nomes de instâncias, diretórios de arquivos de saída e entrada, nomes de usuário e senhas. Para usar a segurança integrada, substitua as opções -Ue -Ppor just -T.)
Isso suporta Unicode, se você não precisar disso, altere a -Nopção nas duas instruções para -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
Após executar a verificação, os arquivos denominados schema.tablename.ERRORS.dat - incluirão todas as linhas que falharam, vazias se não houver.
Referência do MSDN para o BCP aqui , passeio mais amigável pelas opções do BCP aqui .
Eu achei isso muito superior à geração de scripts e a qualquer uma das ferramentas que eu tentei. Também é executado em bancos de dados RDS (que não permitem backups). Os arquivos de dados gerados têm 30% do tamanho dos scripts SQL, a execução deles leva uma fração do tempo e é muito mais confiável. (Os scripts gerados pelo SQL Server para dados de script sempre disparavam, às vezes previsivelmente às vezes não, o SQL gerado não era compatível com 2008R2 (por exemplo, usado nvarchar(0), geralmente não era concluído sem motivo aparente) etc. O BCP também replica quaisquer violações de restrição , como integridade referencial.).