Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Wie kann ich die Aufgabe zum Generieren von Skripts in SQL Server Management Studio 2008 automatisieren?

SqlPubwiz hat im Vergleich zur Skriptgenerierung in SSMS sehr eingeschränkte Möglichkeiten. Im Gegensatz dazu stimmen die mit SMO verfügbaren Optionen fast genau mit denen in SSMS überein, was darauf hindeutet, dass es sich wahrscheinlich sogar um denselben Code handelt. (Ich würde hoffen, dass MS es nicht zweimal geschrieben hat!) Es gibt mehrere Beispiele auf MSDN wie dieses, die Skripttabellen als einzelne Objekte zeigen. Wenn Sie jedoch möchten, dass alles korrekt mit einem „vollständigen“ Schema skriptet, das „DRI“-Objekte (Declarative Referential Integrity) wie Fremdschlüssel enthält, funktioniert das Skripten von Tabellen einzeln nicht richtig. Ich fand es notwendig, alle URNs zu sammeln und sie dem Scripter als Array zu übergeben. Dieser Code, der aus dem Beispiel modifiziert wurde, funktioniert für mich (obwohl ich glaube, Sie könnten ihn aufräumen und ein bisschen mehr kommentieren):

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