Наиболее приемлемый вариант, за исключением использования динамического SQL, заключается в использовании оператора IF и двух запросов:
IF LEN(@Title) > 0
SELECT r.*
FROM RECORDS r
WHERE r.title LIKE '%'+ @Title +'%'
ELSE
SELECT r.*
FROM RECORDS r
Версия динамического SQL SQL Server 2005+ будет выглядеть следующим образом:
DECLARE @SQL NVARCHAR(4000)
SET @SQL = 'SELECT r.*
FROM RECORDS r
WHERE 1 = 1' --will be optimized out, easier to add clauses
SET @SQL = @SQL + CASE LEN(@Title)
WHEN 0 THEN ''
ELSE ' AND r.name LIKE ''%''+ @Title +''%'' '
END
BEGIN
EXEC sp_executesql @SQL, N'@Title VARCHAR(#)', @Title
END
В отличие от EXEC
, sp_executesql
будет кэшировать план запроса. Вы можете прочитать больше об этом в Благословение и проклятие динамического SQL .