none
Determinar valor devuelto por un stored procedure RRS feed

  • Pregunta

  • Hola,

    tengo un sp en sql server 2008 con esta estructura:

    DECLARE @Result   int;
    	
    BEGIN TRANSACTION;
    	
    BEGIN TRY
       UPDATE ... ;
    
       IF (@Fecha IS NULL)
       begin
          DELETE FROM ... ;
          INSERT INTO ... ;
          ...
       end
       ELSE
       begin
          DELETE FROM ... ;
          DELETE FROM ... ;
       end;
       COMMIT TRANSACTION;
       SET @Result = 1;
    END TRY
    BEGIN CATCH
       ROLLBACK TRANSACTION;
       SET @Result = -1;
    END CATCH;
    
    RETURN @Result;
    


    La idea es que el procedimiento devuelva el valor que yo indico en @Result como resultado de su ejecución, pero hecho así no me funciona.

    La llamada desde .NET es así: iResult = miCommand.ExecuteNonQuery();

    ¿Como podría hacer para que me devuelva el valor que yo indico?

     

     

    lunes, 9 de enero de 2012 15:05

Respuestas

  • Es una pregunta más para el foro de desarrollo que de SQL Server, ya que puedes comprobar que el funcionamiento es correcto llamando al procedimiento desde SSMS del siguiente modo:

    DECLARE @i INT
    EXEC @i = tuProcedimiento
    SELECT @i AS [valor de retorno]
    


    • Marcado como respuesta weatherby martes, 10 de enero de 2012 7:57
    lunes, 9 de enero de 2012 15:39
  • Gracias por la aclaración :) por aqui le solemos llamar "el management studio"

    Hunchback, en tu link lo que hace el código es utilizar un parámetro de salida para recuperar el código de retorno.

    La cosa es que desde el SSMS recupero correctamente el código de retorno y al recibirlo en la aplicación obtengo uno diferente.

    Ya he averiguado el porqué no recibia el valor de retorno que yo indico, en el foro de desarrollo han dado con la clave.

    Es porque tenía SET NOCOUNT en ON, al ponerlo en OFF ya recibo el valor deseado.

     

    Un saludo y gracias por la ayuda

     


    • Editado weatherby martes, 10 de enero de 2012 8:03
    • Marcado como respuesta weatherby martes, 10 de enero de 2012 8:03
    martes, 10 de enero de 2012 7:56

Todas las respuestas

  • Es una pregunta más para el foro de desarrollo que de SQL Server, ya que puedes comprobar que el funcionamiento es correcto llamando al procedimiento desde SSMS del siguiente modo:

    DECLARE @i INT
    EXEC @i = tuProcedimiento
    SELECT @i AS [valor de retorno]
    


    • Marcado como respuesta weatherby martes, 10 de enero de 2012 7:57
    lunes, 9 de enero de 2012 15:39
  • Carlos ya te respondio la pregunta, si es que ejecutas el procedimiento desde otro procedimiento o desde SSMS, pero creo que tu pregunta es como hacerlo desde una aplicacion .Net, correcto?

    Input and Output Parameters, and Return Values
    http://msdn.microsoft.com/en-us/library/59x02y99(v=VS.71).aspx

     


    AMB

    Some guidelines for posting questions...

    lunes, 9 de enero de 2012 15:49
  • Perdón por mi ignorancia pero... ¿qué es el SSMS?

     

    Miraré tu link Hunchback

     

    lunes, 9 de enero de 2012 16:02
  • > ¿qué es el SSMS?

    SQL Server Management Studio

    Using SQL Server Management Studio
    http://msdn.microsoft.com/en-us/library/ms174173.aspx 

     


    AMB

    Some guidelines for posting questions...

    lunes, 9 de enero de 2012 16:11
  • Sí, a lo que me refería es a que el problema no estaba tanto en el diseño del procedimiento (como trataba de demostrar con ese código) sino en la llamada desde el lenguaje de programación que estuviera usando, por eso le emplazaba a realizar la pregunta en otro foro más adecuado
    lunes, 9 de enero de 2012 16:19
  • Gracias por la aclaración :) por aqui le solemos llamar "el management studio"

    Hunchback, en tu link lo que hace el código es utilizar un parámetro de salida para recuperar el código de retorno.

    La cosa es que desde el SSMS recupero correctamente el código de retorno y al recibirlo en la aplicación obtengo uno diferente.

    Ya he averiguado el porqué no recibia el valor de retorno que yo indico, en el foro de desarrollo han dado con la clave.

    Es porque tenía SET NOCOUNT en ON, al ponerlo en OFF ya recibo el valor deseado.

     

    Un saludo y gracias por la ayuda

     


    • Editado weatherby martes, 10 de enero de 2012 8:03
    • Marcado como respuesta weatherby martes, 10 de enero de 2012 8:03
    martes, 10 de enero de 2012 7:56
  • Ahora si me dejastes pensando.  Segun el codigo que posteastes, estarias usando el seteo por defecto de SET NOCOUNT, que es OFF. Esto hace que el mensaje sobre filas afectadas por cada sentencia DML, sea enviada hacia la aplicacion cliente como si fueran un recordset mas, y como el valor de retorno y/o parametros de salida se envian al final del flujo, entonces se debe consumir esos recordset para poder recuperar esos valores. Logico esta, que al poner SET NOCOUNT ON al comienzo de tu sp, entonces suprimes que esos mensajes sean enviados hacia la aplicacion cliente.

    De todas maneras, gracías por compartir la solución.

     

     


    AMB

    Some guidelines for posting questions...

    martes, 10 de enero de 2012 15:49