sql >> Base de Datos >  >> RDS >> Sqlserver

¿Cómo puedo automatizar la tarea de generar scripts en SQL Server Management Studio 2008?

SqlPubwiz tiene opciones muy limitadas en comparación con la generación de scripts en SSMS. Por el contrario, las opciones disponibles con SMO coinciden casi exactamente con las de SSMS, lo que sugiere que probablemente sea incluso el mismo código. (¡Espero que MS no lo haya escrito dos veces!) Hay varios ejemplos en MSDN como este que muestran tablas de secuencias de comandos como objetos individuales. Sin embargo, si desea que todo funcione correctamente con un esquema 'completo' que incluya objetos 'DRI' (Integridad referencial declarativa) como claves foráneas, la creación de secuencias de comandos de tablas individualmente no resuelve las dependencias correctamente. Descubrí que es necesario recopilar todos los URN y entregárselos al scripter como una matriz. Este código, modificado del ejemplo, funciona para mí (aunque me atrevo a decir que podrías arreglarlo y comentarlo un poco más):

    using Microsoft.SqlServer.Management.Smo;
    using Microsoft.SqlServer.Management.Sdk.Sfc;
    // etc...

    // Connect to the local, default instance of SQL Server. 
    Server srv = new Server();

    // Reference the database.  
    Database db = srv.Databases["YOURDBHERE"];

    Scripter scrp = new Scripter(srv);
    scrp.Options.ScriptDrops = false;
    scrp.Options.WithDependencies = true;
    scrp.Options.Indexes = true;   // To include indexes
    scrp.Options.DriAllConstraints = true;   // to include referential constraints in the script
    scrp.Options.Triggers = true;
    scrp.Options.FullTextIndexes = true;
    scrp.Options.NoCollation = false;
    scrp.Options.Bindings = true;
    scrp.Options.IncludeIfNotExists = false;
    scrp.Options.ScriptBatchTerminator = true;
    scrp.Options.ExtendedProperties = true;

    scrp.PrefetchObjects = true; // some sources suggest this may speed things up

    var urns = new List<Urn>();

    // Iterate through the tables in database and script each one   
    foreach (Table tb in db.Tables)
    {
        // check if the table is not a system table
        if (tb.IsSystemObject == false)
        {
            urns.Add(tb.Urn);
        }
    }

    // Iterate through the views in database and script each one. Display the script.   
    foreach (View view in db.Views)
    {
        // check if the view is not a system object
        if (view.IsSystemObject == false)
        {
            urns.Add(view.Urn);
        }
    }

    // Iterate through the stored procedures in database and script each one. Display the script.   
    foreach (StoredProcedure sp in db.StoredProcedures)
    {
        // check if the procedure is not a system object
        if (sp.IsSystemObject == false)
        {
            urns.Add(sp.Urn);
        }
    }

    StringBuilder builder = new StringBuilder();
    System.Collections.Specialized.StringCollection sc = scrp.Script(urns.ToArray());
    foreach (string st in sc)
    {
        // It seems each string is a sensible batch, and putting GO after it makes it work in tools like SSMS.
        // Wrapping each string in an 'exec' statement would work better if using SqlCommand to run the script.
        builder.AppendLine(st);
        builder.AppendLine("GO");
    }

    return builder.ToString();