Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Làm cách nào để tự động hóa tác vụ tạo tập lệnh trong SQL Server Management Studio 2008?

SqlPubwiz có các tùy chọn rất hạn chế so với việc tạo tập lệnh trong SSMS. Ngược lại, các tùy chọn có sẵn với SMO gần như khớp chính xác với các tùy chọn trong SSMS, cho thấy nó có thể là cùng một mã. (Tôi hy vọng MS không viết nó hai lần!) Có một số ví dụ trên MSDN như ví dụ này hiển thị các bảng kịch bản dưới dạng các đối tượng riêng lẻ. Tuy nhiên, nếu bạn muốn mọi thứ hoạt động chính xác với một lược đồ 'đầy đủ' bao gồm các đối tượng 'DRI' (Tính toàn vẹn tham chiếu khai báo) như các khóa ngoại thì các bảng viết kịch bản riêng lẻ sẽ không hoạt động chính xác các phần phụ thuộc. Tôi thấy việc thu thập tất cả các URN và giao chúng cho tập lệnh dưới dạng một mảng là điều cần thiết. Mã này, được sửa đổi từ ví dụ, phù hợp với tôi (mặc dù tôi dám chắc rằng bạn có thể thu gọn nó và nhận xét nó nhiều hơn một chút):

    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. Batch Mode Bitmaps trong SQL Server

  2. Thực thi một tập lệnh SQL lớn (với các lệnh GO)

  3. Ràng buộc cơ sở dữ liệu là gì?

  4. Tạo bảng bằng nén trong SQL Server (T-SQL)

  5. Tìm thứ tự nút trong tài liệu XML trong SQL Server