none
Obtener resultados desde un SP en otro SP RRS feed

  • Pregunta

  • Supongamos que tengo un stored procedure de este estilo:
    CREATE PROCEDURE spObtenerNombre(
        @id INT
    )
    AS
    BEGIN
        SELECT nombre FROM persona WHERE id = @id
    END
    Si ejecuto este SP con el comando...

    EXEC spObtenerNombre 45
    ... la ventana de resultados muestra una tabla con un sólo resultado:

    nombre
    ---------
    Carlos

    La pregunta es: ¿existe alguna manera de cachar este resultado si ejecuto el SP dentro de otro SP? Ejemplo:

    CREATE PROCEDURE spHacerAlgo(
    ...
    )
    AS
    BEGIN
    ...
        -- AQUÍ, ¿CÓMO CACHO EL NOMBRE EN UNA VARIABLE @nombre?
        EXEC spObtenerNombre @id
    ...
    END
    ¿Existe alguna alternativa a a crear variables OUTPUT?


    laloivol
    lunes, 1 de junio de 2009 18:13

Respuestas

  • Puedes crear una table temporal o permanente para alamcenar el resultado de el procedimiento.


    ...
    create table #t (nombre varchar(50));

    insert into #t (nombre)
    exec spObtenerNombre 45;

    select nombre from #t;
    ...

    Tambien pudieras retornar el nombre, en el primer procedimiento,  en un parametro de salida.

    create procedure spObtenerNombre
    @id int,
    @nombre varchar(50) output
    as
    set nocount on;

    select @nombre = nombre
    from persona
    where id = @id;
    go


    create procedure  spHacerAlgo
    as
    set nocount on;

    declare @nombre varchar(50);

    exec spObtenerNombre @nombre output;
    ...



    AMB

    lunes, 1 de junio de 2009 18:54

Todas las respuestas

  • Puedes crear una table temporal o permanente para alamcenar el resultado de el procedimiento.


    ...
    create table #t (nombre varchar(50));

    insert into #t (nombre)
    exec spObtenerNombre 45;

    select nombre from #t;
    ...

    Tambien pudieras retornar el nombre, en el primer procedimiento,  en un parametro de salida.

    create procedure spObtenerNombre
    @id int,
    @nombre varchar(50) output
    as
    set nocount on;

    select @nombre = nombre
    from persona
    where id = @id;
    go


    create procedure  spHacerAlgo
    as
    set nocount on;

    declare @nombre varchar(50);

    exec spObtenerNombre @nombre output;
    ...



    AMB

    lunes, 1 de junio de 2009 18:54
  • Muchas gracias, sólo una pregunta, ¿no hay manera de hacer algo así?:

    DECLARE @nombre VARCHAR(50)

    SET @nombre = EXEC spObtenerNombre 45
    laloivol
    lunes, 1 de junio de 2009 20:14
  • Hola.

    Sí es posible hacerlo, aunque estarías limitado a devolver un entero, ya que el return de un procedimiento no puede definirse de otro modo. En este caso sería:

    declare @retorno int

    exec @retorno = spObtenerNumero 45

    Sin embargo, a mí no me gusta (ni creo que sea una buena práctica) utilizar el valor de retorno de los procedimientos almacenados para algo que no sea el manejo de errores (si ha ido bien, mal y una referencia numérica de ello) y nunca nada de la lógica. Para eso están los parámetros de salida, como ya te ha comentado Alejandro. Ten en cuenta también que un parámetro de salida es siempre un parámetro de entrada y de salida, así que eso te puede dar más juego aún.

    Alberto López Grande.
    lunes, 1 de junio de 2009 20:37
    Moderador
  • Gracias por sus útiles respuestas :)
    laloivol
    lunes, 1 de junio de 2009 21:44
  • Las tablas temporales no son recomendadas debido a los recursos que utilizan, te recomiendo que utilices mejor una variable de tipo table, se comportará exactamente igual pero no consumirá recursos excesivos.
    jueves, 4 de junio de 2009 15:32
  • No necesariamente siempre es asi.
    Revisa esto.

    http://blogs.msdn.com/sqlserverstorageengine/archive/2008/03/30/sql-server-table-variable-vs-local-temporary-table.aspx

    Saludos
    Ing. Jose Mariano Alvarez http://blog.josemarianoalvarez.com/ Microsoft MVP SQLTotal Consulting Mi.Correo.es.j0se.marian0.alvarez@gmail.c0m.Corregirl0 (Cambia los ceros por O y saca lo que sobra) Este mensaje se proporciona tal como es, SIN GARANTIAS de ninguna clase
    viernes, 5 de junio de 2009 1:04