经典ASP从SQL 2005获取SCOPE_IDENTITY()值

时间:2008-11-20 03:52:11

标签: sql asp-classic identity

我无法弄清楚如何从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是具有标识的列,而存储过程将@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

5 个答案:

答案 0 :(得分: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。

答案 1 :(得分:2)

我同意Joel Coehoorn的回复,但我想注意您将SCOPE_IDENTITY()变量作为输出参数发回,但不会在ado调用中以这种方式检索它。您无法使用要调用存储过程的方法检索输出参数。

如果您感到好奇,可以使用一些ado示例here来调用存储过程。

答案 2 :(得分:0)

您可以尝试进行测试以确保SCOPE_IDENTITY()函数按预期工作 - 将SELECT @RecordNumber添加到sproc的末尾并在Management Studio中手动运行以确认变量已设置为你期待的方式。如果这不起作用,请尝试SELECT SCOPE_IDENTITY()确认它是否正常工作。最后,将变量值硬编码为测试,以确保OUTPUT参数正常工作。

答案 3 :(得分:0)

Asp classic不是我的强项,但这些想法是一样的。

问题是您没有将身份作为记录集返回,而是作为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注入攻击。

罗布。

答案 4 :(得分:0)

我同意罗伯特的观点。如果要在存储过程中使用输出参数并使用动态SQL调用它,则在构建中,必须将SQL变量分配给输出参数,然后选择该变量。分配SQL变量时,还必须使用OUTPUT关键字,例如:

sSQL = "DECLARE @RecNo int; EXEC [sp_NewClaim] 'param1', 'param2', etc..... @RecNo OUTPUT; SELECT @RecNo;"