Obtener valores de execute procedure

08/03/2005 - 20:01 por MarcosQ | Informe spam
Tengo un procedimiento almacenado que llama a otro. Este último devuelve un
cursor de resultados. Es decir, la última instrucción es una select.

¿Como obtengo en el procedimiento almacenado que lo llama este cursor para
luego ir recorriéndolo?

Gracias de antemano.

Preguntas similare

Leer las respuestas

#1 Maxi
08/03/2005 - 20:15 | Informe spam
Hola, a ver, ir recorriendo un cursor no es una buena tecnica que digamos
pero...

Veamos, si quieres que el resultado de un sp lo pueda manejar asi vas a
tener que crear alguna tabla (quizas tenporal) y hacer

INSERT INTO TABLA
EXEC TU_SP

Claro, la estructura de la tabla debe ser la misma que la salida del SP y en
el mismo orden ;)


Salu2
Maxi


"MarcosQ" escribió en el mensaje
news:
Tengo un procedimiento almacenado que llama a otro. Este último devuelve
un
cursor de resultados. Es decir, la última instrucción es una select.

¿Como obtengo en el procedimiento almacenado que lo llama este cursor para
luego ir recorriéndolo?

Gracias de antemano.
Respuesta Responder a este mensaje
#2 Alejandro Mesa
08/03/2005 - 20:23 | Informe spam
Marcos,

Noto que tienes en mente usar cursores. Serio bueno si pudieras ampliar un
poco mas en lo que tratas de hacer, pues el uso de cursores en t-sql no es
muy beneficioso que digamos.

Debes crear una tabla en elprocedimiento que llama y usar la sentencia
INSERT ... EXEC ... para guardar el resultado del procedimineto o puedes
devolver un cursor desde el procedimineto que llamas.


Ejemplo:

use northwind
go

create procedure dbo.proc1
@year int
as
set nocount on

select
orderid,
orderdate
from
dbo.orders
where
orderdate >= ltrim(@year) + '0101' and orderdate < ltrim(@year + 1) + '0101'

return @@error
go

create procedure dbo.proc2
as
set nocount on

create table #t (orderid int, orderdate datetime)

insert into #t
exec dbo.proc1 1996

declare @oid int
declare @odate datetime
declare @s varchar(25)

declare my_cursor cursor local fast_forward
for
select
orderid,
orderdate
from
#t

open my_cursor

while 1 = 1
begin
fetch next from my_cursor into @oid, @odate

if @@error != 0 or @@fetch_status != 0 break

set @s = convert(varchar(25), @odate, 126)
raiserror('%d - %s', 0, 1, @oid, @s) with nowait
end

close my_cursor
deallocate my_cursor
go

exec proc2
go

alter procedure dbo.proc1
@year int,
@c cursor varying output
as
set nocount on

set @c = cursor local fast_forward for
select
orderid,
orderdate
from
dbo.orders
where
orderdate >= ltrim(@year) + '0101' and orderdate < ltrim(@year + 1) + '0101'

open @c

return @@error
go

alter procedure dbo.proc2
as
declare @my_cursor cursor
declare @oid int
declare @odate datetime
declare @s varchar(25)

exec dbo.proc1 1996, @my_cursor output

if cursor_status('variable', '@my_cursor') = 1
begin

raiserror('', 0, 1) with nowait
raiserror('', 0, 1) with nowait

while 1 = 1
begin
fetch next from @my_cursor into @oid, @odate

if @@error != 0 or @@fetch_status != 0 break

set @s = convert(varchar(25), @odate, 126)
raiserror('%d - %s', 0, 1, @oid, @s) with nowait
end

close @my_cursor
deallocate @my_cursor
end
go

exec proc2
go

drop procedure proc2, proc1
go


AMB


"MarcosQ" wrote:

Tengo un procedimiento almacenado que llama a otro. Este último devuelve un
cursor de resultados. Es decir, la última instrucción es una select.

¿Como obtengo en el procedimiento almacenado que lo llama este cursor para
luego ir recorriéndolo?

Gracias de antemano.
Respuesta Responder a este mensaje
#3 MarcosQ
09/03/2005 - 11:03 | Informe spam
Gracias,
En principio no los usaré porque tengo alternativa a lo que necesito ahora
mismo. Aunque quería saber como se devolvía en estos casos los resultados por
si me hace falta en otros casos. De todas formas si no es muy eficiente
intentaré pensar en otras alternativas antes de meterme con ésta.

Lo que necesitaba hacer es tener diferentes procedimientos almacenados que
insertaran en tablas y que luego devolvieran el @@identity con una select
final.
En vista que esta forma de devolver los resultados no es muy eficiente como
me habéis dicho tanto Alejandro como Maxi, puedo hacerlo con un parámetro
de salida sin mayores problemas en este caso.

Gracias por la información
Saludos,
Marcos Q.

"Alejandro Mesa" wrote:

Marcos,

Noto que tienes en mente usar cursores. Serio bueno si pudieras ampliar un
poco mas en lo que tratas de hacer, pues el uso de cursores en t-sql no es
muy beneficioso que digamos.

Debes crear una tabla en elprocedimiento que llama y usar la sentencia
INSERT ... EXEC ... para guardar el resultado del procedimineto o puedes
devolver un cursor desde el procedimineto que llamas.


Ejemplo:

use northwind
go

create procedure dbo.proc1
@year int
as
set nocount on

select
orderid,
orderdate
from
dbo.orders
where
orderdate >= ltrim(@year) + '0101' and orderdate < ltrim(@year + 1) + '0101'

return @@error
go

create procedure dbo.proc2
as
set nocount on

create table #t (orderid int, orderdate datetime)

insert into #t
exec dbo.proc1 1996

declare @oid int
declare @odate datetime
declare @s varchar(25)

declare my_cursor cursor local fast_forward
for
select
orderid,
orderdate
from
#t

open my_cursor

while 1 = 1
begin
fetch next from my_cursor into @oid, @odate

if @@error != 0 or @@fetch_status != 0 break

set @s = convert(varchar(25), @odate, 126)
raiserror('%d - %s', 0, 1, @oid, @s) with nowait
end

close my_cursor
deallocate my_cursor
go

exec proc2
go

alter procedure dbo.proc1
@year int,
@c cursor varying output
as
set nocount on

set @c = cursor local fast_forward for
select
orderid,
orderdate
from
dbo.orders
where
orderdate >= ltrim(@year) + '0101' and orderdate < ltrim(@year + 1) + '0101'

open @c

return @@error
go

alter procedure dbo.proc2
as
declare @my_cursor cursor
declare @oid int
declare @odate datetime
declare @s varchar(25)

exec dbo.proc1 1996, @my_cursor output

if cursor_status('variable', '@my_cursor') = 1
begin

raiserror('', 0, 1) with nowait
raiserror('', 0, 1) with nowait

while 1 = 1
begin
fetch next from @my_cursor into @oid, @odate

if @@error != 0 or @@fetch_status != 0 break

set @s = convert(varchar(25), @odate, 126)
raiserror('%d - %s', 0, 1, @oid, @s) with nowait
end

close @my_cursor
deallocate @my_cursor
end
go

exec proc2
go

drop procedure proc2, proc1
go


AMB


"MarcosQ" wrote:

> Tengo un procedimiento almacenado que llama a otro. Este último devuelve un
> cursor de resultados. Es decir, la última instrucción es una select.
>
> ¿Como obtengo en el procedimiento almacenado que lo llama este cursor para
> luego ir recorriéndolo?
>
> Gracias de antemano.
Respuesta Responder a este mensaje
#4 Alejandro Mesa
09/03/2005 - 14:23 | Informe spam
Marcos,

Esa es la forma optima de devolver un valor, usando parametros de salida.


AMB


"MarcosQ" wrote:

Gracias,
En principio no los usaré porque tengo alternativa a lo que necesito ahora
mismo. Aunque quería saber como se devolvía en estos casos los resultados por
si me hace falta en otros casos. De todas formas si no es muy eficiente
intentaré pensar en otras alternativas antes de meterme con ésta.

Lo que necesitaba hacer es tener diferentes procedimientos almacenados que
insertaran en tablas y que luego devolvieran el @@identity con una select
final.
En vista que esta forma de devolver los resultados no es muy eficiente como
me habéis dicho tanto Alejandro como Maxi, puedo hacerlo con un parámetro
de salida sin mayores problemas en este caso.

Gracias por la información
Saludos,
Marcos Q.

"Alejandro Mesa" wrote:

> Marcos,
>
> Noto que tienes en mente usar cursores. Serio bueno si pudieras ampliar un
> poco mas en lo que tratas de hacer, pues el uso de cursores en t-sql no es
> muy beneficioso que digamos.
>
> Debes crear una tabla en elprocedimiento que llama y usar la sentencia
> INSERT ... EXEC ... para guardar el resultado del procedimineto o puedes
> devolver un cursor desde el procedimineto que llamas.
>
>
> Ejemplo:
>
> use northwind
> go
>
> create procedure dbo.proc1
> @year int
> as
> set nocount on
>
> select
> orderid,
> orderdate
> from
> dbo.orders
> where
> orderdate >= ltrim(@year) + '0101' and orderdate < ltrim(@year + 1) + '0101'
>
> return @@error
> go
>
> create procedure dbo.proc2
> as
> set nocount on
>
> create table #t (orderid int, orderdate datetime)
>
> insert into #t
> exec dbo.proc1 1996
>
> declare @oid int
> declare @odate datetime
> declare @s varchar(25)
>
> declare my_cursor cursor local fast_forward
> for
> select
> orderid,
> orderdate
> from
> #t
>
> open my_cursor
>
> while 1 = 1
> begin
> fetch next from my_cursor into @oid, @odate
>
> if @@error != 0 or @@fetch_status != 0 break
>
> set @s = convert(varchar(25), @odate, 126)
> raiserror('%d - %s', 0, 1, @oid, @s) with nowait
> end
>
> close my_cursor
> deallocate my_cursor
> go
>
> exec proc2
> go
>
> alter procedure dbo.proc1
> @year int,
> @c cursor varying output
> as
> set nocount on
>
> set @c = cursor local fast_forward for
> select
> orderid,
> orderdate
> from
> dbo.orders
> where
> orderdate >= ltrim(@year) + '0101' and orderdate < ltrim(@year + 1) + '0101'
>
> open @c
>
> return @@error
> go
>
> alter procedure dbo.proc2
> as
> declare @my_cursor cursor
> declare @oid int
> declare @odate datetime
> declare @s varchar(25)
>
> exec dbo.proc1 1996, @my_cursor output
>
> if cursor_status('variable', '@my_cursor') = 1
> begin
>
> raiserror('', 0, 1) with nowait
> raiserror('', 0, 1) with nowait
>
> while 1 = 1
> begin
> fetch next from @my_cursor into @oid, @odate
>
> if @@error != 0 or @@fetch_status != 0 break
>
> set @s = convert(varchar(25), @odate, 126)
> raiserror('%d - %s', 0, 1, @oid, @s) with nowait
> end
>
> close @my_cursor
> deallocate @my_cursor
> end
> go
>
> exec proc2
> go
>
> drop procedure proc2, proc1
> go
>
>
> AMB
>
>
> "MarcosQ" wrote:
>
> > Tengo un procedimiento almacenado que llama a otro. Este último devuelve un
> > cursor de resultados. Es decir, la última instrucción es una select.
> >
> > ¿Como obtengo en el procedimiento almacenado que lo llama este cursor para
> > luego ir recorriéndolo?
> >
> > Gracias de antemano.
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida