2009-03-16 32 views
16

Necesito copiar los índices de una tabla a otra. Hay MUCHOS índices y no quiero recrearlos desde cero. Parece propenso a errores de todos modos.Cómo copiar índices de una tabla a otra en SQL Server

He copiado la estructura utilizando

SELECT * INTO [BackupTable] FROM [OriginalTable] 

Pero eso no quiere copiar índices, restricciones, etc. desencadenantes

¿Alguien sabe cómo hacer esto?

Respuesta

42

¿Desea copiar la definición del índice?

A continuación, puede realizar ingeniería inversa del índice, disparadores, etc utilizando la opción de "escritura" en la herramienta de administración de Microsoft SQL clic

Simplemente haga en un nombre de tabla en la lista de tablas SQL Management Studio y seleccione "Tabla de secuencias de comandos como "y luego 'Crear para'

no es posible copiar los datos del índice, ya que se refiere al almacenamiento físico del Índice

Primera compruebe que tiene" Herramientas/Opciones/SQL Explorador de objetos de servidor/Scripting/Script Indexes "establecido en" True ". Esto se establece en false en alguna versión de la herramienta de administración de SQL (gracias Marcos)

enter image description here

1

No estoy familiarizado específicamente con SQL Server; sin embargo, según las tablas de bases de datos definidas y utilizadas en otras bases de datos, diría que no hay forma de hacerlo copiando los datos o usando SELECT INTO.

Los índices deben definirse como parte de la estructura de la tabla y deben generarse para cualquier dato existente que pueda haber en la tabla.

La única forma de hacerlo es durante la sentencia CREATE TABLE utilizando una instrucción ALTER TABLE después de crear la tabla.

Las declaraciones para trabajar con los datos en sí son independientes de trabajar con las definiciones de la tabla, por lo que no creo que haya ninguna solución o atajo para esto.

Estoy seguro de que habría herramientas disponibles para generar la instrucción ALTER TABLE para crear todos los índices apropiados basados ​​en la tabla que ya tiene, haciéndolo fácil y confiable.

1

Se puede construir una secuencia de comandos utilizando la información de sysindexes (o sys.indexes dependiendo de la versión) para recrear todo de los índices, pero al usar el enfoque Select * into tampoco se obtendrán claves externas ni principales ni ninguna propiedad extendida. Debería considerar el uso de SSIS si está usando una versión 2005+, o DTS si está usando 2000, ambos tienen asistentes para simplificar este tipo de copia.

SSIS Import Export

DTS Import Export

1

Rightclick el índice en SSMS y hacer script como> crear.

Cambiar el nombre de tabla y el nombre del índice y que debe ser fijado

9

Por defecto, el botón derecho del ratón mesa de "crear" no incluye los índices o disparadores, sólo la definición de la tabla y las restricciones.

Puede hacer clic derecho en la base de datos dey haga clic en "Tareas" -> "generar secuencias de comandos", que le permitirá hacer esto

Editar: este es el defecto, pero como menciona TFD puede ser cambiado, por suerte .

+1

-1 Sólo si tiene "Índices de Herramientas/Opciones del explorador de objetos de servidor/SQL/Scripting/escritura" establecida en "false". ¿Es esto un defecto en la nueva versión? – TFD

+1

Bueno, ¿qué tal eso? Evidentemente es el valor predeterminado en 2005 y 2008 R2 (ciertamente no lo cambié), y estoy muy feliz de poder hacerlo más fácilmente. –

-1

Usted debe obtener la idea aquí

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

¡Bienvenido a SO! Gracias por tomarse el tiempo para responder a la pregunta de otro usuario; sin embargo, lea [cómo responder] (http://stackoverflow.com/help/how-to-answer) y asegúrese de estar respondiendo la pregunta que se le hace. Desafortunadamente, esta respuesta no es muy útil ya que el OP hizo específicamente una pregunta al servidor SQL y no dijo nada sobre el uso de ningún lenguaje de programación o biblioteca, por lo que esta respuesta puede no tener ningún sentido para el autor o aplicarse a su situación. –

Cuestiones relacionadas