sql >> Database teknologi >  >> RDS >> Sqlserver

Hvordan kan jeg automatisere opgaven med at generere scripts i SQL Server Management Studio 2008?

SqlPubwiz har meget begrænsede muligheder sammenlignet med scriptgenerering i SSMS. Derimod matcher de tilgængelige muligheder med SMO næsten nøjagtigt dem i SSMS, hvilket tyder på, at det sandsynligvis endda er den samme kode. (Jeg ville håbe, at MS ikke skrev det to gange!) Der er flere eksempler på MSDN som denne, der viser scripting-tabeller som individuelle objekter. Men hvis du ønsker, at alt skal scripte korrekt med et 'fuldt' skema, der inkluderer 'DRI' (Declarative Referential Integrity) objekter som fremmednøgler, så løser scripting af tabeller individuelt ikke afhængighederne korrekt. Jeg fandt ud af, at det er nødvendigt at indsamle alle URN'erne og aflevere dem til scripteren som et array. Denne kode, ændret fra eksemplet, virker for mig (selvom jeg tør sige, at du kunne rydde op og kommentere den lidt mere):

    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. Vælg n tilfældige rækker fra SQL Server-tabellen

  2. Hvordan make_interval() virker i PostgreSQL

  3. Sådan filtreres forespørgselsresultater i PostgreSQL

  4. Sådan nærmer du dig en Got minus en fra en læseopkaldsfejl, når du opretter forbindelse til en Amazon RDS Oracle-instans