Пара жизнеспособных вариантов:
Вы можете установить @FromDate
и @ToDate
равными очень ранней или очень поздней дате, соответственно они равны NULL.
Вы можете использовать sp_executesql и создать динамическую строку запроса с параметрами по мере необходимости, например,
DECLARE @Sql NVARCHAR(MAX) = 'SELECT * FROM CallList C WHERE 1 = 1 '
IF @FromDate IS NOT NULL
BEGIN
SET @Sql += ' AND C.CallDate > @xFromDate'
END
IF @ToDate IS NOT NULL
BEGIN
SET @Sql += ' AND C.CallDate < @xToDate'
END
EXEC sp_executesql @Sql, N'@xFromDate DATETIME, @xToDate DATETIME', @xFromDate = @FromDate, @xToDate = @ToDate
Этот последний подход работает лучше, чем использование OR повсеместно, поскольку запросы, которые включают OR, неизменно заканчиваются очень плохой оптимизацией - они могут хорошо работать для определенного набора параметров, но обычно не являются универсальными .