我无法弄清楚如何从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
答案 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;"