2011-04-08 7 views
5

Chúng ta có mã đọc trong tập hợp tập lệnh SQL và sau khi thực hiện một số xử lý trên chúng, chúng sẽ tách chúng thành các lô bằng cách tìm từ khóa “GO” và sau đó gửi mỗi lô tới Sql Server bằng cách sử dụng một SqlCommon riêng biệt.Từ .net làm cách nào để gửi nhiều "lô" SQL tới Sql-Server mà không có nhiều chuyến đi khứ hồi?

Có cách nào tốt hơn để làm điều này vì vậy chúng tôi:

  • Đừng có nhiều chuyến đi vòng
  • Không bao giờ có SQL Server chờ đợi các đợt tiếp theo
  • Chạy nhanh hơn.

(Các lô chủ yếu là tạo bảng, chỉ mục, chế độ xem và lưu trữ procs. Tốc độ là một vấn đề như các công cụ dòng phổ biến của chúng tôi có thể không được cài đặt trên máy chạy mã này.)

+0

Là khứ hồi w.r.t. thực sự có ý nghĩa cơ sở dữ liệu ops? Tôi đoán bạn đã sắp xếp càng nhiều càng tốt vào mỗi lô? – Rup

+0

@Rup, kết hợp các lô sẽ mất rất nhiều thời gian chỉnh sửa tay SQL. Tôi đang cố gắng tìm kiếm lợi ích nhanh chóng cho chúng ta một số lợi ích. –

Trả lời

2

Giải pháp nhanh nhất trên thực tế là chia nhỏ trên GO. Tuy nhiên, một giải pháp thay thế khác là sử dụng các đối tượng quản lý SQL (SMO) và gửi toàn bộ kịch bản lệnh đến SQL Server trong một lần giảm như thể bạn đang sử dụng Management Studio.

var connectionString = ConfigurationManager.ConnectionStrings[ connectionStringName ].ConnectionString; 
using (var sqlConnection = new SqlConnection(connectionString)) 
{ 
    var server = new Server(new ServerConnection(sqlConnection)); 
    server.ConnectionContext.Connect(); 
    server.ConnectionContext.ExecuteNonQuery(sqlFileContents); 
    server.ConnectionContext.Disconnect(); 
} 

SQL Server Management Objects (SMO)

+0

Hãy phân chia rất cẩn thận trên GO: Ngay sau khi bạn có các nhận xét nhiều dòng có chứa dòng GO (tức là các tập lệnh nhiều đợt được nhận xét một phần) tất cả các địa ngục sẽ bị mất. Nếu bạn cần xử lý loại trường hợp này, tốt nhất là nên đi với SMO. – Tao

+0

Một lưu ý khác về câu trả lời này - bất kể bạn chia rẽ GO hay sử dụng SMO, ở đó ** sẽ ** có nhiều chuyến đi khứ hồi: SMO cũng sẽ gửi riêng từng lô đến máy chủ. – Tao

3

2 ý tưởng ...

Đóng gói tập lệnh và sửa đổi nó thành runnable dưới dạng đoạn mã SQL động. Tải lên toàn bộ lô trong luồng bằng nvarchar (tối đa) và chạy nó bằng sp_executesql ở phía máy chủ. Vì bạn kiểm soát nó để thử nghiệm tích hợp, SQL động không phải là vấn đề lớn.

Tải toàn bộ lô lên máy chủ dưới dạng nvarchar (tối đa). Lưu tệp trên máy chủ SQL Server bằng cách sử dụng xp_cmdshell hoặc CLR hoặc khác. Một lần nữa sử dụng xp_cmdshell, sử dụng sqlcmd để chạy tập lệnh.

Với bất kỳ loại sắp xếp nào, bạn sẽ mất một số cách để xác định chính xác vị trí đã ngắt, vì bạn đang tự động hóa thử nghiệm tích hợp sau khi tất cả.

+0

Hiểu biết về các bit bị hỏng của SQL có giá trị đối với chúng tôi, vì vậy chúng tôi sẽ phải xử lý "phía máy chủ" của lô cung cấp các lỗi tốt. –