@@ -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