Copiar tabelas de um banco de dados para outro no SQL Server

325

Eu tenho um banco de dados chamado foo e um banco de dados chamado bar. Eu tenho uma tabela no foo chamada tblFoobar que eu quero mover (dados e tudo) para a barra de banco de dados do banco de dados foo. Qual é a instrução SQL para fazer isso?

RyanKeeter
fonte

Respostas:

208

No SQL Server? e no mesmo servidor de banco de dados? Use nomes de três partes.

INSERT INTO bar..tblFoobar( *fieldlist* )
SELECT *fieldlist* FROM foo..tblFoobar

Isso apenas move os dados. Se você deseja mover a definição da tabela (e outros atributos, como permissões e índices), precisará fazer outra coisa.

Amy B
fonte
Você também precisará definir permissões de tabela separadamente, acredito.
Ken Ray
1
Se você precisa fazer inserções de identidade também, o Assistente de importação de dados tem uma opção para que ^^ - referindo-se a outra resposta
Clarence Liu
13
@TahaRehmanSiddiqui: Porque responde à pergunta;) Ele não perguntou como copiá-lo entre os servidores de banco de dados. Mas a maioria das pessoas que procuram essa resposta acaba aqui, porque o Google dá-lo como primeiro resultado :)
Maarten Kieft
1
@RyanB sim, isso é permitido.
Amy B
1
A Tom OP e muitas pessoas que chegam a essa pergunta procuram uma "instrução SQL", não uma ferramenta.
Amy B
535

A tarefa "Importar dados" do SQL Server Management Studio (clique com o botão direito do mouse no nome do banco de dados e depois em tarefas) fará a maior parte disso. Execute-o no banco de dados para o qual você deseja copiar os dados.

Se as tabelas não existirem, elas serão criadas para você, mas você provavelmente precisará recriar quaisquer índices e outros. Se as tabelas existirem, ele anexará os novos dados por padrão, mas você poderá ajustá-los (editar mapeamentos) para excluir todos os dados existentes.

Eu uso isso o tempo todo e funciona bastante bem.

David
fonte
1
Não consigo encontrar essa opção. existe algo versão específica aqui?
Nerrve
35
Você realmente não pode dizer que é uma resposta melhor em geral. É inutilizável que a automação seja chamada de dentro de um script, por exemplo. BTW, o autor solicitou especificamente uma "..SQL statement ..". Mas é claro que é uma ótima resposta, mas não uma melhor;).
grizzly
3
O autor pediu para mover "(dados e tudo)"; então eu esperava que essa resposta fizesse isso. Ele cria a tabela, mas não cria nenhuma chave ou índice; portanto, não há muita melhoria em relação à resposta SQL.
unubar
É possível especificar uma WHEREcondição usando a tarefa Importar Dados? Não consegui encontrar uma maneira de fazê-lo.
esmagar
1
sim, esta é a maneira correta, como mencionado aqui também, mas identitye as foreign keyreferências são removidas no banco de dados de destino, alguma solução?
shaijut 16/11/2015
106

Isso deve funcionar:

SELECT * 
INTO DestinationDB..MyDestinationTable 
FROM SourceDB..MySourceTable 

Ele vai não copiar constrangimentos, padrões ou índices. A tabela criada não terá um índice em cluster.

Como alternativa, você pode:

INSERT INTO DestinationDB..MyDestinationTable 
SELECT * FROM SourceDB..MySourceTable

Se sua tabela de destino existir e estiver vazia.

leoinfo
fonte
Existe algum problema se você copiar primeiro a estrutura da tabela base (campos e dados) e depois aplicar um script de patch para criar permissões, índices, restrições e propriedades estendidas?
Leoinfo 9/10/08
4
Isso não irá inserir valores para colunas de identidade no SQL Server 2008. Isso é permitido apenas quando você usa uma lista de colunas e IDENTITY_INSERT está LIGADO para a tabela de destino.
Lucas Wilson-Richter
@ Lucas - Você é "metade" certo :). No entanto, a primeira instrução SQL copia TODOS os dados, incluindo os valores nas colunas de identidade. Como eu disse, as restrições não são criadas. Mas eles podem ser facilmente roteirizados no banco de dados de origem e aplicados ao banco de dados de destino assim que todos os dados forem movidos.
Leoinfo 23/10/12
A segunda versão ( INSERT INTO...) funcionou para mim no Oracle.
vapcguy
Isso funciona se os 2 bancos de dados estiverem em servidores totalmente diferentes com diferentes cadeias de conexão? Se não, como você lida com isso?
Alexander Ryan Baggett
46

