Невозможно обнаружить ошибки подключения между связанным сервером - PullRequest
0 голосов
/ 10 января 2019

По какой-то причине я не могу отловить ошибки, связанные с подключением, только на конкретном сервере.

Существует связь между двумя SQL-серверами через связанный сервер. Иногда соединение плохое и в результате появляется следующая ошибка:

Поставщик TCP: указанное сетевое имя больше не доступно.

У меня есть try-catch для решения этой проблемы, и все работает отлично, поскольку уровень серьезности не превышает 20.

BEGIN TRY
DECLARE @return_value int

EXEC    @return_value = [dbo].[sp_someSP]

SELECT  'Return Value' = @return_value

END TRY
BEGIN CATCH
SELECT ERROR_MESSAGE(),ERROR_NUMBER(),ERROR_SEVERITY(),ERROR_PROCEDURE()
--NEVER GOES HERE!!!
END CATCH

процедура вызовет следующую ошибку:

Поставщик OLE DB "STREAM" для связанного сервера "(null)" вернул сообщение Msgstr "Ошибка протокола в потоке TDS". Поставщик OLE DB "STREAM" для связанных сервер "(null)" вернул сообщение "Ошибка связи". Сообщение 64, Уровень 16, состояние 1, строка 0 Провайдер TCP: указанное сетевое имя больше недоступно. Поставщик OLE DB "STREAM" для связанного сервера «(null)» вернуло сообщение «Тайм-аут запроса истек».

Я протестировал связанный сервер и работает нормально (я даже пересоздал связанный сервер)

Linked Server Configuration:

@optname=N'collation compatible', @optvalue=N'false'

@optname=N'data access', @optvalue=N'true'

@optname=N'dist', @optvalue=N'false'

@optname=N'pub', @optvalue=N'false'

@optname=N'rpc', @optvalue=N'true'

@optname=N'rpc out', @optvalue=N'true'

@optname=N'sub', @optvalue=N'false'

@optname=N'connect timeout', @optvalue=N'100'

@optname=N'collation name', @optvalue=null

@optname=N'lazy schema validation', @optvalue=N'false'

@optname=N'query timeout', @optvalue=N'100'

@optname=N'use remote collation', @optvalue=N'true'

@optname=N'remote proc transaction promotion', @optvalue=N'false'

SQL Server: 2008 R2 Standard Edition (64-разрядная версия)

Я не могу понять, почему я не могу уловить следующую ошибку.

РЕДАКТИРОВАТЬ: проблема лежит за пределами выполнения хранимой процедуры. Даже если я выполню что-то вроде этого:

EXEC ('Select * from SomeTable') at LinkedServer

Иногда (менее 0,1% случаев) я получаю указанную ошибку. Я пытаюсь найти какую-то модель, но пока не повезло. Кроме того, я искал, есть ли какая-то конфигурация сети, которая могла бы убивать запросы, но результат был отрицательным.

1 Ответ

0 голосов
/ 14 января 2019

Попробуйте использовать динамический SQL следующим образом:

BEGIN TRY
    DECLARE @sql VARCHAR(1000) = 'EXEC [YourDatabase].[dbo].[sp_someSP]';   
    EXEC (@sql) AT [YourServer];
END TRY
BEGIN CATCH
    SELECT ERROR_NUMBER(), ERROR_MESSAGE();
END CATCH;

Или на один уровень выше:

BEGIN TRY
    DECLARE @sql VARCHAR(1000) = 
       'EXEC (''EXEC [YourDatabase].[dbo].[sp_SomeSP] 
       ''''Parameter1'''', ''''Parameter2'''''') AT [YourLinkedServer]';
    PRINT @sql
    EXEC (@sql); 

END TRY
BEGIN CATCH
    SELECT ERROR_NUMBER(), ERROR_MESSAGE();
END CATCH;

См. этот ответ , похоже, причиной является ошибка времени компиляции.

...