2

SQL2005 ストア プロシージャから SCOPE_IDENTITY() を変数に戻す方法がわかりません。

私のsSQL文字列:

sSQL = "EXEC [sp_NewClaim] " & Chr(34) & ClaimNumber & Chr(34) & ", " & Request.Cookies("UserID") & ", " & Request.Cookies("MasterID") & ", " & Chr(34) & strRestaurante & Chr(34) & ", " & Chr(34) &  Fecha & Chr(34) & ", " & Chr(34) & Hora & Chr(34) & ", " & Chr(34) & Request("Tiempo") & Chr(34) & ", " & Chr(34) & Request("Luz") & Chr(34) & ", " & Chr(34) & Request("Desc") & Chr(34) & ", " & Chr(34) & Request("incidente") & Chr(34) & ", " & Chr(34) & Request("codigos") & Chr(34) & ", False, 0; SELECT RecordNumber = SCOPE_IDENTITY()"

私のsSQL出力:

EXEC [sp_NewClaim] "W200811", 7, 8, "Otro -- WORK PLEASE", "11/19/2008", "01:19 PM", "Nublado", "Mala", "asdasd", "uyiuyui", "C-Junta", False, 0; SELECT RecordNumber = SCOPE_IDENTITY()

SQL コマンドの実行:

Set rsData= Server.CreateObject("ADODB.Recordset")
rsData.Open sSQL, conDB, adOpenKeyset, adLockOptimistic

SCOPE_IDENTITY() を出力しようとすると、空の変数が生成されます (出力なし):

Response.Write("<br />Record Number: " & rsData("RecordNumber"))

ストア プロシージャは正しく実行されます。私の情報は問題なく私のデータベースに保存されます。RecordNumber は ID を持つ列であり、ストア プロシージャは @RecordNumber を出力として定義しています。

USE [db_clcinsurance_com]
GO

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE sp_NewClaim
 (
    @ClaimNumber nvarchar(50),
    @blah............
    .................
    @RecordNumber INT OUTPUT
    )
AS

BEGIN

    INSERT INTO Accidente (ClaimNumber,........., RecordNumber)

    VALUES (@ClaimNumber,....., @RecordNumber)

    SET @RecordNumber = SCOPE_IDENTITY();

END
4

5 に答える 5

5

ストアド プロシージャの場合は、次のようにします。

CREATE PROCEDURE sp_NewClaim
 (
    @ClaimNumber nvarchar(50),
    @blah............
    .................
)
AS
BEGIN
    SET NOCOUNT ON;

    INSERT INTO Accidente (ClaimNumber,........., RecordNumber)
        VALUES (@ClaimNumber,....., @RecordNumber)

    SELECT SCOPE_IDENTITY()
END

そして、他のクエリ結果を取得するのと同じ方法で ID を取得します。

于 2008-11-20T04:01:22.003 に答える
2

Joel Coehoorn の回答に同意しますが、SCOPE_IDENTITY() 変数を出力パラメーターとして送り返しているが、ado 呼び出しでそのように取得していないことに注意したいと思います。ストアド プロシージャを呼び出すメソッドを使用して出力パラメータを取得することはできません。

興味がある場合は、ストアド プロシージャを呼び出すためのいくつかのサンプルがここにあります。

于 2008-11-20T04:40:15.013 に答える
0

私はロバートに同意します。ストアドプロシージャで出力パラメータを使用し、それを動的SQLで呼び出す場合は、ビルドアップでSQL変数を出力パラメータに割り当ててから、その変数を選択する必要があります。次のようなSQL変数を割り当てるときは、OUTPUTキーワードも使用する必要があります。

sSQL = "DECLARE @RecNo int; EXEC [sp_NewClaim] 'param1', 'param2', etc..... @RecNo OUTPUT; SELECT @RecNo;"
于 2008-11-20T05:14:42.417 に答える
0

関数が期待どおりに機能していることを確認するためにテストを試みることができます。sproc の最後にSCOPE_IDENTITY()追加SELECT @RecordNumberし、Management Studio で手動で実行して、変数が期待どおりに設定されていることを確認します。それが機能しない場合は、それがまったく機能しSELECT SCOPE_IDENTITY()ていることを確認してください。最後に、テストとして変数値をハードコーディングして、OUTPUT パラメータが正常に機能していることを確認します。

于 2008-11-20T04:05:07.063 に答える
0

ASP クラシックは私の得意分野ではありませんが、考え方は同じです。

問題は、ID を OUT パラメータとしてではなく、レコード セットとして返していないことです。これは、あなたがそれを読もうとしている方法が間違っていることを意味します。

Joel の提案を試すか、リターン コードを介して取得します。

Return Scope_Identity()

または、パラメーターを使用してクエリを作成し、最後のパラメーターを out パラメーターとして指定する必要があります。次に、クエリを実行し、最後のパラメーターの値を確認します。.NET では (必要に応じて VB に変換します):

SqlCommand cmd = new SqlCommand("INSERT INTO Foo (Description) VALUES (@Description); SET @Result = SCOPE_IDENTITY()");
SqlParameter paramDesc = new SqlParameter("@Description", SqlDbType.Int);
cmd.Parameters.Add(paramDesc);
SqlParameter paramResult = new SqlParameter("@Result", SqlDbType.Int);
paramResult.Direction = ParameterDirection.Output;
cmd.Parameters.Add(paramResult);

クエリの方法は SQL インジェクション攻撃を受けやすいため、入力のスクラブを行っていることを願っています。

ロブ。

于 2008-11-20T04:17:30.207 に答える