sql-server – 复制表的完整结构

前端之家收集整理的这篇文章主要介绍了sql-server – 复制表的完整结构前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
使用某些方法,当您创建表的副本时,您将丢失索引,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

然而,这得到了很少的投票,很快被微软击落.您可能会发现使用第三方工具生成模式更值得(I’ve blogged about this).

sql Server 2012中,有一些新的元数据函数可以让您比2005,2008和2008 R2中的工作更加接近,将元数据中的列信息拼凑在一起(这有很多警告,例如,如果它是十进制你必须添加精度/比例,如果[n [var [char]]你必须添加长度规格,如果n [var] char你必须将max_length减半,如果它是MAX你必须将-1更改为MAX等等).在sql Server 2012中,这部分更容易一些:

SELECT name,system_type_name,is_nullable FROM
  sys.dm_exec_describe_first_result_set('select * from sys.objects',NULL,0)

结果:

name                   system_type_name  is_nullable
--------------------   ----------------  -----------
name                   nvarchar(128)     0
object_id              int               0
principal_id           int               1
schema_id              int               0
parent_object_id       int               0
type                   char(2)           0
type_desc              nvarchar(60)      1
create_date            datetime          0
modify_date            datetime          0
is_ms_shipped          bit               0
is_published           bit               0
is_schema_published    bit               0

I’ve blogged about this,too.

可以说,与使用sys.columns的复杂方法相比,这更接近您的目标CREATE TABLE语句,但仍有许多工作要做.密钥,约束,行选项中的文本,文件组信息,压缩设置,索引等.这是一个非常长的列表,我将再次建议您查看第三方工具而不是,可能会重复过来 – 使用类比,重新发明轮子.

总而言之,如果您需要通过代码执行此操作,但您可以在sql Server之外执行此操作,则可以考虑使用SMO / PowerShell.见this tipScripter.Script() method.

猜你在找的MsSQL相关文章