sql >> Databáze >  >> RDS >> Sqlserver

Jak mohu automatizovat úlohu generování skriptů v SQL Server Management Studio 2008?

SqlPubwiz má ve srovnání s generováním skriptů v SSMS velmi omezené možnosti. Naproti tomu možnosti dostupné u SMO se téměř přesně shodují s možnostmi v SSMS, což naznačuje, že se pravděpodobně jedná dokonce o stejný kód. (Doufám, že to MS nenapsal dvakrát!) Na MSDN je několik příkladů, jako je tento, které ukazují skriptovací tabulky jako jednotlivé objekty. Pokud však chcete, aby se vše skriptovalo správně s „úplným“ schématem, které zahrnuje objekty „DRI“ (deklarativní referenční integrita), jako jsou cizí klíče, pak jednotlivé skriptovací tabulky nevyřeší závislosti správně. Zjistil jsem, že je nutné shromáždit všechna URN a předat je skriptovači jako pole. Tento kód upravený z příkladu mi funguje (i když si troufám tvrdit, že byste to mohli uklidit a trochu více okomentovat):

    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. Při navazování připojení k serveru SQL došlo k chybě související se sítí nebo specifickou instancí

  2. Jak zobrazím seznam všech tabulek ve všech databázích na serveru SQL Server v jedné sadě výsledků?

  3. MayBeSQL přichází do Microsoft Access!

  4. Příklady MAKEDATE() – MySQL