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
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
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
-- Esta sentencia nos dara error
-- An INSERT EXEC statement cannot be nested.
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:
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
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.
Diego de la Vega escribió: