none
Como retornar ID de registro que se inserta en una tabla desde un procedimiento almacenado ? RRS feed

  • Pregunta

  • Hola...

    Desarrollo una aplicacion C# donde invoco un procedimiento almacenado, siempre que ejecuto el SP

    (resultado = command.ExecuteNonQuery();)  me devuelve (-1) si todo sale bien ...pero ahora nesecito que el SP me devuelva el ID (IdProductorAbejasNativasVisitaGrupal) del registro que inserto en la tabla ProductorAbejasNAtivasVisitaGrupal (La sentencia INSERT que esta al final del procedimiento almacenado)

    como puedo hacer esto ?

    Mi SP

    USE [FloraNueva]
    GO
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    
    ALTER PROCEDURE [dbo].[Sp_ActualizarProductorAbejasNativasVisitaIndividual] 
           (
    	                @IdProductorAbejasNativasVisitaIndividual INT,
                            @Identificador UNIQUEIDENTIFIER,
    			@IdProductor INT,
    			@Fecha DateTime,
    			@ElMeliponicultorEstaPresente BIT,
    			@OtraPersonaPresente VARCHAR(500),
    			@Motivo VARCHAR(500),
    			@Observaciones VARCHAR(500), 
    			@Recomendaciones VARCHAR(500),
    			@Otros VARCHAR(500),
    			@Estado VARCHAR(50),
                            @Usuario VARCHAR(50),
                            @Dispositivo VARCHAR(50),
                            @FechaCreacion DATETIME,
                            @FechaCreacionUtc VARCHAR(50),
                            @FechaModificacion DATETIME,
                            @FechaModificacionUtc VARCHAR(50),
                            @Transaccion VARCHAR(50)
           )
    AS
    BEGIN
    
    DECLARE @TRANCOUNTER INT = 0;
    
    SET NOCOUNT ON;
    
    SET  TRANSACTION ISOLATION LEVEL SERIALIZABLE
    
       BEGIN TRAN [PRODUCTORTRACK]
    
       BEGIN TRY
    
                    IF (@IdProductor = 0)  BEGIN   SET @IdProductor = (SELECT IdProductor FROM Productor WHERE Identificador = @Identificador); END 
    				IF (LEN(@OtraPersonaPresente) = 0) BEGIN SET @OtraPersonaPresente = NULL; END
    				IF (LEN(@Motivo) = 0) BEGIN SET @Motivo = NULL; END
    				IF (LEN(@Observaciones) = 0) BEGIN SET @Observaciones = NULL; END
    				IF (LEN(@Recomendaciones) = 0) BEGIN SET @Recomendaciones = NULL; END
    				IF (LEN(@Otros) = 0) BEGIN SET @Otros = NULL; END
    
             
                            INSERT INTO ProductorAbejasNativasVisitaIndividualTrack (Identificador,IdProductor,Fecha,ElMeliponicultorEstaPresente,OtraPersonaPresente,Motivo,Observaciones,Recomendaciones,Otros,Estado,Usuario,Dispositivo,FechaCreacion,FechaCreacionUtc,FechaModificacion,FechaModificacionUtc,Transaccion)
                            VALUES  (@Identificador,@IdProductor,@Fecha,@ElMeliponicultorEstaPresente,@OtraPersonaPresente,@Motivo, @Observaciones , @Recomendaciones,@Otros,@Estado,@Usuario,@Dispositivo,@FechaCreacion,@FechaCreacionUtc,@FechaModificacion,@FechaModificacionUtc,@Transaccion)
    
        
    	 SAVE TRAN [PRODUCTORTRACK]
             SET @TRANCOUNTER = 1
    	 BEGIN TRAN [PRODUCTOR]
    
    	 IF (@IdProductorAbejasNativasVisitaIndividual > 0)
    	    BEGIN
                UPDATE ProductorAbejasNativasVisitaIndividual SET
    		    IdProductor = @IdProductor,
    			Fecha = @Fecha ,
    			ElMeliponicultorEstaPresente = @ElMeliponicultorEstaPresente ,
    			OtraPersonaPresente = @OtraPersonaPresente ,
    			Motivo  = @Motivo ,
    			Observaciones = @Observaciones,
    			Recomendaciones = @Recomendaciones ,
    			Otros  = @Otros ,
    			Estado = @Estado 
    		    WHERE Identificador = @Identificador AND IdProductorAbejasNativasVisitaIndividual= @IdProductorAbejasNativasVisitaIndividual;
    	    END 
        ELSE 
    	    BEGIN
    		    INSERT INTO ProductorAbejasNativasVisitaIndividual (Identificador,IdProductor,Fecha,ElMeliponicultorEstaPresente,OtraPersonaPresente,Motivo,Observaciones,Recomendaciones,Otros,Estado)
                        VALUES  (@Identificador,@IdProductor,@Fecha,@ElMeliponicultorEstaPresente,@OtraPersonaPresente,@Motivo,@Observaciones,@Recomendaciones,@Otros,@Estado)
    	    END
    
    
       SAVE TRAN [PRODUCTOR];
       COMMIT TRAN [PRODUCTORTRACK];
       COMMIT TRAN [PRODUCTOR];
    
       END TRY
    
       BEGIN CATCH
                    ROLLBACK TRAN [PRODUCTORTRACK] ;
    		ROLLBACK TRAN  [PRODUCTOR]; 
    	        COMMIT TRAN [PRODUCTORTRACK]; 
    	        COMMIT TRAN [PRODUCTOR]; 
       END CATCH
    
    END 
    Por supuesto que cuando se ejecuta el UPDATE no nesecito el  IdAbejasNativasVisitaGrupal  pero para no complicar mas la cosa tambien lo puede devolver en ese caso no me afectaria en mi App...


    EFRAIN MEJIAS C VALENCIA - VENEZUELA

    miércoles, 31 de octubre de 2018 22:22

Respuestas

  • Creo que lo más sencillo sería añadir

    SELECT SCOPE_IDENTITY() AS IdProductorAbejasNativasVisitaGrupal

    justo detrás de la sentencia INSERT.

    Después lo lees al llamar al procedimiento almacenado en la misma manera en la que leerías el resultado si el procedimiento tuviese una select que leyese un campo de una tabla cualquiera.

    jueves, 1 de noviembre de 2018 13:45
  • Hola Geovany-Gio_Hernandez 

    Por cierto, no he logrado ver IdProductorAbejasNativasVisitaGrupal en el codigo que posteastes.

    No lo ves por que es autoIncremental y no lo nesecito insertarlo , cuando mando a actualizar esa tabla envio su entero correspondiente y cuando mando a insertar un nuevo registro lo mando en cero...y alli esta la validacion que hago para una u otra opcion


    EFRAIN MEJIAS C VALENCIA - VENEZUELA

    jueves, 1 de noviembre de 2018 10:06

Todas las respuestas

  • Mi sugerencia es que dentro de tu SP anexes el parametro @LastInsertedID como un parametro de salida (OUTPUT) y luego de la sentencia de insercion uses la funcion SCOPE_IDENTITY().  Por cierto, no he logrado ver IdProductorAbejasNativasVisitaGrupal en el codigo que posteastes.


    "Oh, the wind, the wind is blowing,through the graves the wind is blowing,Freedom soon will come; then well come from the shadows".The Partisan(Leonard Cohen) Email: me[at]geohernandez.net Blog:www.geohernandez.net

    jueves, 1 de noviembre de 2018 0:28
  • Hola Geovany-Gio_Hernandez 

    Por cierto, no he logrado ver IdProductorAbejasNativasVisitaGrupal en el codigo que posteastes.

    No lo ves por que es autoIncremental y no lo nesecito insertarlo , cuando mando a actualizar esa tabla envio su entero correspondiente y cuando mando a insertar un nuevo registro lo mando en cero...y alli esta la validacion que hago para una u otra opcion


    EFRAIN MEJIAS C VALENCIA - VENEZUELA

    jueves, 1 de noviembre de 2018 10:06
  • Creo que lo más sencillo sería añadir

    SELECT SCOPE_IDENTITY() AS IdProductorAbejasNativasVisitaGrupal

    justo detrás de la sentencia INSERT.

    Después lo lees al llamar al procedimiento almacenado en la misma manera en la que leerías el resultado si el procedimiento tuviese una select que leyese un campo de una tabla cualquiera.

    jueves, 1 de noviembre de 2018 13:45