2009-07-31 22 views
7

Necesito copiar una tabla que ya tengo en una base de datos del servidor SQL, pero no necesito los datos contenidos en la tabla fuente. Los ejemplos que encontré solo implican copiar los datos.Cómo copiar mediante programación una tabla en SQL Server, sin los datos?

Aquí están los detalles: sólo se

  1. Copiar estructura de la tabla, no los datos.
  2. Las tablas de origen y destino están en la misma base de datos.
  3. La tabla de destino aún no existe.
  4. necesidad de hacer esto mediante programación
  5. Sería bueno tener propiedades relacionadas de la tabla/columnas pueden copiar también.
+0

¿Qué idioma/plataforma? DO#? – MusiGenesis

+0

C# y ASP.NET, pero eso realmente no importa demasiado. Estoy más buscando el SQL que necesitaría ejecutar. –

+0

No lo sigo del todo. El SQL que necesitaría ejecutar es el script CREATE TABLE con el nombre de tabla modificado, como se explica en las respuestas. Necesita saber cómo generar programáticamente este script desde SQL Server (cambiar el nombre de la tabla una vez que tenga esto no sería demasiado difícil), para lo cual el idioma es relevante. No sé la respuesta a esto, y estoy interesado en ver cómo se puede hacer esto. – MusiGenesis

Respuesta

6

SELECT * en new_table de old_table donde 1 = 0

ejecutar el comando anterior mediante programación.

+0

lo que estaba pensando, pero no hará nada "extra", índice, restricciones, valores predeterminados, pk, fk. Sin embargo, hará identidades ... –

+0

Bueno, pero eso no copiará claves primarias/foráneas, columnas de identidad, restricciones, etc. (OP podría no necesitar esas cosas, sin embargo) –

+0

@Ben M, hará identidades –

3

Escriba la tabla, cambie el nombre de la tabla en el script, ejecute el script.

+1

Perdón, debería dejar mi pregunta de que quiero hacer esto programáticamente. –

1

En SQL Management Studio, haga clic con el botón derecho en el nombre de la tabla y en la tabla de scripts como | CREAR PARA ... | Nueva ventana del editor de consultas. Eso le dará una secuencia de comandos que puede ejecutar en cualquier base de datos.

+0

Cualquier base de datos, excepto la base de datos original, que es lo que necesita el solicitante. – MusiGenesis

0

¿Necesita hacer esto automáticamente (sin interferencia manual)?

De lo contrario, siempre puede utilizar SQL Server Management Studio para generar scripts CREATE para las tablas que desea copiar y ejecutar en la base de datos de destino.

Haga clic con el botón derecho sobre el objeto que desee, elija Generar secuencia de comandos y elija la secuencia de comandos para generar.

+0

Tiene que ser automático. –

2

apuesto con SMO puede hacerlo sin problema:

  • leer la estructura de la tabla "viejo" en variables en memoria
  • uso esta estructura de información para crear la nueva tabla

rápidamente encontré algunos artículos interesantes que muestran al menos parte de la solución:

Así que básicamente se reduciría a algo como esto:

Server localServer = new Server("(local)"); 
Database testDB = localServer.Databases["test"]; 

Table myTable = testDB.Tables["TestFiles"]; 
myTable.Refresh(); 

Table newTable = new Table(testDB, "MyNewTableName"); 

foreach(Column col in myTable.Columns) 
{ 
    Column newColumn = new Column(newTable, col.Name); 

    newColumn.DataType = col.DataType; 
    newColumn.Default = col.Default; 
    newColumn.Identity = col.Identity; 
    newColumn.IdentityIncrement = col.IdentityIncrement; 
    newColumn.IdentitySeed = col.IdentitySeed; 
    newColumn.Nullable = col.Nullable; 

    newTable.Columns.Add(newColumn); 
} 

newTable.Create(); 

Por supuesto, hay más propiedades en la "Columna", que es posible que desee copiar, además de que también puede ser que desee para copiar índices, restricciones, etc. - trabajo adicional.

Me sorprende que no haya una manera más fácil de duplicar un objeto "Columna" a uno nuevo (algo así como un método .Clone) para aliviar esto; tal vez no sea un escenario de alta prioridad, No lo sé....

Espero que esto ayude!

Marc

+0

Siempre podríamos agregar un método de extensión de clon :) –

+0

@SkippyFire: seguro - Me quedé perplejo de que ya no estaba allí. –

1

Si está utilizando .NET, puede utilizar objetos de administración del servidor:

var so = new ScriptingOptions(); 
so.Triggers = true; 
so.DriForeignKeys = true; 
so.DriDefaults = true; 
so.DriAllConstraints = true; 
so.DriAllKeys = true; 
so.DriIndexes = true; 
so.DriUniqueKeys = true; 
so.DriPrimaryKey = true; 
so.Indexes = true; 
so.Default = true; 
so.ClusteredIndexes = true; 
so.IncludeDatabaseContext = true; 
so.TargetServerVersion = SqlServerVersion.Version90; 

var server = new Server("ServerName"); 
var db = server.Databases["DatabaseName"]; 
var stringColl = db.Tables["Table"].Script(so); 

que había necesidad de sustituir los nombres de la tabla y objetos asociados (por ejemplo FK_OldTableName_xxx con FK_NewTableName_xxx) en el script generado:

var sb = new StringBuilder(); 
foreach(var s in stringColl) 
{ 
    var r = s.Replace("OldTableName", "NewTableName"); 
    sb.AppendLine(r); 
} 

y luego ejecutar:

db.Execute(sb.ToString()); 

Tenga en cuenta que este es un código bastante ingenuo: solo funcionará si los nombres de sus restricciones y claves siguen el formato: FK_OldTableName_xxx/CK_OldTableName_xxx .. si tienen otros nombres, necesitará reforzar el código de reemplazo de cadena , probablemente usando Regexes para buscar patrones de creación de objetos T-SQL (es decir, CREAR ÍNDICE, LLAVE EXTRANJERA ... etc.).

+0

marc_s es otro enfoque que usa SMO, y aunque es probable que haya más trabajo para implementar es menos propenso a errores que el mío si desea realizar esta tarea en una amplia variedad de situaciones. –

+0

Sí, eso suena bien, pero gracias por esta información Ben! Esto definitivamente podría ser útil para otros fines, como la generación automática de scripts de respaldo y cosas por el estilo. –

Cuestiones relacionadas