Как скопировать индексы из одной таблицы в другую в SQL Server - PullRequest
18 голосов
/ 17 марта 2009

Мне нужно скопировать индексы из одной таблицы в другую. Есть много индексов, и я не хочу воссоздавать их с нуля. В любом случае кажется подверженным ошибкам.

Я скопировал структуру, используя

SELECT * INTO [BackupTable] FROM [OriginalTable]

Но это не копирует индексы, ограничения, триггеры и т.д.

Кто-нибудь знает, как это сделать?

Ответы [ 6 ]

44 голосов
/ 17 марта 2009

Хотите скопировать определение индекса?

Затем можно выполнить обратный инжиниринг индекса, триггеров и т. Д. С помощью параметра «Сценарий» в инструменте управления Microsoft SQL

Просто щелкните правой кнопкой мыши имя таблицы в списке таблиц SQL Management Studio и выберите «Таблица сценариев как», а затем «Создать в»

Вы не можете копировать данные индекса, поскольку они связаны с физическим хранилищем индекса

Сначала убедитесь, что для "Инструменты / Параметры / Обозреватель объектов SQL Server / Сценарии / Индексы сценариев" установлено значение "Истина". В некоторых версиях инструмента управления SQL установлено значение false (спасибо Mark)

enter image description here

9 голосов
/ 03 мая 2012

По умолчанию таблица правого клика «CREATE» не включает индексы или триггеры, только определение таблицы и ограничения.

Вы можете щелкнуть правой кнопкой мыши по базе данных и выбрать «Задачи» -> «Создать сценарии», что позволит вам сделать это

Редактировать: это значение по умолчанию, но, как упоминает TFD, его можно изменить, к счастью.

1 голос
/ 17 марта 2009

Щелкните правой кнопкой мыши индекс в SSMS и выполните скрипт как> создать.

Измените имя таблицы и имя индекса, и вы должны установить

1 голос
/ 17 марта 2009

Вы можете создать скрипт, используя информацию в sysindexes (или sys.indexes в зависимости от вашей версии), чтобы воссоздать все индексы, но использование метода Select * в подходе также не приведет к подбору внешних и первичных ключей или любые расширенные свойства. Вам действительно стоит задуматься об использовании SSIS, если вы используете версию 2005+, или DTS, если вы используете 2000, у обоих есть мастера, упрощающие этот вид копирования.

SSIS Импорт-Экспорт

DTS Import Export

1 голос
/ 17 марта 2009

Я не очень хорошо знаком с SQL Server, однако, основываясь на том, как таблицы баз данных определяются и используются в других базах данных, я бы сказал, что это невозможно сделать, просто скопировав данные или используя SELECT INTO.

Индексы должны быть определены как часть структуры таблицы и должны быть сгенерированы для любых существующих данных, которые могут быть в таблице.

Единственный способ сделать это - выполнить инструкцию CREATE TABLE, используя инструкцию ALTER TABLE после создания таблицы.

Операторы для работы с самими данными отделены от работы с определениями таблиц, поэтому я не думаю, что для этого будет какое-либо решение или ярлык.

Я уверен, что будут доступны инструменты для генерации оператора ALTER TABLE для создания всех соответствующих индексов на основе уже имеющейся таблицы, что сделает ее простой и надежной.

0 голосов
/ 08 апреля 2017

Вы должны получить идею здесь

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
...