Advertisement
Guest User

Blocking Tree

a guest
Jul 23rd, 2019
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
T-SQL 2.31 KB | None | 0 0
  1. SET NOCOUNT ON
  2. GO
  3. DROP TABLE IF EXISTS #T
  4. GO
  5. DROP TABLE IF EXISTS #buffer_results
  6. GO
  7. CREATE TABLE #buffer_results (EventType VARCHAR(30),Parameters INT,EventInfo NVARCHAR(4000), SPID INT );
  8. CREATE TABLE #t (ID INT PRIMARY KEY IDENTITY, SPID INT, BLOCKED INT, BATCH NVARCHAR(MAX), SP NVARCHAR(4000))
  9. DECLARE @i INT, @sql NVARCHAR(MAX), @SPID INT
  10. INSERT INTO #t (SPID, BLOCKED, BATCH)
  11. SELECT SPID, BLOCKED, REPLACE (REPLACE (T.TEXT, CHAR(10), ' '), CHAR (13), ' ' ) AS BATCH
  12. FROM sys.sysprocesses R CROSS APPLY sys.dm_exec_sql_text(R.SQL_HANDLE) T
  13. SET @i = @@ROWCOUNT
  14. WHILE @i > 0
  15.        BEGIN
  16.               BEGIN TRY;
  17.                      SELECT @SPID = SPID FROM #t WHERE ID = @i
  18.                      INSERT INTO #buffer_results
  19.                      (
  20.                            EventType,
  21.                            Parameters,
  22.                            EventInfo
  23.                      )
  24.                      EXEC sp_executesql
  25.                            N'DBCC INPUTBUFFER(@session_id) WITH NO_INFOMSGS;',
  26.                            N'@session_id SMALLINT',
  27.                            @SPID;
  28.                      UPDATE #buffer_results SET SPID = @SPID WHERE SPID IS NULL
  29.               END TRY
  30.               BEGIN CATCH
  31.               END CATCH;
  32.               SET @i = @i - 1
  33.        END
  34. UPDATE a
  35. SET SP = ISNULL(REPLACE(b.EventInfo,';1',''),'')
  36. FROM #t a
  37. JOIN #buffer_results b ON a.SPID = b.SPID
  38. ;WITH BLOCKERS (SPID, SP, BLOCKED, LEVEL, BATCH)
  39. AS
  40. (
  41. SELECT SPID,
  42. SP,
  43. BLOCKED,
  44. CAST (REPLICATE ('0', 4-LEN (CAST (SPID AS VARCHAR))) + CAST (SPID AS VARCHAR) AS VARCHAR (1000)) AS LEVEL,
  45. BATCH FROM #T R
  46. WHERE (BLOCKED = 0 OR BLOCKED = SPID)
  47. AND EXISTS (SELECT * FROM #T R2 WHERE R2.BLOCKED = R.SPID AND R2.BLOCKED <> R2.SPID)
  48. UNION ALL
  49. SELECT R.SPID,
  50. R.SP,
  51. R.BLOCKED,
  52. CAST (BLOCKERS.LEVEL + RIGHT (CAST ((1000 + R.SPID) AS VARCHAR (100)), 4) AS VARCHAR (1000)) AS LEVEL,
  53. R.BATCH FROM #T AS R
  54. INNER JOIN BLOCKERS ON R.BLOCKED = BLOCKERS.SPID WHERE R.BLOCKED > 0 AND R.BLOCKED <> R.SPID
  55. )
  56. SELECT N'    ' + REPLICATE (N'|         ', LEN (LEVEL)/4 - 1) +
  57. CASE WHEN (LEN(LEVEL)/4 - 1) = 0
  58. THEN 'HEAD -  '
  59. ELSE '|------  ' END
  60. + CAST (SPID AS NVARCHAR (10)) + ' - ' +SP + N' ' + BATCH AS BLOCKING_TREE
  61. FROM BLOCKERS ORDER BY LEVEL ASC
  62. GO
  63. DROP TABLE IF EXISTS #T
  64. GO
  65. DROP TABLE IF EXISTS #buffer_results
  66. GO
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement