Realizar un Select en el resultado de una procedure

27/08/2008 - 22:48 por Diego de la Vega | Informe spam
Hola,
es posible realizar un select sobre el resultado de un procedimiento?

Por ejemplo
sp_who2 devuelve una columna indicando si esta bloqueado o no un proceso
llamada BlkBy

Como podria hacerse un SELECT * from (Resultado de la SP) where BlkBy is
not null

o algo parecido, me entienden?

Gracias
Diego

Preguntas similare

Leer las respuestas

#1 Rubén Garrigós
28/08/2008 - 00:27 | Informe spam
Hola Diego,

Se pueden encontrar multiples "trucos" para poder hacer algo así pero mi
recomendación es que utilices una tabla temporal o variable de tabla y
realices sobre ésta la consulta posterior. Algo como lo siguiente pero
indicando los tipos de datos (sql_variant lo puse por rapidez):

CREATE TABLE #temp (
spid sql_variant,
ecid sql_variant,
status sql_variant,
loginame sql_variant,
hostname sql_variant,
blk sql_variant,
dbname sql_variant,
cmd sql_variant,
request_id sql_variant)

INSERT INTO #temp
(spid,ecid,status,loginame,hostname,blk,dbname,cmd,request_id)
exec ('sp_who')

SELECT * FROM #TEMP WHERE...

En todo caso, dado que tu necesidad es muy particular y es posible que la
reutilices una y otra vez creo que quizás te convenga crearte un
procedimiento sp_who2_diego que ya incluya en su propia cuerpo el filtrado
que necesitas

Rubén Garrigós
Solid Quality Mentors


"Diego de la Vega" wrote:

Hola,
es posible realizar un select sobre el resultado de un procedimiento?

Por ejemplo
sp_who2 devuelve una columna indicando si esta bloqueado o no un proceso
llamada BlkBy

Como podria hacerse un SELECT * from (Resultado de la SP) where BlkBy is
not null

o algo parecido, me entienden?

Gracias
Diego

Respuesta Responder a este mensaje
#2 Alejandro Mesa
28/08/2008 - 01:18 | Informe spam
Diego,

Como indico Rubén (excepto una variable tabla porque no permite
"insert...exec.."), puedes usar el metodo de crear una tabla y capturar la
salida de el procedimiento usando "insert ... exec ...".

Ahora, ese metodo puede fallar si el procedimiento que ejecutas ya hace uso
de "insert...exec..." o si el procedimiento o codigo devuelve mas de un
conjunto de filas, como pasava antes, en la version 2000, cuando queriamos
capturar la salida de "DBCC SHOW_STATISTICS".

Ejemplo:

use tempdb
go

create procedure dbo.usp_p1
as
set nocount on

CREATE TABLE #t (
spid sql_variant,
ecid sql_variant,
status sql_variant,
loginame sql_variant,
hostname sql_variant,
blk sql_variant,
dbname sql_variant,
cmd sql_variant,
request_id sql_variant
)

INSERT INTO #t(spid,ecid,status,loginame,hostname,blk,dbname,cmd,request_id)
exec sp_who

select spid,ecid,status,loginame,hostname,blk,dbname,cmd,request_id
from #t
GO

CREATE TABLE #temp (
spid sql_variant,
ecid sql_variant,
status sql_variant,
loginame sql_variant,
hostname sql_variant,
blk sql_variant,
dbname sql_variant,
cmd sql_variant,
request_id sql_variant
)
go

INSERT INTO
#temp(spid,ecid,status,loginame,hostname,blk,dbname,cmd,request_id)
exec dbo.usp_p1
go

drop table #temp
go

Para estos casos puedes usar una funcion de conjunto de filas, como
openrowset o openquery (si tienes un servidor ligado). Fijate en la primera
sentencia que se ejecuta, pues sql server trata de ejucatar el codigo dentro
de openrowset usando "set fmtonly on" para saber la metadata de el resultado.

