web-dev-qa-db-ja.com

ストアドプロシージャの実行時に関数をパラメーターとして使用していますか?

私はストアドプロシージャをテストしていますが、パラメーターの代わりに 'GETDATE()'関数を送信したかったのです。

DECLARE @return_value int

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

SELECT  'Return Value' = @return_value
GO

SQL Server 2005では、次のエラーが表示されます。

')'付近の構文が正しくありません。

誰かが問題に光を当てたいですか?

28
krul

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()として設定し、その変数を使用する必要がありました。

HTH

14
Raja

関数をストアドプロシージャのパラメーターとして直接使用することはできません。

次のことができます。

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
27
Oded

パラメータとしての関数呼び出しは許可されません(接頭辞@@-以前はグローバル変数と呼ばれていたもの)

変数に割り当てる必要があります。

マイクロソフトは、この関連するConnect項目でこれがそれほど優れていないことを認めています: T-SQL:スカラー関数をストアドプロシージャパラメーターとして使用する

同意した!より一般的には、TSQLがたとえば整数値を期待する場合は常に、リテラル、変数、または戻り値の型が整数である関数の結果を受け入れる必要があります。言語をより規則的(「直交」)にし、学習/使用しやすくするだけです。

とは言っても、Katmaiリリースのこの機能には手遅れですが、TODOリストに追加します。

10
Martin Smith

使用できます

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
1
user748261

試してください:

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