Se for apenas uma tabela, tudo o que você precisa fazer é

  • Definição da tabela de scripts
  • Criar nova tabela em outro banco de dados
  • Atualizar regras, índices, permissões e outros
  • Importar dados (várias inserções em exemplos já são mostradas acima)

Uma coisa que você deve considerar são outras atualizações, como migrar outros objetos no futuro. Observe que suas tabelas de origem e destino não têm o mesmo nome. Isso significa que você também precisará fazer alterações se depender de objetos como visualizações, procedimentos armazenados e outros.

Com um ou vários objetos, você pode ir manualmente sem problemas. No entanto, quando existem mais do que apenas algumas atualizações, as ferramentas de comparação de terceiros são muito úteis. No momento, estou usando o ApexSQL Diff para migrações de esquema, mas você não pode dar errado com nenhuma outra ferramenta disponível.

Igor Voplov
fonte
23
  1. Script do create table no estúdio de gerenciamento, execute esse script na barra para criar a tabela. (Clique com o botão direito do mouse na tabela no explorador de objetos, na tabela de scripts como, crie para ...)

  2. INSERT bar.[schema].table SELECT * FROM foo.[schema].table

ScottStonehouse
fonte
1
Eu gosto dessa abordagem. Selecionar * não funcionará se houver uma coluna de identidade, você precisará listar explicitamente os nomes das colunas. Você também precisará fazer SET IDENTITY_INSERT TblName ONnesse caso.
precisa saber é o seguinte
16

Você também pode usar o Assistente para Gerar Scripts do SQL Server para ajudar a orientar a criação de scripts SQL que podem fazer o seguinte:

  • copie o esquema da tabela
  • quaisquer restrições (identidade, valores padrão etc.)
  • dados dentro da tabela
  • e muitas outras opções, se necessário

Bom exemplo de fluxo de trabalho para o SQL Server 2008 com capturas de tela mostradas aqui .

ryan
fonte
Veja meus comentários acima:?!? "Como isso obter 508/171 Votos e Ryan de 'Outubro 11 '11 em 23:41' Resposta só obter 13 a data Ryan é a única resposta que a resposta de q do op. Completamente . Porque ele lida com esses cenários (que, pelo contrário, o OP NÃO excluiu de seu q.): a) Identidade ( muito comum), b) Restrições, c) Gatilhos, d) Índices, e) Permissões, d) cópia de Esquema E Dados ( Dica: a parte "e todos" dos op's "(dados e todos)" também implica o esquema.) Ee) gera "instruções SQL" que o op especificou que, mesmo que ele não quisesse dizer literalmente, é melhor ter do que não ".
Tom
1
Nota: Esta resposta é prática apenas quando o número de linhas não é "excessivo" (por exemplo, tabelas de pesquisa / pequenas transações) e nenhum valor de coluna "grande". Para eles, eu usaria a resposta de Ryan apenas para gerar o script para a criação da tabela (incluindo atributos da coluna e subobjetos) e, em seguida, usaria a resposta "Insert Into Select" de David B. Para tabelas únicas (em vez de A de Ryan), você também pode usar SSMS, Pesquisador de objetos, Tabela de clique com o botão direito do mouse, Tabela de scripts como, CREATE To, mas primeiro é necessário garantir que as opções Ferramentas, Opções, SQL Server Object Explorer, Scripting estejam defina como desejado.
Tom
9

Você pode seguir este caminho: (um exemplo geral)

insert into QualityAssuranceDB.dbo.Customers (columnA, ColumnB)
Select columnA, columnB from DeveloperDB.dbo.Customers

Além disso, se você precisar gerar os nomes das colunas e inserir a cláusula de inserção, use:

    select (name + ',') as TableColumns from sys.columns 
where object_id = object_id('YourTableName')

Copie o resultado e cole na janela de consulta para representar os nomes das colunas da tabela e mesmo isso excluirá a coluna de identidade:

    select (name + ',') as TableColumns from sys.columns 
where object_id = object_id('YourTableName') and is_identity = 0

Lembre-se de que o script para copiar linhas funcionará se os bancos de dados pertencerem ao mesmo local.


Você pode tentar isso.

select * into <Destination_table> from <Servername>.<DatabaseName>.dbo.<sourceTable>

O nome do servidor é opcional se os dois bancos de dados estiverem no mesmo servidor.

NeverHopeless
fonte
1

Se houver uma tabela existente e quisermos copiar apenas dados, podemos tentar esta consulta.

inserir em Destination_Existing_Tbl, selecione col1, col2 FROM Source_Tbl

Mohan
fonte
0

Copiar dados

INSERT INTO Alfestonline..url_details(url,[status],recycle) 
SELECT url,status,recycle FROM AlfestonlineOld..url_details
Arun Prasad ES
fonte