Код блока SQL IF вызывает ошибку, даже если он не должен выполняться

У меня есть случай, когда у меня есть код SQL с блоком IF-ELSE. Код в части IF не должен быть достигнут, но я все еще получаю сообщение об ошибке при выполнении SQL. В коде, который я сначала тестирую для связанного сервера, и когда это не удается, @reval устанавливается в 1, а блок ELSE должен выполняться и избегать кода в блоке IF, который должен запрашивать связанный сервер, но я получаю эту ошибку:

Msg -1, Level 16, State 1, Line 0 SQL Server Network Interfaces: Error Locating Server/Instance Specified [xFFFFFFFF].

Я запускаю запрос из SSMS 2012. Почему возникает эта ошибка?

declare @clientCode VARCHAR(7)
set @clientCode = '8001299'
declare @year INT
set @year = 2013

DECLARE @retVal INT        
-- test connectivity with linked database server
BEGIN TRY
       EXEC @retVal = sys.sp_testlinkedserver N'ATLAS'  
END TRY
BEGIN CATCH
       SET @retval = SIGN(@@ERROR)
END CATCH

IF @retval = 0 -- connection attempt successful 
BEGIN

--СЛЕДУЮЩАЯ ВСТАВКА SQL-оператора ВЫЗЫВАЕТ ОШИБКУ

        SET @contIndex = (SELECT ContIndex FROM ATLAS.Engine_sp.dbo.tblEngagement WHERE ClientCode = @clientCode)          
END
ELSE -- could not connect 
BEGIN
       -- execute code to pull from linked server 
END

person RoastBeast    schedule 24.01.2014    source источник
comment
90% размещенного кода неактуальны. Уменьшите его до минимума, необходимого для демонстрации проблемы. Прочтите о SSCCE   -  person Bohemian♦    schedule 24.01.2014
comment
@Bohemian - ты мог бы дать свой совет и не голосовать против.   -  person RoastBeast    schedule 24.01.2014
comment
Я проголосовал против, потому что не было предпринято никаких усилий для диагностики проблемы. По сути, вы вставили весь свой код и ошибку и попросили нас отладить ваш код. Этот сайт работает не так. Мой предыдущий совет остается в силе. Если вы будете следовать ему, вы, вероятно, решите проблему самостоятельно.   -  person Bohemian♦    schedule 24.01.2014
comment
@Bohemian - я знаю, как работает этот сайт, я не задаю вопросов без предварительного исследования, и мне не нужно, чтобы кто-то отлаживал мой код. Я просто хотел дать совет.   -  person RoastBeast    schedule 24.01.2014
comment
@Bohemian - Спасибо.   -  person RoastBeast    schedule 25.01.2014


Ответы (1)


Он по-прежнему будет анализировать и связывать все, прежде чем выполнять его. Здесь не получается связать.

Вы можете использовать sp_executesql для выполнения этой строки, и она должна проверяться только тогда, когда sp_executesql действительно вызывается.

person Rob Farley    schedule 24.01.2014
comment
спасибо, я этого не понял. Я изменил оскорбительный SQL на переменные VARCHAR, переданные процедуре sp_executesql, и теперь это работает. - person RoastBeast; 24.01.2014