Pregunta

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.

Aquí están los detalles:

  1. Copie solo la 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. Necesito hacer esto programáticamente
  5. Sería bueno que también se copiaran las propiedades relacionadas de la tabla / columnas.
¿Fue útil?

Solución

seleccione * en new_table de old_table donde 1 = 0

Ejecute el comando anterior mediante programación.

Otros consejos

Script de la tabla, cambiar el nombre de la tabla en el script, ejecutar el script.

Apuesto a que con SMO puedes hacer esto sin problemas:

  • lea la estructura de su " antiguo " tabla en variables en memoria
  • use esta información de estructura para crear la nueva tabla

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

Entonces, 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 quizás desee copiar, además de que también desee copiar índices, restricciones, etc. - trabajo adicional.

Estoy perplejo porque no hay una manera más fácil de duplicar una " Columna " oponerse a uno nuevo (algo así como un método .Clone ()) para facilitar esto, tal vez no sea un escenario de máxima prioridad, no lo sé ...

¡Espero que esto ayude!

Marc

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

Si usa .NET, puede usar 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);

Debería reemplazar los nombres de la tabla y los 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 ejecuta:

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ía reforzar el código de reemplazo de la cadena, probablemente utilizando expresiones regulares para buscar patrones de creación de objetos T-SQL (es decir, CREAR ÍNDICE, CLAVE EXTRANJERA, etc.).

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

De lo contrario, siempre puede usar SQL Server Management Studio para generar secuencias de comandos CREATE para las tablas que desea copiar y ejecutarlas en la base de datos de destino.

Haga clic con el botón derecho en el objeto que desee, elija generar script y elija su script para generar.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top