Skip to content

Commit ef0b75e

Browse files
authored
Merge pull request #2944 from Adedba/2887-sp_BlitzWho---Add-@GetOuterCommand-to-get-contents-of-the-inputbuffer-per-session_id
2887 sp blitz who add @get outer command to get contents of the inputbuffer per session
2 parents 72f1f16 + ab59395 commit ef0b75e

File tree

1 file changed

+94
-3
lines changed

1 file changed

+94
-3
lines changed

sp_BlitzWho.sql

Lines changed: 94 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ ALTER PROCEDURE dbo.sp_BlitzWho
2121
@MinBlockingSeconds INT = 0 ,
2222
@CheckDateOverride DATETIMEOFFSET = NULL,
2323
@ShowActualParameters BIT = 0,
24+
@GetOuterCommand BIT = 0,
2425
@Version VARCHAR(30) = NULL OUTPUT,
2526
@VersionDate DATETIME = NULL OUTPUT,
2627
@VersionCheckMode BIT = 0,
@@ -161,6 +162,7 @@ IF @OutputDatabaseName IS NOT NULL AND @OutputSchemaName IS NOT NULL AND @Output
161162
[session_id] [smallint] NOT NULL,
162163
[database_name] [nvarchar](128) NULL,
163164
[query_text] [nvarchar](max) NULL,
165+
[outer_command] NVARCHAR(4000) NULL,
164166
[query_plan] [xml] NULL,
165167
[live_query_plan] [xml] NULL,
166168
[cached_parameter_info] [nvarchar](max) NULL,
@@ -277,6 +279,13 @@ IF @OutputDatabaseName IS NOT NULL AND @OutputSchemaName IS NOT NULL AND @Output
277279
ALTER TABLE ' + @ObjectFullName + N' ADD live_parameter_info NVARCHAR(MAX) NULL;';
278280
EXEC(@StringToExecute);
279281

282+
/* If the table doesn't have the new outer_command column, add it. See Github #2887. */
283+
SET @ObjectFullName = @OutputDatabaseName + N'.' + @OutputSchemaName + N'.' + @OutputTableName;
284+
SET @StringToExecute = N'IF NOT EXISTS (SELECT * FROM ' + @OutputDatabaseName + N'.sys.all_columns
285+
WHERE object_id = (OBJECT_ID(''' + @ObjectFullName + N''')) AND name = ''outer_command'')
286+
ALTER TABLE ' + @ObjectFullName + N' ADD outer_command NVARCHAR(4000) NULL;';
287+
EXEC(@StringToExecute);
288+
280289
/* Delete history older than @OutputTableRetentionDays */
281290
SET @OutputTableCleanupDate = CAST( (DATEADD(DAY, -1 * @OutputTableRetentionDays, GETDATE() ) ) AS DATE);
282291
SET @StringToExecute = N' IF EXISTS(SELECT * FROM '
@@ -574,7 +583,64 @@ SELECT @BlockingCheck = N'SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
574583
FROM sys.sysprocesses AS sys1
575584
JOIN sys.sysprocesses AS sys2
576585
ON sys1.spid = sys2.blocked;
586+
'+CASE
587+
WHEN (@GetOuterCommand = 1 AND (NOT EXISTS(SELECT 1 FROM sys.all_objects WHERE [name] = N'dm_exec_input_buffer'))) THEN N'
588+
DECLARE @session_id SMALLINT;
589+
DECLARE @Sessions TABLE
590+
(
591+
session_id INT
592+
);
593+
594+
DECLARE @inputbuffer TABLE
595+
(
596+
ID INT IDENTITY(1,1),
597+
session_id INT,
598+
event_type NVARCHAR(30),
599+
parameters SMALLINT,
600+
event_info NVARCHAR(4000)
601+
);
602+
603+
DECLARE inputbuffer_cursor
604+
605+
CURSOR LOCAL FAST_FORWARD
606+
FOR
607+
SELECT session_id
608+
FROM sys.dm_exec_sessions
609+
WHERE session_id <> @@SPID
610+
AND is_user_process = 1;
611+
612+
OPEN inputbuffer_cursor;
613+
614+
FETCH NEXT FROM inputbuffer_cursor INTO @session_id;
615+
616+
WHILE (@@FETCH_STATUS = 0)
617+
BEGIN;
618+
BEGIN TRY;
619+
620+
INSERT INTO @inputbuffer ([event_type],[parameters],[event_info])
621+
EXEC sp_executesql
622+
N''DBCC INPUTBUFFER(@session_id) WITH NO_INFOMSGS;'',
623+
N''@session_id SMALLINT'',
624+
@session_id;
625+
626+
UPDATE @inputbuffer
627+
SET session_id = @session_id
628+
WHERE ID = SCOPE_IDENTITY();
577629
630+
END TRY
631+
BEGIN CATCH
632+
RAISERROR(''DBCC inputbuffer failed for session %d'',0,0,@session_id) WITH NOWAIT;
633+
END CATCH;
634+
635+
FETCH NEXT FROM inputbuffer_cursor INTO @session_id
636+
637+
END;
638+
639+
CLOSE inputbuffer_cursor;
640+
DEALLOCATE inputbuffer_cursor;'
641+
ELSE N''
642+
END+
643+
N'
578644
579645
DECLARE @LiveQueryPlans TABLE
580646
(
@@ -583,7 +649,6 @@ SELECT @BlockingCheck = N'SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
583649
);
584650
585651
'
586-
587652
IF EXISTS (SELECT * FROM sys.all_columns WHERE object_id = OBJECT_ID('sys.dm_exec_query_statistics_xml') AND name = 'query_plan')
588653
BEGIN
589654
SET @BlockingCheck = @BlockingCheck + N'
@@ -610,6 +675,10 @@ BEGIN
610675
ELSE query_stats.statement_end_offset
611676
END - query_stats.statement_start_offset )
612677
/ 2 ) + 1), dest.text) AS query_text ,
678+
'+CASE
679+
WHEN @GetOuterCommand = 1 THEN N'CAST(event_info AS NVARCHAR(4000)) AS outer_command,'
680+
ELSE N''
681+
END+N'
613682
derp.query_plan ,
614683
qmg.query_cost ,
615684
s.status ,
@@ -729,6 +798,14 @@ BEGIN
729798

730799
SET @StringToExecute +=
731800
N'FROM sys.dm_exec_sessions AS s
801+
'+
802+
CASE
803+
WHEN @GetOuterCommand = 1 THEN CASE
804+
WHEN EXISTS(SELECT 1 FROM sys.all_objects WHERE [name] = N'dm_exec_input_buffer') THEN N'OUTER APPLY sys.dm_exec_input_buffer (s.session_id, 0) AS ib'
805+
ELSE N'LEFT JOIN @inputbuffer ib ON s.session_id = ib.session_id'
806+
END
807+
ELSE N''
808+
END+N'
732809
LEFT JOIN sys.dm_exec_requests AS r
733810
ON r.session_id = s.session_id
734811
LEFT JOIN ( SELECT DISTINCT
@@ -815,6 +892,10 @@ IF @ProductVersionMajor >= 11
815892
ELSE query_stats.statement_end_offset
816893
END - query_stats.statement_start_offset )
817894
/ 2 ) + 1), dest.text) AS query_text ,
895+
'+CASE
896+
WHEN @GetOuterCommand = 1 THEN N'CAST(event_info AS NVARCHAR(4000)) AS outer_command,'
897+
ELSE N''
898+
END+N'
818899
derp.query_plan ,
819900
CAST(COALESCE(qs_live.Query_Plan, ''<?No live query plan available. To turn on live plans, see https://www.BrentOzar.com/go/liveplans ?>'') AS XML) AS live_query_plan ,
820901
STUFF((SELECT DISTINCT N'', '' + Node.Data.value(''(@Column)[1]'', ''NVARCHAR(4000)'') + N'' {'' + Node.Data.value(''(@ParameterDataType)[1]'', ''NVARCHAR(4000)'') + N''}: '' + Node.Data.value(''(@ParameterCompiledValue)[1]'', ''NVARCHAR(4000)'')
@@ -992,7 +1073,16 @@ IF @ProductVersionMajor >= 11
9921073
END /* IF @ExpertMode = 1 */
9931074

9941075
SET @StringToExecute +=
995-
N' FROM sys.dm_exec_sessions AS s
1076+
N' FROM sys.dm_exec_sessions AS s'+
1077+
CASE
1078+
WHEN @GetOuterCommand = 1 THEN CASE
1079+
WHEN EXISTS(SELECT 1 FROM sys.all_objects WHERE [name] = N'dm_exec_input_buffer') THEN N'
1080+
OUTER APPLY sys.dm_exec_input_buffer (s.session_id, 0) AS ib'
1081+
ELSE N'
1082+
LEFT JOIN @inputbuffer ib ON s.session_id = ib.session_id'
1083+
END
1084+
ELSE N''
1085+
END+N'
9961086
LEFT JOIN sys.dm_exec_requests AS r
9971087
ON r.session_id = s.session_id
9981088
LEFT JOIN ( SELECT DISTINCT
@@ -1146,7 +1236,8 @@ IF @OutputDatabaseName IS NOT NULL AND @OutputSchemaName IS NOT NULL AND @Output
11461236
,[elapsed_time]
11471237
,[session_id]
11481238
,[database_name]
1149-
,[query_text]
1239+
,[query_text]'
1240+
+ CASE WHEN @GetOuterCommand = 1 THEN N',[outer_command]' ELSE N'' END + N'
11501241
,[query_plan]'
11511242
+ CASE WHEN @ProductVersionMajor >= 11 THEN N',[live_query_plan]' ELSE N'' END
11521243
+ CASE WHEN @ProductVersionMajor >= 11 THEN N',[cached_parameter_info]' ELSE N'' END

0 commit comments

Comments
 (0)