Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Comment puis-je automatiser la tâche de génération de scripts dans SQL Server Management Studio 2008 ?

SqlPubwiz a des options très limitées par rapport à la génération de script dans SSMS. En revanche, les options disponibles avec SMO correspondent presque exactement à celles de SSMS, ce qui suggère qu'il s'agit probablement même du même code. (J'espère que MS ne l'a pas écrit deux fois !) Il existe plusieurs exemples sur MSDN comme celui-ci qui affichent les tables de script en tant qu'objets individuels. Cependant, si vous voulez que tout soit correctement scripté avec un schéma "complet" qui inclut des objets "DRI" (intégrité référentielle déclarative) comme des clés étrangères, le scriptage des tables individuellement ne fonctionne pas correctement sur les dépendances. J'ai trouvé qu'il était nécessaire de collecter tous les URN et de les remettre au scripteur sous forme de tableau. Ce code, modifié à partir de l'exemple, fonctionne pour moi (même si j'ose dire que vous pourriez le ranger et le commenter un peu plus) :

    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();