SELECT a.*
FROM OPENROWSET('SQLNCLI', 'Server=(local);Trusted_Connection=yes;','set
fmtonly off; exec sp_who') AS a
WHERE dbname = DB_NAME()
go

Este metodo tiene entre sus contras, que el resultado no puede tener nombre
de columnas duplicadas, como el caso de sp_who2.


AMB


"Diego de la Vega" wrote:

Hola,
es posible realizar un select sobre el resultado de un procedimiento?

Por ejemplo
sp_who2 devuelve una columna indicando si esta bloqueado o no un proceso
llamada BlkBy

Como podria hacerse un SELECT * from (Resultado de la SP) where BlkBy is
not null

o algo parecido, me entienden?

Gracias
Diego

Respuesta Responder a este mensaje
#3 Rubén Garrigós
28/08/2008 - 02:10 | Informe spam
Efectivamente no es posible hacer un insert exec sobre una variable de tabla
y es por ello que puse el ejemplo sobre tabla temporal. Podrías montar algo
parecido con un SELECT INTO usando la variable y recurriendo al OPENROWSET
también. La verdad es que ninguna de las soluciones es demasiado "limpia",
todas tienen pegas (por ejemplo usar OPENROWSET viene deshabilitado por
seguridad por defecto).

Por ello, como ya dije en el anterior correo, dado este caso yo creo que
optaría por crear un procedimiento específico para resolver tus necesidades
concretas (sp_who2_diego) sin tener que recurrir a complicaciones adicionales
:)

Rubén Garrigós
Solid Quality Mentors


"Alejandro Mesa" wrote:

Diego,

Como indico Rubén (excepto una variable tabla porque no permite
"insert...exec.."), puedes usar el metodo de crear una tabla y capturar la
salida de el procedimiento usando "insert ... exec ...".

Ahora, ese metodo puede fallar si el procedimiento que ejecutas ya hace uso
de "insert...exec..." o si el procedimiento o codigo devuelve mas de un
conjunto de filas, como pasava antes, en la version 2000, cuando queriamos
capturar la salida de "DBCC SHOW_STATISTICS".

Ejemplo:

use tempdb
go

create procedure dbo.usp_p1
as
set nocount on

CREATE TABLE #t (
spid sql_variant,
ecid sql_variant,
status sql_variant,
loginame sql_variant,
hostname sql_variant,
blk sql_variant,
dbname sql_variant,
cmd sql_variant,
request_id sql_variant
)

INSERT INTO #t(spid,ecid,status,loginame,hostname,blk,dbname,cmd,request_id)
exec sp_who

select spid,ecid,status,loginame,hostname,blk,dbname,cmd,request_id
from #t
GO

CREATE TABLE #temp (
spid sql_variant,
ecid sql_variant,
status sql_variant,
loginame sql_variant,
hostname sql_variant,
blk sql_variant,
dbname sql_variant,
cmd sql_variant,
request_id sql_variant
)
go

INSERT INTO
#temp(spid,ecid,status,loginame,hostname,blk,dbname,cmd,request_id)
exec dbo.usp_p1
go

drop table #temp
go

Para estos casos puedes usar una funcion de conjunto de filas, como
openrowset o openquery (si tienes un servidor ligado). Fijate en la primera
sentencia que se ejecuta, pues sql server trata de ejucatar el codigo dentro
de openrowset usando "set fmtonly on" para saber la metadata de el resultado.

SELECT a.*
FROM OPENROWSET('SQLNCLI', 'Server=(local);Trusted_Connection=yes;','set
fmtonly off; exec sp_who') AS a
WHERE dbname = DB_NAME()
go

Este metodo tiene entre sus contras, que el resultado no puede tener nombre
de columnas duplicadas, como el caso de sp_who2.


AMB


"Diego de la Vega" wrote:

> Hola,
> es posible realizar un select sobre el resultado de un procedimiento?
>
> Por ejemplo
> sp_who2 devuelve una columna indicando si esta bloqueado o no un proceso
> llamada BlkBy
>
> Como podria hacerse un SELECT * from (Resultado de la SP) where BlkBy is
> not null
>
> o algo parecido, me entienden?
>
> Gracias
> Diego
>
Respuesta Responder a este mensaje
#4 Alejandro Mesa
28/08/2008 - 16:55 | Informe spam
Rubén,

Tienes toda la razon. Solo quice poner un artificio mas.

La sentencia "insert...exec..." no funciona con variables tipo tabla, pero
solo en SS 2000, que fue donde se introdujeron este tipo de variables. En
versiones posteriores si se puede.

Saludos,
AMB

P.S. Por favor, dile a Salvador que estoy esperando su e-mail y que no
olvide atachar fotos de su hijo.



"Rubén Garrigós" wrote:

Efectivamente no es posible hacer un insert exec sobre una variable de tabla
y es por ello que puse el ejemplo sobre tabla temporal. Podrías montar algo
parecido con un SELECT INTO usando la variable y recurriendo al OPENROWSET
también. La verdad es que ninguna de las soluciones es demasiado "limpia",
todas tienen pegas (por ejemplo usar OPENROWSET viene deshabilitado por
seguridad por defecto).

Por ello, como ya dije en el anterior correo, dado este caso yo creo que
optaría por crear un procedimiento específico para resolver tus necesidades
concretas (sp_who2_diego) sin tener que recurrir a complicaciones adicionales
:)

