select * into dbo.table2 from dbo.table1;
这只是表格的简单副本;缺少所有索引/约束.如何复制表结构(不使用备份)?
我主要是想手动执行此操作,但如果不可能,我会接受任何解决方案.
解决方法
这将输出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
可以说,与使用sys.columns的复杂方法相比,这更接近您的目标CREATE TABLE语句,但仍有许多工作要做.密钥,约束,行选项中的文本,文件组信息,压缩设置,索引等.这是一个非常长的列表,我将再次建议您查看第三方工具而不是,可能会重复过来 – 使用类比,重新发明轮子.
总而言之,如果您需要通过代码执行此操作,但您可以在sql Server之外执行此操作,则可以考虑使用SMO / PowerShell.见this tip和Scripter.Script() method.