SQL Server - 创建一个数据库表的副本并把它放在同一个数据库中?

139 人关注

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

这是SQL Server 2008 R2的情况。

1 个评论
另一个帖子不直接相关,但可以与上述用例相关 - stackoverflow.com/questions/6810425/. .....当你想编辑表的副本(例如,允许空值,改变数据类型等)而无需重新创建副本时,这可能很有用。
sql
sql-server-2008
tsql
sql-server-2008-r2
sequel.learner
sequel.learner
发布于 2013-03-15
8 个回答
Mahmoud Gamal
Mahmoud Gamal
发布于 2021-10-01
已采纳
0 人赞同

使用 SELECT ... INTO

SELECT *
INTO ABC_1
FROM ABC;

这将创建一个新的表ABC_1 ,它的列结构与ABC 相同,并且包含相同的数据。然而,限制条件(如键,默认值),不会被复制。

你可以多次运行这个查询,每次都使用不同的表名。

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

SELECT *
INTO ABC_1
FROM ABC
WHERE 1 <> 1;
    
对我的问题的完美回答。
不完全是这样....,原始的计算列在目标中没有被复制成相同的。另外,PK和默认约束也没有被复制。
@SimonGreen - 你可以用你的代码为这个问题发布一个新问题。
当然,这并不完全可行。 他警告说,约束条件不会被复制,主键或默认值也不会被复制。 他提供的命令创建了一个具有相同列结构的新表(就像他说的那样),并为你将所有数据插入到新表中。
我发现使用 SELECT TOP(0) * ,比总是假的 WHERE 语句方法更干净。
JohnLBevan
JohnLBevan
发布于 2021-10-01
0 人赞同

通过SSMS用户界面复制模式(生成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
    
你确定这种方法也能复制指数吗?我试过了,没有。
jean
你必须将 IDENTITY_INSERT 设置为 ON ,以允许 "手动 "设置身份列,你在你的例子中混合了顺序。另外,你必须明确列出你的列
谢谢@Jean;在6年没有注意到的情况下,很好地发现了这个问题。 固定了。
这几乎为我解决了问题。最后一个技巧是,你可以把SSMS中树形的 "列 "文件夹拖到编辑器中,以获得列的列表。我在每个表中都有一个时间戳列,所以我必须得到列的列表,然后删除时间戳。
Rousonur Jaman
Rousonur Jaman
发布于 2021-10-01
0 人赞同

如果你想复制表及其所有的约束和键,请按照下面的步骤进行。

  • 在SQL Management Studio中打开数据库。
  • 右键单击你想复制的表。
  • 选择脚本表->创建->新查询编辑器窗口。 这将产生一个脚本,在新的查询窗口中重新创建该表。
  • 改变脚本中的表名和相对键及约束。
  • 执行该脚本。
  • 然后,为了复制数据,运行下面这个脚本。

    SET IDENTITY_INSERT DuplicateTable ON
    INSERT Into DuplicateTable ([Column1], [Column2], [Column3], [Column4],... ) 
    SELECT [Column1], [Column2], [Column3], [Column4],... FROM MainTable
    SET IDENTITY_INSERT DuplicateTable OFF
        
    也不要忘记索引和触发器
    Claude
    Claude
    发布于 2021-10-01
    0 人赞同

    第一个选项

    select *
      into ABC_1
      from ABC;
    

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

  • 源和目标:你的数据库
  • 源表。ABC
  • 目标表。ABC_1(表将被创建)。
  • Keni
    Keni
    发布于 2021-10-01
    0 人赞同

    这是另一种选择。

    select top 0 * into <new_table> from <original_table>
        
    这个请求复制没有数据的表。用户要求完全复制表。
    Chris D
    Chris D
    发布于 2021-10-01
    0 人赞同

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

    gasroot
    gasroot
    发布于 2021-10-01
    0 人赞同

    使用sql server manegement studio或netcat,这将更容易操作sql

    kkid
    kkid
    发布于 2021-10-01
    0 人赞同

    如果你想做N次(在现实世界中可能不现实),你可以试试这个。

    declare @counter int
    set @counter = 2
    declare @tname NVARCHAR(100)
    DECLARE @SQString NVARCHAR(MAX)
    while(@counter <= 20) -- duplicate 20 times
    begin
    SET @tname= concat('Table_',@counter)