Bağlı sunucular listesi üzerinden döngü ve her birine karşı belirli bir sorgu yürütmek için bir iş kuruyorum. Belirli bir sunucu ile ilgili bir sorun varsa ben oturum ama daha sonra diğer sunucular ile devam böylece bir TRY-CATCH bloğu içinde sorgu yürütmek çalışıyorum.
Döngü içinde yürüttüğüm sorgu şöyle görünür:
BEGIN TRY
SELECT *
FROM OPENQUERY([server1], 'SELECT 1 AS c;');
END TRY
BEGIN CATCH
SELECT ERROR_NUMBER(), ERROR_MESSAGE();
END CATCH;
PRINT 'We got past the Catch block!';
Sunucuya bağlanırken bir sorun varsa, kod hemen başarısız olur ve CATCH
bloğa aktarılmaz . Sunucu bağlanır, ancak asıl sorguda bir hata varsa, örneğin sıfıra bölme, bu CATCH
blok tarafından beklendiği gibi yakalanır .
Örneğin, var olmadığını bildiğim bir adla bağlantılı bir sunucu oluşturdum. Yukarıdakileri yürütürken sadece alıyorum:
OLE DB provider "SQLNCLI" for linked server "nonserver" returned message
"Login timeout expired".
OLE DB provider "SQLNCLI" for linked server "nonserver" returned message
"An error has occurred while establishing a connection to the server.
When connecting to SQL Server 2005, this failure may be caused by the
fact that under the default settings SQL Server does not allow remote
connections.".
Msg 53, Level 16, State 1, Line 0
Named Pipes Provider: Could not open a connection to SQL Server [53].
BOL okudum TRY-CATCH
ve bağlantıyı kesen seviye 20 + hataları yakalamayacağını biliyorum ama bu böyle görünmüyor (bu sadece seviye 16).
Bu hataların neden doğru bir şekilde yakalanmadığını bilen var mı?