Другим подходом может быть динамический SQL. Если наш пример слишком упрощен, то использование логики OR
(как в ответах Тима) может привести к плану с кэшированным запросом, который не подходит для выполняемого запроса. Это действительно так, поскольку @type = 1
возвращает все строки, а когда оно имеет значение 3
, оно фильтруется в одно значение. Это означает, что оценки для 1
и 3
будут очень разными.
Это дает вам что-то вроде этого:
DECLARE @type int;
SET @type = 3;
DECLARE @SQL nvarchar(MAX);
SET @SQL = N'SELECT * FROM t' +
CASE @type WHEN 1 THEN N';'
WHEN 2 THEN N' WHERE theType = 2 or theType = 3;'
WHEN 3 THEN N' WHERE theType = 3'
END;
EXEC sp_executesql @SQL;
Это не означает, что ответ Тима неправильный, но вы можете получить плохую производительность при определенных значениях.