sql >> Database >  >> RDS >> Sqlserver

Hoe kan ik de taak scripts genereren in SQL Server Management Studio 2008 automatiseren?

SqlPubwiz heeft zeer beperkte opties in vergelijking met het genereren van scripts in SSMS. Daarentegen komen de beschikbare opties met SMO bijna exact overeen met die in SSMS, wat suggereert dat het waarschijnlijk zelfs dezelfde code is. (Ik hoop dat MS het niet twee keer heeft geschreven!) Er zijn verschillende voorbeelden op MSDN zoals deze die scripttabellen als individuele objecten laten zien. Als u echter wilt dat alles correct wordt gescript met een 'volledig' schema dat 'DRI'-objecten (Declarative Referential Integrity) zoals externe sleutels bevat, dan werken scriptingtabellen afzonderlijk de afhankelijkheden niet correct uit. Ik ontdekte dat het nodig is om alle URN's te verzamelen en ze als een array aan de scripter te geven. Deze code, aangepast ten opzichte van het voorbeeld, werkt voor mij (hoewel ik durf te zeggen dat je het zou kunnen opruimen en er wat meer commentaar op zou kunnen geven):

    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. Laravel OrderOp aantal relaties

  2. Voortschrijdend gemiddelde op basis van tijdstempels in PostgreSQL

  3. Een overzicht van pgModeler voor PostgreSQL

  4. Over het V-formaatelement in Oracle