Пока связанный сервер закрыт, exec хранимая процедура получит ошибку - PullRequest
1 голос
/ 24 марта 2009

У меня есть хранимая процедура для выбора данных между многими различными серверами SQL, и все серверы SQL установили сервер ссылок на сервер SQL, на котором встроена хранимая процедура.

Вот моя процедура:

Create Proc dbo.spGetData
@code as char(4)
AS
if (@code='aaaa')
  Select date From [ServerA].Stock.dbo.Syspara
else if (@code='bbbb')
  Select date From [ServerB].Stock.dbo.Syspara
else if (@code='cccc')
  Select date From [ServerC].Stock.dbo.Syspara
else if (@code='dddd')
  Select date From [ServerD].Stock.dbo.Syspara
GO

Если [ServerB] не активен или закрыт, когда я звоню:

exec dbo.spGetData 'dddd'

Произойдет ошибка, но если все 4 сервера активны, запрос вернется без ошибок.

Как мне избежать этой проблемы?

Ответы [ 2 ]

1 голос
/ 24 марта 2009

Если, как и я, вам все еще нужно использовать SQL Server 2000, вы не можете использовать блоки try catch.

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

1 голос
/ 24 марта 2009

Добавить TRY..CATCH Обработка ошибок:

В следующем примере показано, как ошибка разрешения имени объекта, сгенерированная инструкцией SELECT, не перехватывается конструкцией TRY… CATCH, но перехватывается блоком CATCH, когда тот же оператор SELECT выполняется внутри хранимой процедуры.

BEGIN TRY
    -- Table does not exist; object name resolution
    -- error not caught.
    SELECT * FROM NonexistentTable;
END TRY
BEGIN CATCH
    SELECT 
        ERROR_NUMBER() as ErrorNumber,
        ERROR_MESSAGE() as ErrorMessage;
END CATCH

Ошибка не обнаружена, и управление переходит из конструкции TRY… CATCH на следующий более высокий уровень.

Выполнение инструкции SELECT внутри хранимой процедуры приведет к возникновению ошибки на уровне ниже, чем блок TRY. Ошибка будет обработана конструкцией TRY… CATCH.

-- Verify that the stored procedure does not exist.
IF OBJECT_ID ( N'usp_ExampleProc', N'P' ) IS NOT NULL 
    DROP PROCEDURE usp_ExampleProc;
GO

-- Create a stored procedure that will cause an 
-- object resolution error.
CREATE PROCEDURE usp_ExampleProc
AS
    SELECT * FROM NonexistentTable;
GO

BEGIN TRY
    EXECUTE usp_ExampleProc
END TRY
BEGIN CATCH
    SELECT 
        ERROR_NUMBER() as ErrorNumber,
        ERROR_MESSAGE() as ErrorMessage;
END CATCH;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...