如何在SQL Server中将一个表的索引复制到另一个表

21

我需要将一个表的索引复制到另一个表。这里有许多索引,我不想从头开始重新创建它们,这样也容易出错。

我已经使用了

SELECT * INTO [BackupTable] FROM [OriginalTable]

但是这样并不会复制索引、约束和触发器等内容。

有没有人知道怎么做?

6个回答

52

你想复制索引定义吗?

那么,您可以使用Microsoft SQL管理工具中的“脚本”选项来反向工程化索引、触发器等。

只需在SQL管理工作室表列表中右键单击表名,然后选择“脚本表为”,再选择“创建到”即可。

您无法复制与索引的物理存储相关的索引数据。

首先检查您是否将“工具/选项/SQL Server对象资源管理器/脚本/脚本索引”设置为“True”。某些版本的SQL管理工具中将其设置为false(感谢Mark)。

enter image description here


10

默认情况下,右键单击表格“CREATE”不包括索引或触发器,仅包括表定义和约束。

您可以右键单击数据库,然后单击“任务” ->“生成脚本”,以允许您执行此操作。

编辑:TFD提到这是默认设置,但可以更改,谢天谢地。


2
只有在“工具/选项/SQL Server对象资源管理器/脚本/脚本索引”设置为“False”时,才会出现-1。这是新版本的默认设置吗? - TFD
1
哎呀,看来在2005年和2008 R2中这是默认的(我肯定没有改过它),我很高兴现在能够更容易地完成它了。 - Mark Sowul

3
根据数据库表在其他数据库中的定义和使用方式,我不太熟悉SQL Server,但我认为仅通过复制数据或使用SELECT INTO是无法完成此操作的。
索引需要作为表结构的一部分进行定义,并且需要针对可能存在于表中的任何现有数据生成索引。
唯一的方法是在CREATE TABLE语句期间或在创建表后使用ALTER TABLE语句来完成此操作。
处理数据本身的语句与处理表定义是分开的,因此我认为这方面不会有任何变通或快捷方式。
我相信会有可用工具根据您已有的表生成ALTER TABLE语句来创建所有适当的索引,使其易于操作且可靠。

1
你可以使用sysindexes(或sys.indexes,取决于你的版本)中的信息构建一个脚本来重新创建所有索引,但使用Select * into方法也无法捕捉到外键、主键或任何扩展属性。如果你使用的是2005+版本,你应该真正考虑使用SSIS,如果你使用的是2000版本,则应该考虑使用DTS,两者都有向导来简化这种复制过程。 SSIS导入导出 DTS导入导出

1

在SSMS中右键点击索引,选择生成脚本>创建.

更改表名和索引名称,然后应该就可以了。


-3

你应该明白这里的意思

Sub CopyTemp(tblName As String, Optional WithIndex As Boolean = False)
    Dim db As DAO.Database
    Dim tDefOrig As DAO.TableDef
    Dim tDefNew As DAO.TableDef

    Dim idxOrig As DAO.Index
    Dim idxNew As DAO.Index
    Dim fld As DAO.Field

    Dim tempName As String

    tempName = "temp" & tblName

    Set db = CurrentDb
    db.Execute "Select * Into " & tempName & " From " & tblName

    If WithIndex = True Then
        Set tDefOrig = db.TableDefs(tblName)
        Set tDefNew = db.TableDefs(tempName)

        For Each idxOrig In tDefOrig.Indexes
            Set idxNew = tDefNew.CreateIndex(idxOrig.Name)
            With idxNew
                For Each fld In idxOrig.Fields
                    .Fields.Append .CreateField(fld.Name)
                Next
                .Primary = idxOrig.Primary
                .Unique = idxOrig.Unique
            End With
            tDefNew.Indexes.Append idxNew
            tDefNew.Indexes.Refresh
        Next
    End If

End Sub

1
欢迎来到SO!感谢您抽出时间回答其他用户的问题;但是,请阅读如何回答,确保您正在回答被问到的问题。不幸的是,这个答案并不是很有帮助,因为OP明确提出了一个SQL服务器的问题,并没有提到使用任何编程语言或库,所以这个答案可能对作者没有任何意义,也不适用于他们的情况。 - Michael L.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接