ultimo scope_identity obtener insertado ident_current ejemplo sql asp-classic identity

obtener - ASP clásico obteniendo valor SCOPE_IDENTITY() de SQL2005



select @@identity sql server (5)

No puedo encontrar la forma de recuperar SCOPE_IDENTITY () a mis variables desde un Procedimiento de almacenamiento SQL2005.

Mi cadena 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()"

Mi salida 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()

Ejecutando mi comando SQL:

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

Intentando generar SCOPE_IDENTITY () Produce una variable vacía (sin salida):

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

El procedimiento de almacenamiento se ejecuta correctamente. Mi información se almacena en mi base de datos sin problemas. RecordNumber es la columna con la identidad, y el procedimiento de almacenamiento ha definido @RecordNumber como salida:

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


Asp classic no es mi punto fuerte, pero las ideas son las mismas.

El problema es que no devuelve la identidad como un conjunto de registros, sino como un Parámetros OUT. Esto significa que la forma en que intentas leerla es incorrecta.

Pruebe la sugerencia de Joel u obténgalo a través del código de retorno:

Return Scope_Identity()

Alternativamente, debe construir su consulta utilizando parámetros y especificar la última como su parámetro de salida. Luego ejecuta la consulta y verifica el valor del último parámetro. En .NET que sería (convertir a VB según sea necesario):

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);

Espero que estés restregando la entrada ya que el método de consulta es muy propenso a los ataques de inyección SQL.

Robar.


Estoy de acuerdo con Robert. Si va a usar un parámetro de salida en su procedimiento almacenado y lo llama con SQL dinámico, en su creación, tendrá que asignar una variable de SQL al parámetro de salida y luego seleccionar esa variable. También debe usar la palabra clave OUTPUT al asignar la variable SQL, como por ejemplo:

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


Estoy de acuerdo con la respuesta de Joel Coehoorn, pero quería señalar que está enviando su variable SCOPE_IDENTITY () de vuelta como un parámetro de salida, pero no la recupera de esa manera en su llamada de ado. No puede recuperar un parámetro de salida utilizando el método para llamar al procedimiento almacenado.

Si tiene curiosidad, hay algunos ejemplos de ado aquí para llamar a los procedimientos almacenados.


Para su procedimiento almacenado, haga esto:

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

Y luego obtenga la identificación de la misma manera que recuperaría cualquier otro resultado de la consulta.


Puede intentar probar para asegurarse de que la función SCOPE_IDENTITY() funciona como se esperaba: agregue SELECT @RecordNumber al final de sproc y ejecútelo manualmente en Management Studio para confirmar que la variable se está configurando de la manera esperada. Si eso no funciona, intente SELECT SCOPE_IDENTITY() para confirmar que está funcionando. Finalmente, codifique el valor de la variable como una prueba para asegurarse de que el parámetro OUTPUT funcione como debería.