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 是具有标识的列,存储过程已将 @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 调用中以这种方式检索它。您无法使用调用存储过程的方法检索输出参数。

如果您好奇,这里有一些 ado 示例调用存储过程。

于 2008-11-20T04:40:15.013 回答
0

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

于 2008-11-20T04:05:07.063 回答
0

Asp classic 不是我的强项,但思路是一样的。

问题是您没有将身份作为记录集返回,而是作为 OUT 参数返回。这意味着您尝试阅读它的方式不正确。

试试 Joel 的建议,或者通过返回码得到它:

Return Scope_Identity()

或者,您应该使用参数构建查询并将最后一个指定为您的输出参数。然后执行查询并检查最后一个参数的值。在 .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 回答
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 回答