web-dev-qa-db-ja.com

SQL Serverストアドプロシージャのパラメーター

私は動的に作成されたパラメーターでストアドプロシージャを呼び出しているフレームワークを開発しています。実行時にパラメーターコレクションを構築しています。

この問題は、ストアドプロシージャにパラメータを渡すときに発生しますが、ストアドプロシージャはそのようなパラメータを受け入れません。

たとえば、私のストアドプロシージャは次のとおりです。

CREATE PROCEDURE GetTaskEvents
    @TaskName varchar(50)
AS
BEGIN
-- SP Logic
END

ストアドプロシージャの呼び出し:

EXEC GetTaskEvents @TaskName = 'TESTTASK', @ID = 2

これはエラーの下にスローされます:

Msg 8144, Level 16, State 2, Procedure GetTaskEvents, Line 0
Procedure or function GetTaskEvents has too many arguments specified.

これは、追加パラメーターを単に無視するSybase ASEで正常に機能します。これはMSSQLサーバー2008で実現できますか?任意の助け、大歓迎。ありがとう

28
Narayan Akhade

パラメータを使用しないストアドプロシージャにパラメータを渡すのはなぜですか?

動的SQLステートメントを作成して実行する方が良いかもしれません。 SPでやろうとしていることは機能せず、さまざまな数のパラメーターに対応するためにそのような方法で変更できる場合でも、動的に生成されたSQLを使用することになります。そもそもSPを持っている/使用する目的を破っているのです。 SPには役割がありますが、すべての場合に解決策があるわけではありません。

7
E.J. Brennan

SQL Serverでは、定義していないプロシージャにパラメーターを渡すことはできません。この種の設計に最も近い方法は、次のようなオプションパラメータを使用することです。

CREATE PROCEDURE GetTaskEvents
    @TaskName varchar(50),
    @ID int = NULL
AS
BEGIN
-- SP Logic
END;

定義に使用する可能性のあるすべてのパラメーターを含める必要があります。その後、どちらの方法でもプロシージャを自由に呼び出すことができます。

EXEC GetTaskEvents @TaskName = 'TESTTASK', @ID = 2;
EXEC GetTaskEvents @TaskName = 'TESTTASK'; -- @ID gets NULL here
39
Yuck

ここでは少し仮定をしますが、プロシージャ内のロジックはタスクを介して分割されると仮定しています。そして、パラメータのダイナミクスのために提案された @ Yuck として、null許容パラメータを持つことはできませんか?

だから私の仮定で行く

TaskName = "Path1" Then Somethingの場合

TaskName = "Path2" If Then Something Else

私の最初の考えは、あなたが作成する必要があるビジネスロジックを持つ個別の機能があり、5〜10の異なるシナリオがあると判断できる場合、1つの巨大なソリューションをすべて試すのではなく、必要に応じて個々のストアドプロシージャを書くことですアプローチ。メンテナンスが少し面倒になるかもしれません。

しかし、もしあなたが...

@ EJ Brennan で示唆されているように、動的SQLを試してみてはいかがですか(許してください、しばらくの間SQLに触れていないので、構文が錆びている可能性があります)最善のアプローチですが、これはおそらくあなたのニーズを満たすことができますか?

CREATE PROCEDURE GetTaskEvents
    @TaskName varchar(50)
    @Values varchar(200)
AS
BEGIN
  DECLARE @SQL VARCHAR(MAX)

  IF @TaskName = 'Something'
  BEGIN
    @SQL = 'INSERT INTO.....' + CHAR(13)
    @SQL += @Values + CHAR(13) 
  END

  IF @TaskName = 'Something Else'
  BEGIN
    @SQL = 'DELETE SOMETHING WHERE' + CHAR(13)
    @SQL += @Values + CHAR(13) 
  END

  PRINT(@SQL)
  EXEC(@SQL)    
END

(CHAR(13)は新しい行を追加します。どこかで拾った古いhabbitを使用して、SQLプロファイラの実行時に動的プロシージャのデバッグ/読み取りを支援します。)

3
Rohan Büchner
CREATE PROCEDURE GetTaskEvents
@TaskName varchar(50),
@Id INT
AS
BEGIN
-- SP Logic
END

プロシージャ呼び出し

DECLARE @return_value nvarchar(50)

EXEC  @return_value = GetTaskEvents
        @TaskName = 'TaskName',
        @Id =2  

SELECT  'Return Value' = @return_value
2
Ad Kahn

間違ったパラメーターの組み合わせを解析しています。ここでは、@TaskName =の代わりに@ID@TaskName =を渡します。SPに必要なパラメーターは1つだけです。

0
CodeMind