¿Es posible registrar el texto de cada consulta ejecutada en SQL Server?
-
28-10-2019 - |
Pregunta
Tenemos esta situación recurrente en la que varias veces a la semana nuestra solicitud deja de responder. Lo que me gustaría hacer es poder ver el texto de la consulta que se ejecuta en SQL Server.
Puedo usar sp_who
Para ver las conexiones abiertas, pero no muestra el texto de consulta real.
Si puedo ver la consulta que está congelando mi base de datos, puedo tener un punto de partida para la optimización.
Esto sucedió hace unos minutos y nuestro administrador de SYS tuvo que reiniciar la caja. Este reinicio no es sostenible.
¿Qué pasos debo tomar?
Me gustaría ver el texto real de las consultas que se están ejecutando en mi servidor.
SQL Server 2000
Solución
Use esto mientras el bloque está sucediendo:
SELECT
r.session_id AS spid
,r.cpu_time,r.reads,r.writes,r.logical_reads
,r.blocking_session_id AS BlockingSPID
,LEFT(OBJECT_NAME(st.objectid, st.dbid),50) AS ShortObjectName
,LEFT(DB_NAME(r.database_id),50) AS DatabaseName
,s.program_name
,s.login_name
,OBJECT_NAME(st.objectid, st.dbid) AS ObjectName
,SUBSTRING(st.text, (r.statement_start_offset/2)+1,( (CASE r.statement_end_offset
WHEN -1 THEN DATALENGTH(st.text)
ELSE r.statement_end_offset
END - r.statement_start_offset
)/2
) + 1
) AS SQLText
FROM sys.dm_exec_requests r
JOIN sys.dm_exec_sessions s ON r.session_id = s.session_id
CROSS APPLY sys.dm_exec_sql_text (sql_handle) st
WHERE r.session_id!=@@SPID
Esto enumerará todas las espididas activas, que los están bloqueando y el SQL de cada Spid
EDITAR
Esta consulta es para SQL Server 2005+, la pregunta inicial no indicó SQL Server 2000
Otros consejos
Ver el artículo Cómo monitorear el bloqueo en SQL Server 2005 y en SQL Server 2000 para la definición de sp_blocker_pss08
(un script compatible con SQL Server 2000).