Principales respuestas
Obtener resultados desde un SP en otro SP

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
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- Marcado como respuesta MasterReisender lunes, 1 de junio de 2009 21:44
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- Marcado como respuesta MasterReisender lunes, 1 de junio de 2009 21:44
-
-
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 intexec @retorno = spObtenerNumero 45Sin 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.
- Propuesto como respuesta Alberto López Grande (qwalgrande)Moderator lunes, 1 de junio de 2009 20:37
-
-
-
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