Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Jak zautomatyzować zadanie generowania skryptów w programie SQL Server Management Studio 2008?

SqlPubwiz ma bardzo ograniczone możliwości w porównaniu do generowania skryptów w SSMS. W przeciwieństwie do tego opcje dostępne w SMO prawie dokładnie odpowiadają tym w SSMS, co sugeruje, że prawdopodobnie jest to ten sam kod. (Mam nadzieję, że MS nie napisał tego dwa razy!) Istnieje kilka przykładów w witrynie MSDN, takich jak ten, które pokazują tabele skryptów jako pojedyncze obiekty. Jeśli jednak chcesz, aby wszystko było poprawnie skryptowane za pomocą „pełnego” schematu, który zawiera obiekty „DRI” (Declarative Referential Integrity), takie jak klucze obce, wówczas poszczególne tabele skryptowe nie działają poprawnie z zależnościami. Stwierdziłem, że konieczne jest zebranie wszystkich URN i przekazanie ich skrypterowi jako tablicy. Ten kod, zmodyfikowany z przykładu, działa dla mnie (choć śmiem twierdzić, że mógłbyś go uporządkować i skomentować nieco bardziej):

    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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Wstaw znaki w środku ciągu w SQL Server (T-SQL)

  2. Przechowywanie obrazów w SQL Server?

  3. Jak usunąć rozszerzone znaki ASCII z ciągu w T-SQL?

  4. Co to jest impas w SQL Server?

  5. Operacje CRUD programu SQL Server