2009-03-16 6 views
16

Ich muss die Indizes von einer Tabelle in eine andere kopieren. Es gibt eine Menge von Indizes und ich möchte sie nicht von Grund auf neu erstellen. Scheint sowieso fehleranfällig.Wie kopiert man Indizes von einer Tabelle in eine andere in SQL Server

ich kopiert haben die Struktur mit

SELECT * INTO [BackupTable] FROM [OriginalTable] 

Aber dass Indizes nicht kopieren, Einschränkungen, Trigger usw.

Wer weiß, wie dies zu tun?

Antwort

42

Möchten Sie die Indexdefinition kopieren?

Dann können Sie den Index Reverse Engineering, löst usw. mit der „Script“ Option in dem Microsoft SQL-Management-Tool

Einfach Rechtsklick auf einen Tabellennamen in der SQL Management Studio Tabellenliste und wählen Sie „Script Tabelle als „und dann auf‚Create an‘

Sie können die Indexdaten nicht kopiert werden, da sie auf die physische Speicherung des Index bezieht

Erste Prüfung, die Sie“ Extras/Optionen/SQL Server Object Explorer/Scripting/Skript Indizes "auf" True "gesetzt. Dies wird auf false gesetzt in irgendeiner Version des SQL Management-Tool (dank Mark)

enter image description here

1

Ich bin nicht speziell mit SQL Server vertraut, aber basierend auf der Art, wie Datenbanktabellen in anderen Datenbanken definiert und verwendet werden, würde ich sagen, dass es keine Möglichkeit gibt, dies zu tun, indem Sie einfach die Daten kopieren oder SELECT INTO verwenden.

Die Indizes müssen als Teil der Tabellenstruktur definiert werden und müssen für alle vorhandenen Daten generiert werden, die in der Tabelle enthalten sein können.

Die einzige Möglichkeit, dies zu tun, ist während der CREATE TABLE-Anweisung mit einer ALTER TABLE-Anweisung, nachdem die Tabelle erstellt wurde.

Anweisungen für die Arbeit mit den Daten selbst sind getrennt von der Arbeit mit den Tabellendefinitionen, also denke ich nicht, dass es irgendwelche Arbeit oder Abkürzung dafür geben wird.

Ich bin mir sicher, dass es Werkzeuge geben würde, um die ALTER TABLE-Anweisung zu erzeugen, um alle geeigneten Indizes basierend auf der bereits vorhandenen Tabelle zu erstellen, was es einfach und zuverlässig macht.

1

Sie ein Skript bauen könnten die Informationen in Sysindexes (oder sys.indexes je nach Version) mit allen neu zu erstellen der Indizes, aber mit der Select * in Ansatz wird auch nicht ausländische und primäre Schlüssel oder erweiterte Eigenschaften abholen. Sie sollten sich wirklich mit der Verwendung von SSIS beschäftigen, wenn Sie eine 2005+ Version verwenden, oder von DTS, wenn Sie 2000 verwenden, beide haben Assistenten, um diese Art von Kopie zu vereinfachen.

SSIS Import Export

DTS Import Export

1

Rechtsklick auf den Index in SSMS und tun Skript als> erstellen.

Ändern der Tabellenname und der Indexname und Sie sollten das Rechtsklick-Tabelle „CREATE“ umfasst nicht die Indizes oder Trigger, nur die Tabellendefinition und Einschränkungen

9

standardmäßig eingestellt werden.

Sie können rechts klicken Sie auf die Datenbank und klicken Sie auf „Tasks“ -> „Generate Scripts“, die Sie mit diesen

Bearbeiten tun können: dies ist die Vorgabe, sondern als TFD erwähnt kann es geändert werden, zum Glück .

+1

-1 Nur wenn Sie "Extras/Optionen/SQL Server Objekt-Explorer/Scripting/Script Indizes" auf "False" haben. Ist dies ein Standard in der neuen Version? – TFD

+1

Nun, wie wäre es damit? Es ist offensichtlich der Standard in 2005 und 2008 R2 (ich habe es natürlich nicht geändert), und ich bin sehr froh darüber, dass ich es einfacher machen kann. –

-1

Sie sollten die Idee kommen, hier

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

Willkommen bei SO! Danke, dass Sie sich die Zeit genommen haben, die Frage eines anderen Benutzers zu beantworten. Lesen Sie jedoch [Antwort] (http://stackoverflow.com/help/how-to-answer) und stellen Sie sicher, dass Sie die Frage beantworten, die gestellt wird. Leider ist diese Antwort nicht sehr hilfreich, da das OP speziell eine SQL-Server-Frage gestellt hat und nichts über die Verwendung einer Programmiersprache oder Bibliothek gesagt hat, so dass diese Antwort für den Autor keinen Sinn ergibt oder auf ihre Situation zutrifft. –