29

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

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

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

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 で実現できますか? どんな助けでも大歓迎です。ありがとう

4

5 に答える 5

42

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
于 2013-03-03T22:24:53.660 に答える
7

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

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

于 2013-03-03T22:18:08.913 に答える
3

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

だから私の仮定で行く

If TaskName = "Path1" Then 何か

TaskName = "Path2" の場合、他の何か

私の最初の考えは、作成する必要があるビジネスロジックを備えた個別の機能があり、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) は新しい行を追加します..どこかで拾った古い習慣で、SQL プロファイラーの実行時に動的プロシージャーのデバッグ/読み取りを支援するために使用されます。)

于 2013-03-03T22:33:27.777 に答える
0

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

于 2016-07-27T08:18:12.543 に答える