Когда вы используете константу, значение известно оптимизатору, поэтому может определять селективность (и возможное использование индекса) на основе этого. Когда вы используете переменную, значение неизвестно оптимизатору.
похоже вариантов решения немного...Личный опыт: при освоении MS SQL, обратил внимание, что промежуточный слой ADO, иногда меняет в реальном запросе константы на переменные и наоборот. При использовании хранимых процедур план запроса строится и кэшируется при её создании. Это одна из причин оборачивать в процедуру запрос даже без дополнительных обработок.
запрос начнет отрабатывать без старых кэшированных данных
SELECT MONTH(purchase_date) AS mont, SUM(price) AS goods_sum
FROM goods
GROUP BY MONTH(purchase_date)
SELECT YEAR(purchase_date) AS goods_year,
MONTH(purchase_date) AS goods_month,
SUM(price) AS goods_sum
FROM goods
GROUP BY YEAR(purchase_date), MONTH(purchase_date)
ORDER BY 1, 2
SELECT * FROM (
SELECT contr, [time], SUM(val) OVER ( ORDER BY [time] ) AS sumcash
FROM something ) AS cash
WHERE sumcash <= max_cash