Основываясь на том, что написал Гордон, вы можете добиться оптимальной производительности с помощью динамического SQL. Начиная с этого образца данных:
SET NOCOUNT ON;
USE tempdb;
GO
IF OBJECT_ID('dbo.items','U') IS NOT NULL DROP TABLE dbo.items;
GO
SELECT col1 = CAST(NEWID() AS VARCHAR(100)),
DueDate = ISNULL(DATEADD(DAY,t.c*2,d.dt),d.dt)
INTO dbo.items
FROM (VALUES(0),(0),(1),(2),(3),(4)) AS t(c)
CROSS JOIN (VALUES(CAST(GETDATE() AS DATE))) AS d(dt);
GO
CREATE CLUSTERED INDEX cl_nu__dbo_items__DueDate ON dbo.items(DueDate);
GO
Решение:
DECLARE @dueTypeCode VARCHAR(100) = 'TODAY' --'NEXT5DAYS --'ALL';
DECLARE @sql NVARCHAR(4000) =
N'SELECT i.*
FROM dbo.Items i'+CHAR(10);
SELECT @sql +=
CASE @dueTypeCode
WHEN 'TODAY' THEN 'WHERE DueDate = CAST(getdate() AS date);'
WHEN 'NEXT5DAYS' THEN 'WHERE DueDate >= CAST(getdate() AS date) AND DueDate <= DATEADD(DAY,5,CAST(getdate() AS date))'
ELSE ''
END;
EXEC sp_executesql @statement = @sql;
Очевидно, что бизнес-логика должна быть обновлена в соответствии с вашими потребностями (например, обратите внимание на мое ленивое использование ELSE ''
, которое обрабатывает «ВСЕ», а также все остальное, это нужно будет изменить). Тем не менее, вот план выполнения при выборе «СЕГОДНЯ» или «NEXT5DAYS». Поиск индекса в этой ситуации - в основном лучшее, на что вы можете надеяться.