Skip to content

Commit bc85fe1

Browse files
author
Greg Dodd
committed
Adding Parameter Details from Cached and Live Query Plans
Adding Parameter Details from Cached and Live Query Plans by stripping the data out from the XML. See Issue BrentOzarULTD#2591
1 parent ddf8666 commit bc85fe1

1 file changed

Lines changed: 45 additions & 2 deletions

File tree

‎sp_BlitzWho.sql‎

Lines changed: 45 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,11 @@ DECLARE @ProductVersion NVARCHAR(128)
108108
AND r.plan_handle = session_stats.plan_handle
109109
AND r.statement_start_offset = session_stats.statement_start_offset
110110
AND r.statement_end_offset = session_stats.statement_end_offset'
111-
,@QueryStatsXMLselect NVARCHAR(MAX) = N' 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 , '
111+
,@QueryStatsXMLselect NVARCHAR(MAX) = N' 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 , '
112+
,@QueryStatsParameterSelect NVARCHAR(MAX) = N' 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)'') + N'' (Actual: '' + Node.Data.value(''(@ParameterRuntimeValue)[1]'', ''NVARCHAR(4000)'') + N'')''
113+
FROM qs_live.query_plan.nodes(''/*:ShowPlanXML/*:BatchSequence/*:Batch/*:Statements/*:StmtSimple/*:QueryPlan/*:ParameterList/*:ColumnReference'') AS Node(Data)
114+
FOR XML PATH('''')), 1,2,'''')
115+
AS Live_Parameter_Info, '
112116
,@QueryStatsXMLSQL NVARCHAR(MAX) = N'OUTER APPLY sys.dm_exec_query_statistics_xml(s.session_id) qs_live'
113117
,@ObjectFullName NVARCHAR(2000)
114118
,@OutputTableNameQueryStats_View NVARCHAR(256)
@@ -123,11 +127,16 @@ SELECT @ProductVersionMajor = SUBSTRING(@ProductVersion, 1,CHARINDEX('.', @Produ
123127
IF EXISTS (SELECT * FROM sys.all_columns WHERE object_id = OBJECT_ID('sys.dm_exec_query_statistics_xml') AND name = 'query_plan')
124128
BEGIN
125129
SET @QueryStatsXMLselect = N' 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 , ';
130+
SET @QueryStatsParameterSelect = N' 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)'') + N'' (Actual: '' + Node.Data.value(''(@ParameterRuntimeValue)[1]'', ''NVARCHAR(4000)'') + N'')''
131+
FROM qs_live.query_plan.nodes(''/*:ShowPlanXML/*:BatchSequence/*:Batch/*:Statements/*:StmtSimple/*:QueryPlan/*:ParameterList/*:ColumnReference'') AS Node(Data)
132+
FOR XML PATH('''')), 1,2,'''')
133+
AS Live_Parameter_Info, '
126134
SET @QueryStatsXMLSQL = N'OUTER APPLY sys.dm_exec_query_statistics_xml(s.session_id) qs_live';
127135
END
128136
ELSE
129137
BEGIN
130138
SET @QueryStatsXMLselect = N' NULL AS live_query_plan , ';
139+
SET @QueryStatsParameterSelect = N' NULL AS Live_Parameter_Info , '
131140
SET @QueryStatsXMLSQL = N' ';
132141
END
133142

@@ -268,6 +277,28 @@ IF @OutputDatabaseName IS NOT NULL AND @OutputSchemaName IS NOT NULL AND @Output
268277
ALTER TABLE ' + @ObjectFullName + N' ADD JoinKey AS ServerName + CAST(CheckDate AS NVARCHAR(50));';
269278
EXEC(@StringToExecute);
270279

280+
281+
SET @StringToExecute = N'IF NOT EXISTS (SELECT * FROM ' + @OutputDatabaseName + N'.sys.all_columns
282+
WHERE object_id = (OBJECT_ID(''' + @ObjectFullName + N''')) AND name = ''Cached_Parameter_Info'')
283+
ALTER TABLE ' + @ObjectFullName + N' ADD Cached_Parameter_Info NVARCHAR(4000) NULL;';
284+
IF @Debug = 1
285+
BEGIN
286+
PRINT CONVERT(VARCHAR(8000), SUBSTRING(@StringToExecute, 0, 8000))
287+
PRINT CONVERT(VARCHAR(8000), SUBSTRING(@StringToExecute, 8000, 16000))
288+
END
289+
EXEC(@StringToExecute);
290+
291+
SET @StringToExecute = N'IF NOT EXISTS (SELECT * FROM ' + @OutputDatabaseName + N'.sys.all_columns
292+
WHERE object_id = (OBJECT_ID(''' + @ObjectFullName + N''')) AND name = ''Live_Parameter_Info'')
293+
ALTER TABLE ' + @ObjectFullName + N' ADD Live_Parameter_Info NVARCHAR(4000) NULL;';
294+
295+
IF @Debug = 1
296+
BEGIN
297+
PRINT CONVERT(VARCHAR(8000), SUBSTRING(@StringToExecute, 0, 8000))
298+
PRINT CONVERT(VARCHAR(8000), SUBSTRING(@StringToExecute, 8000, 16000))
299+
END
300+
EXEC(@StringToExecute);
301+
271302
/* Delete history older than @OutputTableRetentionDays */
272303
SET @OutputTableCleanupDate = CAST( (DATEADD(DAY, -1 * @OutputTableRetentionDays, GETDATE() ) ) AS DATE);
273304
SET @StringToExecute = N' IF EXISTS(SELECT * FROM '
@@ -566,6 +597,10 @@ BEGIN
566597
END - query_stats.statement_start_offset )
567598
/ 2 ) + 1), dest.text) AS query_text ,
568599
derp.query_plan ,
600+
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)'')
601+
FROM derp.query_plan.nodes(''/*:ShowPlanXML/*:BatchSequence/*:Batch/*:Statements/*:StmtSimple/*:QueryPlan/*:ParameterList/*:ColumnReference'') AS Node(Data)
602+
FOR XML PATH('''')), 1,2,'''')
603+
AS Cached_Parameter_Info,
569604
qmg.query_cost ,
570605
s.status ,
571606
CASE
@@ -772,7 +807,13 @@ IF @ProductVersionMajor >= 11
772807
/ 2 ) + 1), dest.text) AS query_text ,
773808
derp.query_plan ,'
774809
+ @QueryStatsXMLselect
775-
+'
810+
+ N'
811+
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)'')
812+
FROM derp.query_plan.nodes(''/*:ShowPlanXML/*:BatchSequence/*:Batch/*:Statements/*:StmtSimple/*:QueryPlan/*:ParameterList/*:ColumnReference'') AS Node(Data)
813+
FOR XML PATH('''')), 1,2,'''')
814+
AS Cached_Parameter_Info,'
815+
+ @QueryStatsParameterSelect
816+
+ N'
776817
qmg.query_cost ,
777818
s.status ,
778819
CASE
@@ -1085,6 +1126,8 @@ IF @OutputDatabaseName IS NOT NULL AND @OutputSchemaName IS NOT NULL AND @Output
10851126
,[query_text]
10861127
,[query_plan]'
10871128
+ CASE WHEN @ProductVersionMajor >= 11 THEN N',[live_query_plan]' ELSE N'' END + N'
1129+
,[Cached_Parameter_Info]'
1130+
+ CASE WHEN @ProductVersionMajor >= 11 THEN N',[live_paramter_info]' ELSE N'' END + N'
10881131
,[query_cost]
10891132
,[status]
10901133
,[wait_info]'

0 commit comments

Comments
 (0)