SQL Server - Criar uma cópia de uma tabela de banco de dados e colocá-la no mesmo banco de dados?

108

Eu tenho uma tabela ABC em um banco de dados DB. Desejo criar cópias do ABC com os nomes ABC_1, ABC_2, ABC_3 no mesmo banco de dados. Como posso fazer isso usando o Management Studio (de preferência) ou consultas SQL?

Isso é para SQL Server 2008 R2.

sequel.learner
fonte
1
outra postagem não diretamente relacionada, mas pode estar relacionada ao caso de uso acima - stackoverflow.com/questions/6810425/ ... isso pode ser útil quando você deseja editar as cópias da tabela (por exemplo, permitir nulos, alterar o tipo de dados etc. .) sem ter que recriar as cópias.
sequel.learner

Respostas:

212

Use SELECT ... INTO:

SELECT *
INTO ABC_1
FROM ABC;

Isso criará uma nova tabela ABC_1que possui a mesma estrutura de colunas ABCe contém os mesmos dados. As restrições (por exemplo, chaves, valores padrão), no entanto, não são copiadas.

Você pode executar essa consulta várias vezes com um nome de tabela diferente a cada vez.


Se você não precisa copiar os dados, apenas para criar uma nova tabela vazia com a mesma estrutura de coluna, adicione uma WHEREcláusula com uma expressão falsa:

SELECT *
INTO ABC_1
FROM ABC
WHERE 1 <> 1;
Mahmoud Gamal
fonte
3
Resposta perfeita para meu problema.
sequel.learner
8
Não funciona completamente ... colunas calculadas no original não são copiadas como iguais no destino. Além disso, as restrições PK e Default também não são copiadas
Simon Green,
@SimonGreen - Você pode postar uma nova pergunta para este problema com seu código.
Mahmoud Gamal
3
Claro que não funciona completamente. Ele alertou que as restrições não são copiadas, nem as chaves primárias ou os valores padrão. O comando que ele oferece cria uma nova tabela com a mesma estrutura de colunas (como ele disse) e insere todos os dados na nova tabela para você.
user5855178
1
Acho que usar SELECT TOP(0) *mais limpo do que o WHEREmétodo de declaração sempre falsa
Timina
21

Copiar esquema (gerar DDL) por meio da IU do SSMS

No SSMS, expanda seu banco de dados no Object Explorer , vá para Tabelas , clique com o botão direito na tabela de seu interesse e selecione Script Table As , Create To , New Query Editor Window . Faça um localizar e substituir ( CTRL + H ) para alterar o nome da tabela (ou seja, coloque ABCno campo Localizar e ABC_1em Substituir por e clique em OK ).

Copiar Esquema por meio de T-SQL

As outras respostas que mostram como fazer isso pelo SQL também funcionam bem, mas a diferença com esse método é que você também obterá quaisquer índices, restrições e gatilhos.

Copiar Dados

Se você deseja incluir dados, após criar esta tabela execute o script abaixo para copiar todos os dados do ABC (mantendo os mesmos valores de ID se você tiver um campo de identidade):

set identity_insert ABC_1 on
insert into ABC_1 (column1, column2) select column1, column2 from ABC
set identity_insert ABC_1 off
JohnLBevan
fonte
1
Tem certeza de que este método copia os índices também? Eu tentei e não funcionou.
BornToCode
3
Você deve definir IDENTITY_INSERTcomo ON para permitir definir a coluna de identidade "manualmente", você misturou a ordem no seu exemplo. Além disso, você deve listar EXPLICITAMENTE suas colunas
jean
2
Obrigado @jean; bem localizado após 6 anos sem ser notado! Fixo.
JohnLBevan
Isso quase resolveu o problema para mim. O último truque é que você pode arrastar a pasta "Colunas" na árvore do SSMS para o editor para obter uma lista de colunas. Eu tenho uma coluna de carimbo de data / hora em cada tabela, então tive que obter a lista de colunas e remover o carimbo de data / hora.
Wade Hatler
10

Se você deseja duplicar a tabela com todas as suas restrições e chaves, siga as etapas abaixo:

  1. Abra o banco de dados no SQL Management Studio.
  2. Clique com o botão direito na tabela que deseja duplicar.
  3. Selecione Tabela de script como -> Criar para -> Nova janela do editor de consultas. Isso irá gerar um script para recriar a tabela em uma nova janela de consulta.
  4. Altere o nome da tabela e as chaves e restrições relativas no script.
  5. Execute o script.

Então, para copiar os dados, execute o seguinte script:

SET IDENTITY_INSERT DuplicateTable ON

INSERT Into DuplicateTable ([Column1], [Column2], [Column3], [Column4],... ) 
SELECT [Column1], [Column2], [Column3], [Column4],... FROM MainTable

SET IDENTITY_INSERT DuplicateTable OFF
Rousonur Jaman
fonte
4

1ª opção

select *
  into ABC_1
  from ABC;

2ª opção: use SSIS, ou seja, clique com o botão direito no banco de dados no explorador de objetos> todas as tarefas> exportar dados

  • origem e destino: seu banco de dados
  • tabela de origem: ABC
  • tabela de destino: ABC_1 (a tabela será criada)
Claude
fonte
2

Esta é outra opção:

select top 0 * into <new_table> from <original_table>
Keni
fonte
2
Esta solicitação copia a tabela sem dados. O usuário pediu para copiar as tabelas.
Alekzander
1

use sql server manegement studio ou netcat e será mais fácil de manipular sql

gasroot
fonte
1

Você precisa escrever SSIS para copiar a tabela e seus dados, restrições e gatilhos. Temos em nossa organização um software chamado Kal Admin da kalrom Systems que possui uma versão gratuita para download (acho que o recurso de copiar tabelas é opcional)

Chris D
fonte