Usando alguns métodos, quando você cria uma cópia de uma tabela você perde índices, PK, FK, etc. Por exemplo no SQL Server posso dizer:
select * into dbo.table2 from dbo.table1;
Esta é apenas uma cópia simples da tabela; todos os índices/restrições estão faltando. Como posso copiar uma estrutura de tabela (sem usar um backup)?
Estou procurando principalmente fazer isso manualmente, mas se isso não for possível, aceitarei qualquer solução.
Você pode criar scripts de uma tabela de maneira relativamente fácil usando a interface do usuário, é claro:
Isso gerará um
CREATE TABLE
script e você só precisará pesquisar e substituir o nome antigo pelo novo nome (e verificar se um objeto com o novo nome ainda não existe).Mas se você está tentando automatizar isso (por exemplo, gerar o script de criação de tabela no código), é um pouco mais complicado. A opção de script acima não apenas extrai todo o
CREATE TABLE
DDL de um único local nos metadados; ele faz um monte de mágica nos bastidores do código para gerar oCREATE TABLE
script eventual (você pode usar o Profiler para ver onde ele obtém seus dados, mas não pode ver como ele os monta). Eu sugeri uma opção para isso:http://connect.microsoft.com/SQLServer/feedback/details/273934
No entanto, isso foi recebido com muito poucos votos e foi rapidamente derrubado pela Microsoft. Você pode achar muito mais interessante usar uma ferramenta de terceiros para gerar esquema ( eu escrevi sobre isso no blog ).
No SQL Server 2012, há novas funções de metadados que permitem chegar muito mais perto do que o trabalho que você tem que fazer em 2005, 2008 e 2008 R2, reunindo informações de coluna dos metadados (que tem muitas ressalvas, por exemplo, se é decimal você tem que adicionar a precisão/escala, se [n[var[char]] você tem que adicionar a especificação de comprimento, se n[var]char você tem que cortar o max_length pela metade, se for um MAX você tem que mude -1 para MAX, etc etc). No SQL Server 2012 essa parte é um pouco mais fácil:
Resultados:
Eu também escrevi sobre isso no blog.
Indiscutivelmente, isso está muito mais próximo da sua declaração direcionada
CREATE TABLE
do que uma abordagem complicada usandosys.columns
, mas ainda há muito trabalho a fazer. Chaves, restrições, opções de texto em linha, informações de grupos de arquivos, configurações de compactação, índices, etc. É uma lista muito longa e mais uma vez sugiro que você procure uma ferramenta de terceiros para isso em vez de, correndo o risco de repetir uma -utilizou analogia, reinventando a roda.Dito isso, se você precisar fazer isso por meio de código, mas puder fazer isso fora do SQL Server, considere o SMO/PowerShell. Veja esta dica e o método Scripter.Script() .
eu escrevi este sp para criar automaticamente o esquema com todas as coisas, pk, fk, partições, restrições ...
IMPORTANTE!! antes do executivo
aqui o SP:
para executá-lo:
This might be using a jackhammer to put a nail in a wall, but given the broadness of the question I think it is a valid option to mention.
If you're using SQL Server 2012 SP4+, 2014 SP2+ or 2016 SP1+, you can leverage
DBCC CLONEDATABASE
to create a schema-only copy of your database sans data. This is ideal for generating comprehensive schema copies of multiple tables and may alleviate the need to "automate" the process of looping through a series of tables, but be warned that all of the table copies will be created inside of a new read-only database.These tables will include foreign keys, primary keys, indexes, and constraints. They will also include statistics and query store data (unless you specify
NO_STATISTICS
andNO_QUERYSTORE
).The syntax is
Há também algumas outras advertências a serem observadas, sobre as quais Brent Ozar tem um ótimo post , mas tudo realmente se resume a como e por que você deseja criar cópias de tabelas para saber se alguma das sutilezas é ou não um disjuntor .
You can use the "Generate script" command in SQL Server Management Studio to get a script that can create your table, including indexes, triggers, foreign keys, etc.
In SSMS
You can then edit to include just what you need in your destination database.
Aqui está uma versão baseada na de E.Mantovanelli neste tópico. Isso corrige um problema em que um índice exclusivo não inclui a palavra-chave UNIQUE no script resultante. Ele também adiciona parâmetros para que uma tabela possa ser criada sem índices não clusterizados ou você só pode criar scripts para índices não clusterizados. Eu uso isso para criar uma tabela de estágio, carregá-la, adicionar os índices não clusterizados e fazer uma troca de tabela, o que permite que a carga seja executada mais rapidamente e os índices não sejam fragmentados.
You could use this script to copy a table structure with foreign keys but without indexes. This script handles user defined types and computed columns gracefully.
If you are interested you can find it also on my blog: http://www.hansmichiels.com/2016/02/18/how-to-copy-a-database-table-structure-t-sql-scripting-series-s01e01/