Skip to content

Commit ddf9ac5

Browse files
committed
Logic changes and Log to table code changes added
BrentOzarULTD#2887 Replaced the dbcc inputbuffer loop with a cursor to reduce additional reads for retrieving the next session_id to execute. Added a new column to the output table 'outer_command' Added relevant code to allow log to table for both @GetOuterCommand - 0 and = 1
1 parent b820a86 commit ddf9ac5

1 file changed

Lines changed: 48 additions & 32 deletions

File tree

‎sp_BlitzWho.sql‎

Lines changed: 48 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,7 @@ IF @OutputDatabaseName IS NOT NULL AND @OutputSchemaName IS NOT NULL AND @Output
161161
[session_id] [smallint] NOT NULL,
162162
[database_name] [nvarchar](128) NULL,
163163
[query_text] [nvarchar](max) NULL,
164+
[outer_command] NVARCHAR(4000) NULL,
164165
[query_plan] [xml] NULL,
165166
[live_query_plan] [xml] NULL,
166167
[cached_parameter_info] [nvarchar](max) NULL,
@@ -277,6 +278,13 @@ IF @OutputDatabaseName IS NOT NULL AND @OutputSchemaName IS NOT NULL AND @Output
277278
ALTER TABLE ' + @ObjectFullName + N' ADD live_parameter_info NVARCHAR(MAX) NULL;';
278279
EXEC(@StringToExecute);
279280

281+
/* If the table doesn't have the new outer_command column, add it. See Github #2887. */
282+
SET @ObjectFullName = @OutputDatabaseName + N'.' + @OutputSchemaName + N'.' + @OutputTableName;
283+
SET @StringToExecute = N'IF NOT EXISTS (SELECT * FROM ' + @OutputDatabaseName + N'.sys.all_columns
284+
WHERE object_id = (OBJECT_ID(''' + @ObjectFullName + N''')) AND name = ''outer_command'')
285+
ALTER TABLE ' + @ObjectFullName + N' ADD outer_command NVARCHAR(4000) NULL;';
286+
EXEC(@StringToExecute);
287+
280288
/* Delete history older than @OutputTableRetentionDays */
281289
SET @OutputTableCleanupDate = CAST( (DATEADD(DAY, -1 * @OutputTableRetentionDays, GETDATE() ) ) AS DATE);
282290
SET @StringToExecute = N' IF EXISTS(SELECT * FROM '
@@ -573,13 +581,9 @@ SELECT @BlockingCheck = N'SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
573581
FROM sys.sysprocesses AS sys1
574582
JOIN sys.sysprocesses AS sys2
575583
ON sys1.spid = sys2.blocked;
576-
577584
'+CASE
578-
WHEN (@GetOuterCommand = 1 AND (NOT EXISTS(SELECT 1 FROM sys.all_objects WHERE [name] = N'dm_exec_input_buffer'))) THEN N'DECLARE @Iteration INT = 1;
579-
DECLARE @DBCCCommand NVARCHAR(50);
580-
DECLARE @Sessioncount INT;
581-
DECLARE @SessionID INT = 0;
582-
585+
WHEN (@GetOuterCommand = 1 AND (NOT EXISTS(SELECT 1 FROM sys.all_objects WHERE [name] = N'dm_exec_input_buffer'))) THEN N'
586+
DECLARE @session_id SMALLINT;
583587
DECLARE @Sessions TABLE
584588
(
585589
session_id INT
@@ -594,33 +598,44 @@ SELECT @BlockingCheck = N'SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
594598
event_info NVARCHAR(4000)
595599
);
596600
597-
INSERT INTO @Sessions (session_id)
601+
DECLARE inputbuffer_cursor
602+
603+
CURSOR LOCAL FAST_FORWARD
604+
FOR
598605
SELECT session_id
599606
FROM sys.dm_exec_sessions
600607
WHERE session_id <> @@SPID
601-
AND session_id > 50;
602-
603-
SELECT @Sessioncount = COUNT(*) FROM @Sessions;
604-
605-
WHILE (@Iteration <= @Sessioncount)
606-
BEGIN
607-
SELECT TOP 1 @SessionID = session_id
608-
FROM @Sessions
609-
WHERE session_id > @SessionID
610-
ORDER BY session_id ASC;
611-
612-
SET @DBCCCommand = ''DBCC INPUTBUFFER (''+CAST(@SessionID AS NVARCHAR(10))+'') WITH NO_INFOMSGS;'';
613-
614-
INSERT INTO @inputbuffer (event_type,parameters,event_info)
615-
EXEC(@DBCCCommand);
616-
617-
UPDATE @inputbuffer
618-
SET session_id = @SessionID
619-
WHERE ID = SCOPE_IDENTITY();
620-
621-
SET @Iteration += 1;
622-
623-
END'
608+
AND is_user_process = 1;
609+
610+
OPEN inputbuffer_cursor;
611+
612+
FETCH NEXT FROM inputbuffer_cursor INTO @session_id;
613+
614+
WHILE (@@FETCH_STATUS = 0)
615+
BEGIN;
616+
BEGIN TRY;
617+
618+
INSERT INTO @inputbuffer ([event_type],[parameters],[event_info])
619+
EXEC sp_executesql
620+
N''DBCC INPUTBUFFER(@session_id) WITH NO_INFOMSGS;'',
621+
N''@session_id SMALLINT'',
622+
@session_id;
623+
624+
UPDATE @inputbuffer
625+
SET session_id = @session_id
626+
WHERE ID = SCOPE_IDENTITY();
627+
628+
END TRY
629+
BEGIN CATCH
630+
RAISERROR(''DBCC inputbuffer failed for session %d'',0,0,@session_id) WITH NOWAIT;
631+
END CATCH;
632+
633+
FETCH NEXT FROM inputbuffer_cursor INTO @session_id
634+
635+
END;
636+
637+
CLOSE inputbuffer_cursor;
638+
DEALLOCATE inputbuffer_cursor;'
624639
ELSE N''
625640
END+
626641
N'
@@ -786,7 +801,7 @@ BEGIN
786801
WHEN @GetOuterCommand = 1 THEN CASE
787802
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'
788803
ELSE N'LEFT JOIN @inputbuffer ib ON s.session_id = ib.session_id'
789-
END
804+
END
790805
ELSE N''
791806
END+N'
792807
LEFT JOIN sys.dm_exec_requests AS r
@@ -1218,7 +1233,8 @@ IF @OutputDatabaseName IS NOT NULL AND @OutputSchemaName IS NOT NULL AND @Output
12181233
,[elapsed_time]
12191234
,[session_id]
12201235
,[database_name]
1221-
,[query_text]
1236+
,[query_text]'
1237+
+ CASE WHEN @GetOuterCommand = 1 THEN N',[outer_command]' ELSE N'' END + N'
12221238
,[query_plan]'
12231239
+ CASE WHEN @ProductVersionMajor >= 11 THEN N',[live_query_plan]' ELSE N'' END + N'
12241240
,[cached_parameter_info]'

0 commit comments

Comments
 (0)