0

私はこの非常に単純なSPをSQL2008で作成しました。

Create procedure dbo.GetNextID 
(
    @TableName nvarchar(50),
    @FieldName nvarchar(50)
)
AS
    BEGIN
        exec('select isnull(max('+@FieldName+'),0)+1 as NewGeneratedID from '+ @TableName);
    END

このプロシージャをで実行しVisual Studio SQL Express、テーブル名とフィールド名を渡すと、正常に機能します。しかし、このSPをクエリとしてに追加しようとするとQueryTableAdapter、ボタンADO DataSetをクリックする前に次のエラーが発生します。Finish

max関数には1つの引数が必要です

誰かがこれで私を助けることができますか?

4

1 に答える 1

1

VSはSPを実行してフィールドリストを決定しようとしていると思います。ただし、SP に何を渡せばよいかわからないため、空のパラメーターを使用します。もちろん、select ステートメントは失敗します。

SP に以下を追加してみてください。

IF ISNULL(@TableName,'') = '' SET @TableName = '<Name of a test table>';
IF ISNULL(@FieldName,'') = '' SET @FieldName = '<Name of some field>';

ここに存在するいくつかのフィールドとテーブルの名前を使用します (たとえば、アプリケーションからも使用する名前)。

または、 の上に次を追加することもできますexec

IF (ISNULL(@TableName, '') = '') OR (ISNULL(@FieldName, '') = '')
BEGIN
    SELECT -1 AS NewGeneratedId
    RETURN 0
END

編集
補足として、コードの動作から発生する同時実行の問題について警告したいと思います。このコードがテーブル内の新しいレコードの一意の ID を返すことになっている場合、次のように再設計します。

NumberSeries各行に一意の名前、ID の可能な範囲、および現在の ID 値が含まれるテーブルを作成します。

UPDATE ... OUTPUT一連の番号の現在の ID を更新し、それを 1 つのステップで取得するために使用するストアド プロシージャを作成します。

こうすることで、新しい ID の作成が同時実行の問題を引き起こさない単一の操作であることを確認できます。

于 2010-12-14T08:00:24.447 に答える