Pregunta

No puedo encontrar la manera de recuperar SCOPE_IDENTITY () de 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

Intentar generar la 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 una 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
¿Fue útil?

Solución

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 consulta.

Otros consejos

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

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

Puede intentar probar para asegurarse de que la función SCOPE_IDENTITY () funciona como se esperaba: agregue SELECT @RecordNumber al final de la sproc y ejecútela 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 prueba para asegurarse de que el parámetro OUTPUT funcione como debería.

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

El problema es que no está devolviendo la identidad como un conjunto de registros, sino como parámetros de OUT. Esto significa que la forma en que intenta leerlo es incorrecta.

Pruebe la sugerencia de Joel u obténgala 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 ejecute la consulta y verifique el valor del último parámetro. En .NET eso 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é fregando un poco la entrada ya que su método de consulta es muy propenso a los ataques de inyección SQL.

Rob.

Estoy de acuerdo con Robert. Si va a utilizar un parámetro de salida en su procedimiento almacenado y llamarlo con SQL dinámico, en su acumulación, tendría que asignar una variable 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:

sSQL = "DECLARE @RecNo int; EXEC [sp_NewClaim] 'param1', 'param2', etc..... @RecNo OUTPUT; SELECT @RecNo;"
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top