Переместите закрывающую скобку на перед =, как показано ниже:
WHERE (CASE WHEN @ContractNo = 0 THEN @ContractNo ELSE @ContractNo END)=tblContracts.ContractNo
Я не вижу, что будет делать этот оператор case, хотя ... вы возвращаете то же самое в случае @ContractNo = 0 или, если это не так ...
Правильный синтаксис:
Select...
...
Where(
Case
When <Condition>
Then <Return if true>
Else <Return if false>
End
) = <Whatever is being matched to the output of the case statement>
Независимо от синтаксиса, ваш пример не имеет большого смысла, если вы ищете все элементы, которые соответствуют или имеют номер контракта 0, вы должны сделать:
Select...
...
Where (
@ContractNo = 0 Or
@ContractNo = tblContracts.ContractNo
)
Что, кажется, имеет гораздо больший смысл, чем то, для чего вы пытаетесь использовать оператор case.
Редактировать: Должно быть, я немного неправильно прочитал вопрос - отсутствующий параметр обычно означает, что параметр (в данном случае @ContractNo) не объявлен в объеме вашего запроса / процедуры. Но кто-то уже указывал на это, так что я не могу взять на себя ответственность за это.