Это будет делать то, что вы хотите:
SELECT *
FROM MyTable
WHERE COALESCE(IsAlive, 0) = COALESCE(@IsAlive, COALESCE(IsAlive, 0))
На основе значения @IsAlive:
- Если NULL, то вернет все (потому что условие всегда верно)
- Если 1, то вернет эти строки с IsAlive = 1
- Если 0, то эти строки будут возвращены с IsAlive = 0 или NULL
COALESCE - это функция, которая возвращает свой первый аргумент, если он не равен NULL, и в этом случае он возвращает второй аргумент.
Таким образом, LHS возвращает 0, если IsAlive равен NULL, или 0 и 1, если IsAlive равен 1.
RHS возвращает то же самое, когда аргумент хранимой процедуры @IsAlive равен NULL, а в противном случае просто возвращает аргумент @IsAlive.
EDIT:
Предполагается, что @IsAlive является BIT. В случае с tinyint вы можете добавить оператор case:
SELECT *
FROM MyTable
WHERE COALESCE(IsAlive, 0) = CASE @IsAlive
WHEN 0 THEN 0
WHEN 1 THEN 1
ELSE COALESCE(IsAlive, 0)
END