Как скопировать индексы из одной таблицы в другую в SQL Server

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

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

SELECT * INTO [BackupTable] FROM [OriginalTable]

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

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

Ответ 1

Вы хотите скопировать определение индекса?

Затем вы можете инвертировать индекс, триггеры и т.д., используя параметр "Script" в средстве управления Microsoft SQL

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

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

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

enter image description here

Ответ 2

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

Вы можете щелкнуть правой кнопкой мыши базу данных и нажать "Задачи" → "Сгенерировать скрипты", что позволит вам сделать это

Изменить: это значение по умолчанию, но, по словам TFD, оно может быть изменено, к счастью.

Ответ 3

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

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

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

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

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

Ответ 4

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

Экспорт импорта SSIS

Экспорт DTS Import

Ответ 5

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

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

Ответ 6

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

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