Подтвердить что ты не робот

Использование функции в качестве параметра при выполнении хранимой процедуры?

Я тестирую хранимую процедуру и хотел передать функцию 'GETDATE()' вместо параметра:

DECLARE @return_value int

EXEC @return_value = my_stored_procedure
        @MyId = 1,
        @MyDateField = GETDATE()

SELECT  'Return Value' = @return_value
GO

SQL Server 2005 жалуется со следующей ошибкой:

Неверный синтаксис рядом с ')'.

Кто-нибудь хочет пролить свет на этот вопрос?

4b9b3361

Ответ 1

для MSDN

Execute a stored procedure or function
[ { EXEC | EXECUTE } ]
    { 
      [ @return_status = ]
      { module_name [ ;number ] | @module_name_var } 
        [ [ @parameter = ] { value 
                           | @variable [ OUTPUT ] 
                           | [ DEFAULT ] 
                           }
        ]
      [ ,...n ]
      [ WITH RECOMPILE ]
    }
[;]

    Execute a character string
    { EXEC | EXECUTE } 
        ( { @string_variable | [ N ]'tsql_string' } [ + ...n ] )
        [ AS { LOGIN | USER } = ' name ' ]
    [;]

    Execute a pass-through command against a linked server
    { EXEC | EXECUTE }
        ( { @string_variable | [ N ] 'command_string [ ? ]' } [ + ...n ]
            [ { , { value | @variable [ OUTPUT ] } } [ ...n ] ]
        ) 
        [ AS { LOGIN | USER } = ' name ' ]
        [ AT linked_server_name ]
    [;]

Примечание для @parameter вы можете указать значение или переменную или указать значение по умолчанию. Поэтому вам нужно установить значение переменной как GetDate() (как указывали другие) и использовать эту переменную.

НТН

Ответ 2

Вы не можете использовать функцию напрямую в качестве параметра хранимой процедуры.

Вы можете сделать следующее:

DECLARE @now DateTime
SET @now = GETDATE()

DECLARE @return_value int
EXEC @return_value = my_stored_procedure
        @MyId = 1,
        @MyDateField = @now
SELECT  'Return Value' = @return_value
GO

Ответ 3

Вызов функций как параметров не разрешен (за исключением тех системных функций, которые были префиксными @@ - то есть те, которые раньше назывались глобальными переменными)

Вам нужно назначить переменную.

Microsoft признает, что в этом связанном элементе Connect менее велика: T-SQL: использовать скалярные функции в качестве параметров хранимых процедур

Согласовано! В более общем плане, везде, где TSQL ожидает, скажем, и целочисленного значения, это должен принимать литерал, переменную, или результат функции, чья Тип возврата - целое число. Это просто делает язык более регулярный ( "ортогональный" ) и легче учиться/использования.

Тем не менее, это слишком поздно для этого в выпуске Katmai, но Я добавлю его в наш список TODO.

Ответ 4

Вы можете использовать

DECLARE @test DATE;
SET @test = GETDATE();

а затем

DECLARE @return_value int
EXEC @return_value = my_store procedure
        @MyId = 1,
        @MyDateField = @test
SELECT  'Return Value' = @return_value
GO

Ответ 5

Попробуйте:

DECLARE @return_value int
EXEC @return_value = my_store procedure
        @MyId = 1,
        @MyDateField = (SELECT GETDATE())
SELECT  'Return Value' = @return_value
GO

Ответ 6

Зачем вам нужно пройти в GetDate(). Просто используйте его в вызываемой хранимой процедуре.

Вы не можете передать его напрямую. Просто назначьте его переменной и передайте, что

DECLARE @dt as datetime
SET @dt=GETDATE()

EXEC @return_value = my_store procedure
        @MyId = 1,
        @MyDateField = dt