almacenar resultado de un procedimiento almacenado

05/01/2007 - 17:30 por borix | Informe spam
Hola a todos:

tengo un procediemiento [CONEXION_estacion] se encarga de establecer
una conexion mediante ras con un servidor externo, dentro de este
procedimiento se ejecuta el comando RASDIAL el cual se ejecuta de la
siguiente manera.

create procedure CONEXION_estacion
@estacion int,
@accion nvarchar(10)
...
.
create table res (valor nvarchar(500))
insert into res (valor)
EXEC MASTER.DBO.XP_CMDSHELL 'rasdial "nombre_entrada'


select @estado_conexion
go

en la tabla RES almaceno el resultado del comando rasdial y dependiente
de los valores devueltos continuo con las demas acciones.

Bueno este procedimiento al ejecutarlo por si solo funciona bien, pero
al llamarlo desde otro procedimiento y que ademas en este ultimo se
guarden los valores devueltos en una tabla indicando el estado de la
conexion.

create table resultado (valor nvarchar(500))
insert into resultado (valor)
exec CONEXION_estacion @estacion,'CONECTAR'

no funciona, arrojandome el siguiente error:

Server: Msg 8164, Level 16, State 1, Procedure CONEXION_estacion, Line
40
An INSERT EXEC statement cannot be nested.


Ya no se me ocurre que mas hacer, ayuda please ...

Saludos
 

Leer las respuestas

#1 Alejandro Mesa
06/01/2007 - 23:17 | Informe spam
borix,

Descarta mi mensaje anterior, porque tan pronto como el procedimiento mas
interno termine, otro procedimiento pudiera comenzar y usar el spid que se
retorno.
Quizas usando un valor uniqueidentitfier.

create table dbo.t1 (
c1 uniqueidentifier not null,
c2 int not null identity
)
go

create clustered index t1_c1_nu_c_ix
on dbo.t1(c1)
go

create procedure dbo.p1
@u uniqueidentifier output
as
set nocount on

set @u = newid()

insert into dbo.t1 (c1) values(@u)

return @@error
go

create procedure dbo.p2
as
set nocount on

declare @u smallint

exec dbo.p1 @u output

select *
from dbo.t1
where c1 = @u

delete dbo.t1
where c1 = @u
go


drop procedure dbo.p2, dbo.p1
go

drop table dbo.t1
go

No he probado el codigo.

AMB

"Alejandro Mesa" wrote:

borix,

Logicamente que si la tabla es permanente, y el sp puede ser ejecutado
simultaneamente por multiples usuarios, entonces podriamos esta seleccionando
data que no corresponde a nuestra sesion. Puedes agregar una columna donde se
grabe el SPID en el procedimiento interno y que este valor sea devuelto en un
parametro de salida para se puedan leer las filas insertadas por la llamada
que hicistes.

Ejemplo:

create table dbo.t1 (
spid smallint not null default (@@spid),
c1 int not null identity
)
go

create clustered index t1_spid_nu_c_ix
on dbo.t1(spid)
go

create procedure dbo.p1
@spid smallint output
as
set nocount on

set @spid = @@spid

insert into dbo.t1 default values

return @@error
go

create procedure dbo.p2
as
set nocount on

declare @spid smallint

exec dbo.p1 @spid output

select *
from dbo.t1
where spid = @spid

delete dbo.t1
where spid = @spid
go


drop procedure dbo.p2, dbo.p1
go

drop table dbo.t1
go


Compartir datos entre procedimientos almacenados
http://www.hayes.ch/sql/compartir_datos.html


AMB

"Alejandro Mesa" wrote:

> borix,
>
> Asi es, sql server no permite que se aniden ese tipo de sentencias. Lo que
> puedes hacer es crear la tabla temporal en el procedimiento mas externo y
> usar esta dentro del procedimiento llamado. Bueno, si es una tabla permanente
> entonces no veo porque debas crear la misma tabla dos veces, basta con
> referenciarla en el procedimiento interno.
>
> create procedure CONEXION_estacion
> @estacion int,
> @accion nvarchar(10)
> ...
> .
> insert into resultado (valor)
> EXEC MASTER.DBO.XP_CMDSHELL 'rasdial "nombre_entrada'
>
>
> select @estado_conexion
> go
>
> create table resultado (valor nvarchar(500))
> exec CONEXION_estacion @estacion,'CONECTAR'
>
>
> AMB
>
>
> "borix" wrote:
>
> > Hola a todos:
> >
> > tengo un procediemiento [CONEXION_estacion] se encarga de establecer
> > una conexion mediante ras con un servidor externo, dentro de este
> > procedimiento se ejecuta el comando RASDIAL el cual se ejecuta de la
> > siguiente manera.
> >
> > create procedure CONEXION_estacion
> > @estacion int,
> > @accion nvarchar(10)
> > ...
> > .
> > create table res (valor nvarchar(500))
> > insert into res (valor)
> > EXEC MASTER.DBO.XP_CMDSHELL 'rasdial "nombre_entrada'
> >
> >
> > select @estado_conexion
> > go
> >
> > en la tabla RES almaceno el resultado del comando rasdial y dependiente
> > de los valores devueltos continuo con las demas acciones.
> >
> > Bueno este procedimiento al ejecutarlo por si solo funciona bien, pero
> > al llamarlo desde otro procedimiento y que ademas en este ultimo se
> > guarden los valores devueltos en una tabla indicando el estado de la
> > conexion.
> >
> > create table resultado (valor nvarchar(500))
> > insert into resultado (valor)
> > exec CONEXION_estacion @estacion,'CONECTAR'
> >
> > no funciona, arrojandome el siguiente error:
> >
> > Server: Msg 8164, Level 16, State 1, Procedure CONEXION_estacion, Line
> > 40
> > An INSERT EXEC statement cannot be nested.
> >
> >
> > Ya no se me ocurre que mas hacer, ayuda please ...
> >
> > Saludos
> >
> >

Preguntas similares