Проблема с заявлением exec - PullRequest
0 голосов
/ 06 марта 2012

Когда я пытаюсь выполнить следующее утверждение из Management Studio, оно успешно выполняется -

exec [sp_GetAllBillsForDate] '03/06/2012','03/06/2012'

enter image description here

Но когда я изменяю его на

exec [sp_GetAllBillsForDate] getdate(), getdate()

enter image description here

выдает ошибку

Incorrect syntax near ')'.

что с этим не так?

Спасибо, что поделились своим временем.

Ответы [ 2 ]

2 голосов
/ 06 марта 2012

Ответ в том, что вы не можете передать функцию в качестве аргумента параметру хранимой процедуры.

Если вы просто хотите использовать текущую дату / время, когда не хотите передавать значения, почему бы не сделать эти параметры необязательными, указав значение по умолчанию внутри процедуры? Это избавит вас от необходимости набирать его, объявлять локальные переменные и, что еще важнее, передавать эти бесполезные токены из клиентских приложений.

Вам также следует избегать неоднозначных форматов дат, таких как 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;

(Также неплохо было бы явно назвать ваши параметры. Тогда вам не нужно беспокоиться об изменении порядка параметров. А также всегда используйте префикс схемы при ссылке или создании всех объектов.)

1 голос
/ 06 марта 2012

Попробуй пройти через переменную ..

DECLARE @date1 DATETIME
       ,@date2 DATETIME

SELECT @date1 = GETDATE()
      ,@date2 = GETDATE()

EXEC [sp_GetAllBillsForDate] @date1, @date2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...