sql >> Databasteknik >  >> RDS >> Sqlserver

Hur kan jag automatisera uppgiften att skapa skript i SQL Server Management Studio 2008?

SqlPubwiz har mycket begränsade alternativ jämfört med skriptgenereringen i SSMS. Däremot matchar de tillgängliga alternativen med SMO nästan exakt de i SSMS, vilket antyder att det förmodligen till och med är samma kod. (Jag hoppas att MS inte skrev det två gånger!) Det finns flera exempel på MSDN som detta som visar skripttabeller som individuella objekt. Men om du vill att allt ska skriptas korrekt med ett "fullständigt" schema som inkluderar "DRI"-objekt (Declarative Referential Integrity) som främmande nycklar, så löser inte skripttabeller individuellt ut beroenden korrekt. Jag fann att det är nödvändigt att samla alla URN:er och lämna dem till scriptern som en array. Den här koden, modifierad från exemplet, fungerar för mig (även om jag vågar säga att du kan städa upp den och kommentera den lite mer):

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


  1. MariaDB FOUND_ROWS() Förklarad

  2. MySQL - Få radnummer på select

  3. Är det möjligt att köra en sträng i MySQL?

  4. Lägga till (skjuta) och ta bort från en JSON-array i PostgreSQL 9.5+