SQL Server-创建数据库表的副本并将其放置在同一数据库中?


108

我在数据库DB中有一个表ABC。我想在同一数据库中创建名称为ABC_1,ABC_2,ABC_3的ABC副本。如何使用Management Studio(最好)或SQL查询来做到这一点?

这适用于SQL Server 2008 R2。


1
另一则帖子与上面的用例没有直接关系,但是可以与上述用例相关-stackoverflow.com/questions/6810425/…当您要编辑表的副本(例如,允许为空,更改数据类型等)时,这可能很有用。),而无需重新创建副本。
sequel.learner 2013年

Answers:


212

用途SELECT ... INTO

SELECT *
INTO ABC_1
FROM ABC;

这将创建一个新表ABC_1,该表具有与列相同的列结构ABC并包含相同的数据。但是,约束(例如键,默认值)不会被复制。

您可以使用不同的表名多次运行此查询。


如果您不需要复制数据,只需创建一个具有相同列结构的空表,则添加一个WHERE带有虚假表达式的子句:

SELECT *
INTO ABC_1
FROM ABC
WHERE 1 <> 1;

3
我的问题的完美答案。
sequel.learner 2013年

8
不能完全正常工作。...原始文档中的计算列不会与目标中的列相同。另外,PK和默认的约束,不会复制任何
西蒙·格林

@SimonGreen-您可以使用您的代码发布有关此问题的新问题。
Mahmoud Gamal 2015年

3
当然,它不能完全起作用。他警告说约束不会被复制,主键或默认值也不会被复制。他提供的命令将创建一个具有相同列结构的新表(就像他说的那样),并将所有数据插入到您的新表中。
user5855178'4

1
我发现使用的SELECT TOP(0) *清洁剂不是总是虚假的WHERE声明方法
胸腺嘧啶

21

通过SSMS UI复制架构(生成DDL)

在SSMS中,在“ 对象资源管理器”中展开数据库,转到“ 表”,右键单击所需的表,然后选择“ 脚本表为”,“ 创建为”,“ 新查询编辑器”窗口。查找并替换(CTRL + H)来更改表名(即放在ABC查找内容”字段和ABC_1替换为”中,然后单击“ 确定”)。

通过T-SQL复制架构

其他显示如何通过SQL执行此操作的答案也可以很好地工作,但是此方法的不同之处在于,您还将获得任何索引,约束和触发器。

复制数据

如果要包括数据,请在创建此表后运行以下脚本以从ABC复制所有数据(如果具有标识字段,则保留相同的ID值):

set identity_insert ABC_1 on
insert into ABC_1 (column1, column2) select column1, column2 from ABC
set identity_insert ABC_1 off

1
您确定此方法也会复制索引吗?我尝试过,但没有。
BornToCode

3
您必须设置IDENTITY_INSERTON才能允许“手动”设置标识列,并且在示例中混合了顺序。另外,您必须明确列出您的资料栏
吉恩

2
谢谢@jean; 发现6年后未被发现!固定。
JohnLBevan

这几乎为我解决了问题。最后一个技巧是您可以将SSMS树中的“列”文件夹拖到编辑器中以获取列列表。我在每个表上都有一个时间戳列,因此必须获取列列表,然后删除时间戳。
Wade Hatler

10

如果要复制具有所有约束和键的表,请执行以下步骤:

  1. 在SQL Management Studio中打开数据库。
  2. 右键单击要复制的表。
  3. 选择脚本表为->创建至->新建查询编辑器窗口。这将生成一个脚本以在新的查询窗口中重新创建表。
  4. 更改表名称以及脚本中的相对键和约束。
  5. 执行脚本。

然后,要复制数据,请运行以下脚本:

SET IDENTITY_INSERT DuplicateTable ON

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

SET IDENTITY_INSERT DuplicateTable OFF

4

第一种选择

select *
  into ABC_1
  from ABC;

第二个选项:使用SSIS,即右键单击对象资源管理器中的数据库>所有任务>导出数据

  • 源和目标:您的数据库
  • 来源表:ABC
  • 目标表:ABC_1(将创建表)

2

这是另一个选择:

select top 0 * into <new_table> from <original_table>

2
此请求复制不包含数据的表。用户要求完全复制表格。
Alekzander

1

使用SQL Server Manegement Studio或Netcat,它将更易于操作sql


1

您需要编写SSIS来复制表及其数据,约束和触发器。我们组织中有一个由kalrom Systems开发的名为Kal Admin的软件,该软件具有免费版本供下载(我认为复制表功能是可选的)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.