使用某些方法,当您创建表的副本时,您会丢失索引、PK、FK 等。例如在 SQL Server 中,我可以说:
select * into dbo.table2 from dbo.table1;
这只是表格的简单副本;缺少所有索引/约束。如何复制表结构(不使用备份)?
我主要希望手动执行此操作,但如果不可能,我会接受任何解决方案。
使用某些方法,当您创建表的副本时,您会丢失索引、PK、FK 等。例如在 SQL Server 中,我可以说:
select * into dbo.table2 from dbo.table1;
这只是表格的简单副本;缺少所有索引/约束。如何复制表结构(不使用备份)?
我主要希望手动执行此操作,但如果不可能,我会接受任何解决方案。
当然,您可以使用 UI 相对简单地编写表格脚本:
这将输出一个
CREATE TABLE
脚本,您只需搜索并用新名称替换旧名称(并验证具有新名称的对象不存在)。但是,如果您尝试自动执行此操作(例如,在代码中生成创建表脚本),它会更麻烦一些。上面的脚本选项不只是
CREATE TABLE
从元数据中的单个位置提取整个 DDL;它在代码的幕后做了一大堆魔法来生成最终的CREATE TABLE
脚本(你可以使用 Profiler 来查看它从哪里获取数据,但你看不到它是如何组装它的)。我为此建议了一个选项:http://connect.microsoft.com/SQLServer/feedback/details/273934
然而,这得到了很少的选票,并很快被微软否决。您可能会发现使用 3rd 方工具来生成模式更值得(我已经在博客上写过这个)。
在 SQL Server 2012 中,有新的元数据函数可以让您比 2005、2008 和 2008 R2 中的工作更接近,将元数据中的列信息拼凑在一起(这有很多警告,例如,如果它是decimal 你必须添加精度/比例,如果 [n[var[char]] 你必须添加长度规范,如果 n[var]char 你必须将 max_length 减半,如果它是 MAX 你必须将 -1 更改为 MAX 等)。在 SQL Server 2012 中,这部分要简单一些:
结果:
我也写过关于这个的博客。
CREATE TABLE
可以说,这比使用 的复杂方法更接近您的目标陈述sys.columns
,但仍有很多工作要做。键、约束、行选项中的文本、文件组信息、压缩设置、索引等。这是一个很长的列表,我将再次建议您为此使用 3rd 方工具,而不是冒着重复一遍的风险- 使用类比,重新发明轮子。综上所述,如果您需要通过代码执行此操作,但您可以在 SQL Server 之外执行此操作,则可以考虑 SMO/PowerShell。请参阅此技巧和Scripter.Script() 方法。
我写了这个 sp 来自动创建包含所有东西的模式,pk,fk,分区,约束......
重要的!!在执行之前
这里是 SP:
执行它:
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
还有其他一些注意事项需要注意,Brent Ozar 有一篇很棒的帖子,但这一切都归结为您要如何以及为什么要创建表格副本,以及任何细微之处是否会破坏交易.
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.
这是基于此线程中 E.Mantovanelli 的版本的版本。这更正了唯一索引在生成的脚本中不包含关键字 UNIQUE 的问题。它还添加了参数,因此可以在没有非聚集索引的情况下创建表,或者您只能编写非聚集索引的脚本。我用它来创建一个阶段表,加载它添加非聚集索引然后进行表切换,这允许加载运行得更快并且索引不会碎片化。
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/