2013-03-20 43 views
6

Tôi đang viết một quy trình được lưu trữ chạy các truy vấn SELECT trên một số máy chủ được liên kết khác nhau bằng cách sử dụng ký hiệu 4 dấu chấm.Kiểm tra xem máy chủ SQL được liên kết có đang chạy

Vấn đề là, nếu một trong các máy chủ được liên kết không chạy, truy vấn không thành công với lỗi 121 ('The semaphore timeout period has expired'). Các truy vấn SELECT khác sau đó không chạy khi lỗi này dừng phần còn lại của truy vấn đang thi hành.

Tôi muốn kiểm tra @@ERROR sau đó tiếp tục chạy các truy vấn khác.

Làm cách nào để tiếp tục chạy truy vấn nếu kết nối với một trong các máy chủ được liên kết không thành công?

Tôi đang sử dụng SQL 2012.

+0

Chào mừng bạn đến với các máy chủ được liên kết, tốt hơn được gọi là Giải pháp không có sẵn cao. Hãy thử thiết kế một giải pháp với một máy chủ được liên kết. –

+0

@Tim có bạn đã thử sử dụng [TRY CATCH] (http://msdn.microsoft.com/en-us/library/ms175976.aspx) –

+0

hãy xem: http://stackoverflow.com/questions/4442772/ sql-server-catch-exception-and-continue. Đó có phải là câu chuyện của những gì bạn đang cố gắng làm không? – RandomUs1r

Trả lời

6

Bạn đã cố gắng bao quanh cuộc gọi duy nhất của mình với khối ngoại lệ TRY-CATCH?

 BEGIN TRY 
      --First Server Connection (Server1) 192.168.1.x 
      --If the connection isn't available it will raise an exception 
      exec sp_testlinkedserver @servername = Server1 
      --SQL statement here 
    END TRY 
    BEGIN CATCH 
      SELECT ERROR_MESSAGE() 
    END CATCH 

    BEGIN TRY 
      --Second Server Connection (Server2) 192.168.2.x 
      --If the connection isn't available it will raise an exception 
      exec sp_testlinkedserver @servername = Server2 
      --SQL statement here 
    END TRY 
    BEGIN CATCH 
      SELECT ERROR_MESSAGE() 
    END CATCH 

sp_testlinkedserver sẽ tăng ngoại lệ bên trong khối thử trước khi thực thi mã nhưng sẽ không dừng thực hiện quy trình được lưu trữ.

+0

Khá chắc chắn điều này sẽ vẫn còn thời gian chờ, và không phải tất cả các lỗi máy chủ được liên kết sẽ bị bắt. Xem http://dba.stackexchange.com/questions/36178/linked-server-error-not-caught-by-try-catch –

+0

@AaronBertrand bạn chắc chắn đúng, tôi sẽ chỉnh sửa mã của mình – codingadventures

Các vấn đề liên quan