Copiando (centenas de) tabelas de um servidor para outro (com SSMS)

27

Eu tenho várias centenas (atualmente 466, mas sempre em crescimento) de tabelas que tenho que copiar de um servidor para outro.

Eu nunca tive que fazer isso antes, então não tenho certeza de como abordar isso. Todas as tabelas estão no mesmo formato:Cart<Eight character customer number>

Isso faz parte de um projeto maior do qual estou mesclando todas essas Cart<Number>tabelas em uma Cartstabela, mas essa é uma questão totalmente diferente.

Alguém tem um método de práticas recomendadas que eu possa usar para copiar todas essas tabelas? Os nomes dos bancos de dados nos dois servidores são os mesmos, se isso ajudar. E, como disse anteriormente, tenho a saconta para poder fazer o que for necessário para obter os dados de A a B. Os dois servidores também estão no mesmo farm de servidores.

410_Gone
fonte
2
Possivelmente de interesse dba.stackexchange.com/questions/30473/…
billinkc

Respostas:

21

Você pode usar a tarefa "Exportar dados" do SQL Server Management Studio. Clique com o botão direito do mouse no banco de dados no SSMS, selecione Tarefas e, em seguida, "Exportar Dados". Ele iniciará um assistente interativo que permitirá copiar tabelas de um servidor para outro, embora você precise recriar os índices por conta própria. O assistente cria um pacote SSIS temporário (embora você também possa optar por salvá-lo) e é relativamente rápido.

Alex
fonte
4
Também pode executar a mesma tarefa de exportação via PowerShell, se estiver interessado. Script semelhante para executar esta ação é na minha resposta aqui: dba.stackexchange.com/a/122149/507
Shawn Melton
por que a importação / exportação não copia os índices e dependências? não seria muito difícil recriar os índices para 466 tabelas?
Vini
@Vini, você também pode usar o assistente Gerar Scripts, que permite copiar índices (embora não gere, de maneira confiável, um script na ordem de dependência correta - sempre usei o RedGate SQL Compare para isso).
Aaron Bertrand
@AaronBertrand: OK. Eu também tive a mesma pergunta. Mas quando eu importei datetime também foi convertido em smalldatetime #
Vini
23

Aqui está uma abordagem rápida e suja que precisa apenas de um servidor vinculado, em cada direção, com privilégios suficientes, compatibilidade de agrupamento e acesso a dados habilitados. Você executa isso no servidor vinculado de origem para gerar o SQL dinâmico que será executado no servidor vinculado de destino.

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
fonte
19

Se você deseja que algo que possa ser roteirizado seja facilmente executável à medida que você testa isso e faz pequenas alterações, confira minha resposta aqui:

Importar dados de um banco de dados para outro script

That answer describes using a SQLCLR stored procedure which makes use of the SqlBulkCopy class in .NET. Using that stored procedure can be done in a cursor that loops through the tables. This allows for easy editing of the process as well as accounting for new tables, or easily excluding one or more table via a WHERE condition in the cursor query.

Solomon Rutzky
fonte