Rubén Garrigós
Solid Quality Mentors


"Alejandro Mesa" wrote:

> Diego,
>
> Como indico Rubén (excepto una variable tabla porque no permite
> "insert...exec.."), puedes usar el metodo de crear una tabla y capturar la
> salida de el procedimiento usando "insert ... exec ...".
>
> Ahora, ese metodo puede fallar si el procedimiento que ejecutas ya hace uso
> de "insert...exec..." o si el procedimiento o codigo devuelve mas de un
> conjunto de filas, como pasava antes, en la version 2000, cuando queriamos
> capturar la salida de "DBCC SHOW_STATISTICS".
>
> Ejemplo:
>
> use tempdb
> go
>
> create procedure dbo.usp_p1
> as
> set nocount on
>
> CREATE TABLE #t (
> spid sql_variant,
> ecid sql_variant,
> status sql_variant,
> loginame sql_variant,
> hostname sql_variant,
> blk sql_variant,
> dbname sql_variant,
> cmd sql_variant,
> request_id sql_variant
> )
>
> INSERT INTO #t(spid,ecid,status,loginame,hostname,blk,dbname,cmd,request_id)
> exec sp_who
>
> select spid,ecid,status,loginame,hostname,blk,dbname,cmd,request_id
> from #t
> GO
>
> CREATE TABLE #temp (
> spid sql_variant,
> ecid sql_variant,
> status sql_variant,
> loginame sql_variant,
> hostname sql_variant,
> blk sql_variant,
> dbname sql_variant,
> cmd sql_variant,
> request_id sql_variant
> )
> go
>
> INSERT INTO
> #temp(spid,ecid,status,loginame,hostname,blk,dbname,cmd,request_id)
> exec dbo.usp_p1
> go
>
> drop table #temp
> go
>
> Para estos casos puedes usar una funcion de conjunto de filas, como
> openrowset o openquery (si tienes un servidor ligado). Fijate en la primera
> sentencia que se ejecuta, pues sql server trata de ejucatar el codigo dentro
> de openrowset usando "set fmtonly on" para saber la metadata de el resultado.
>
> SELECT a.*
> FROM OPENROWSET('SQLNCLI', 'Server=(local);Trusted_Connection=yes;','set
> fmtonly off; exec sp_who') AS a
> WHERE dbname = DB_NAME()
> go
>
> Este metodo tiene entre sus contras, que el resultado no puede tener nombre
> de columnas duplicadas, como el caso de sp_who2.
>
>
> AMB
>
>
> "Diego de la Vega" wrote:
>
> > Hola,
> > es posible realizar un select sobre el resultado de un procedimiento?
> >
> > Por ejemplo
> > sp_who2 devuelve una columna indicando si esta bloqueado o no un proceso
> > llamada BlkBy
> >
> > Como podria hacerse un SELECT * from (Resultado de la SP) where BlkBy is
> > not null
> >
> > o algo parecido, me entienden?
> >
> > Gracias
> > Diego
> >
Respuesta Responder a este mensaje
#5 César Toledo
28/08/2008 - 17:57 | Informe spam
Mejor usa una función !!

Diego de la Vega escribió:
Hola,
es posible realizar un select sobre el resultado de un procedimiento?

Por ejemplo
sp_who2 devuelve una columna indicando si esta bloqueado o no un
proceso llamada BlkBy

Como podria hacerse un SELECT * from (Resultado de la SP) where BlkBy
is not null

o algo parecido, me entienden?

Gracias
Diego
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida