Ответ в том, что вы не можете передать функцию в качестве аргумента параметру хранимой процедуры.
Если вы просто хотите использовать текущую дату / время, когда не хотите передавать значения, почему бы не сделать эти параметры необязательными, указав значение по умолчанию внутри процедуры? Это избавит вас от необходимости набирать его, объявлять локальные переменные и, что еще важнее, передавать эти бесполезные токены из клиентских приложений.
Вам также следует избегать неоднозначных форматов дат, таких как m / d / y и d / m / y. Если бы сейчас был не март, я бы не знал, имели ли вы в виду 6 марта или 3 июня. И когда вы выполняете свой код где-то с другими региональными или языковыми настройками, SQL Server может также ошибиться. Однозначно сформулируйте это в четком формате (например, YYYYMMDD
), не затрагивающем проблемы языка, региона или восприятия человека.
В любом случае, вот процедура с необязательными параметрами:
ALTER PROCEDURE dbo.sp_GetAllBillsForDate -- sp_ is a horrible prefix, by the way *
@date1 DATETIME = GETDATE(),
@date2 DATETIME = GETDATE()
AS
BEGIN
SET NOCOUNT ON;
...
END
GO
Теперь код для жестко запрограммированной даты:
EXEC dbo.sp_GetAllBillsForDate @date1 = '20120306', @date2 = '20120306';
И чтобы получить сегодня:
EXEC dbo.sp_GetAllBillsForDate;
(Также неплохо было бы явно назвать ваши параметры. Тогда вам не нужно беспокоиться об изменении порядка параметров. А также всегда используйте префикс схемы при ссылке или создании всех объектов.)