paraffin

Who IS Active

Feb 10th, 2016
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
T-SQL 167.94 KB | None | 0 0
  1. SELECT
  2.     [ReadLatency] =
  3.         CASE WHEN [num_of_reads] = 0
  4.             THEN 0 ELSE ([io_stall_read_ms] / [num_of_reads]) END,
  5.     [WriteLatency] =
  6.         CASE WHEN [num_of_writes] = 0
  7.             THEN 0 ELSE ([io_stall_write_ms] / [num_of_writes]) END,
  8.     [Latency] =
  9.         CASE WHEN ([num_of_reads] = 0 AND [num_of_writes] = 0)
  10.             THEN 0 ELSE ([io_stall] / ([num_of_reads] + [num_of_writes])) END,
  11.     [AvgBPerRead] =
  12.         CASE WHEN [num_of_reads] = 0
  13.             THEN 0 ELSE ([num_of_bytes_read] / [num_of_reads]) END,
  14.     [AvgBPerWrite] =
  15.         CASE WHEN [num_of_writes] = 0
  16.             THEN 0 ELSE ([num_of_bytes_written] / [num_of_writes]) END,
  17.     [AvgBPerTransfer] =
  18.         CASE WHEN ([num_of_reads] = 0 AND [num_of_writes] = 0)
  19.             THEN 0 ELSE
  20.                 (([num_of_bytes_read] + [num_of_bytes_written]) /
  21.                 ([num_of_reads] + [num_of_writes])) END,
  22.     LEFT ([mf].[physical_name], 2) AS [Drive],
  23.     DB_NAME ([vfs].[database_id]) AS [DB],
  24.     [mf].[physical_name]
  25. FROM
  26.     sys.dm_io_virtual_file_stats (NULL,NULL) AS [vfs]
  27. JOIN sys.master_files AS [mf]
  28.     ON [vfs].[database_id] = [mf].[database_id]
  29.     AND [vfs].[file_id] = [mf].[file_id]
  30. -- WHERE [vfs].[file_id] = 2 -- log files
  31. -- ORDER BY [Latency] DESC
  32. -- ORDER BY [ReadLatency] DESC
  33. ORDER BY [WriteLatency] DESC;
  34. GO
  35.  
  36.  
  37.  
  38. USE master
  39. GO
  40.  
  41. IF NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_NAME = 'sp_WhoIsActive')
  42.     EXEC ('CREATE PROC dbo.sp_WhoIsActive AS SELECT ''stub version, to be replaced''')
  43. GO
  44.  
  45. /*********************************************************************************************
  46. Who Is Active? v11.11 (2012-03-22)
  47. (C) 2007-2012, Adam Machanic
  48.  
  49. Feedback: mailto:[email protected]
  50. Updates: http://sqlblog.com/blogs/adam_machanic/archive/tags/who+is+active/default.aspx
  51. "Beta" Builds: http://sqlblog.com/files/folders/beta/tags/who+is+active/default.aspx
  52.  
  53. Donate! Support this project: http://tinyurl.com/WhoIsActiveDonate
  54.  
  55. License:
  56.     Who is Active? is free to download and use for personal, educational, and internal
  57.     corporate purposes, provided that this header is preserved. Redistribution or sale
  58.     of Who is Active?, in whole or in part, is prohibited without the author's express
  59.     written consent.
  60. *********************************************************************************************/
  61. ALTER PROC dbo.sp_WhoIsActive
  62. (
  63. --~
  64.     --Filters--Both inclusive and exclusive
  65.     --Set either filter to '' to disable
  66.     --Valid filter types are: session, program, database, login, and host
  67.     --Session is a session ID, and either 0 or '' can be used to indicate "all" sessions
  68.     --All other filter types support % or _ as wildcards
  69.     @filter sysname = '',
  70.     @filter_type VARCHAR(10) = 'session',
  71.     @not_filter sysname = '',
  72.     @not_filter_type VARCHAR(10) = 'session',
  73.  
  74.     --Retrieve data about the calling session?
  75.     @show_own_spid BIT = 0,
  76.  
  77.     --Retrieve data about system sessions?
  78.     @show_system_spids BIT = 0,
  79.  
  80.     --Controls how sleeping SPIDs are handled, based on the idea of levels of interest
  81.     --0 does not pull any sleeping SPIDs
  82.     --1 pulls only those sleeping SPIDs that also have an open transaction
  83.     --2 pulls all sleeping SPIDs
  84.     @show_sleeping_spids TINYINT = 1,
  85.  
  86.     --If 1, gets the full stored procedure or running batch, when available
  87.     --If 0, gets only the actual statement that is currently running in the batch or procedure
  88.     @get_full_inner_text BIT = 0,
  89.  
  90.     --Get associated query plans for running tasks, if available
  91.     --If @get_plans = 1, gets the plan based on the request's statement offset
  92.     --If @get_plans = 2, gets the entire plan based on the request's plan_handle
  93.     @get_plans TINYINT = 0,
  94.  
  95.     --Get the associated outer ad hoc query or stored procedure call, if available
  96.     @get_outer_command BIT = 0,
  97.  
  98.     --Enables pulling transaction log write info and transaction duration
  99.     @get_transaction_info BIT = 0,
  100.  
  101.     --Get information on active tasks, based on three interest levels
  102.     --Level 0 does not pull any task-related information
  103.     --Level 1 is a lightweight mode that pulls the top non-CXPACKET wait, giving preference to blockers
  104.     --Level 2 pulls all available task-based metrics, including:
  105.     --number of active tasks, current wait stats, physical I/O, context switches, and blocker information
  106.     @get_task_info TINYINT = 1,
  107.  
  108.     --Gets associated locks for each request, aggregated in an XML format
  109.     @get_locks BIT = 0,
  110.  
  111.     --Get average time for past runs of an active query
  112.     --(based on the combination of plan handle, sql handle, and offset)
  113.     @get_avg_time BIT = 0,
  114.  
  115.     --Get additional non-performance-related information about the session or request
  116.     --text_size, language, date_format, date_first, quoted_identifier, arithabort, ansi_null_dflt_on,
  117.     --ansi_defaults, ansi_warnings, ansi_padding, ansi_nulls, concat_null_yields_null,
  118.     --transaction_isolation_level, lock_timeout, deadlock_priority, row_count, command_type
  119.     --
  120.     --If a SQL Agent job is running, an subnode called agent_info will be populated with some or all of
  121.     --the following: job_id, job_name, step_id, step_name, msdb_query_error (in the event of an error)
  122.     --
  123.     --If @get_task_info is set to 2 and a lock wait is detected, a subnode called block_info will be
  124.     --populated with some or all of the following: lock_type, database_name, object_id, file_id, hobt_id,
  125.     --applock_hash, metadata_resource, metadata_class_id, object_name, schema_name
  126.     @get_additional_info BIT = 0,
  127.  
  128.     --Walk the blocking chain and count the number of
  129.     --total SPIDs blocked all the way down by a given session
  130.     --Also enables task_info Level 1, if @get_task_info is set to 0
  131.     @find_block_leaders BIT = 0,
  132.  
  133.     --Pull deltas on various metrics
  134.     --Interval in seconds to wait before doing the second data pull
  135.     @delta_interval TINYINT = 0,
  136.  
  137.     --List of desired output columns, in desired order
  138.     --Note that the final output will be the intersection of all enabled features and all
  139.     --columns in the list. Therefore, only columns associated with enabled features will
  140.     --actually appear in the output. Likewise, removing columns from this list may effectively
  141.     --disable features, even if they are turned on
  142.     --
  143.     --Each element in this list must be one of the valid output column names. Names must be
  144.     --delimited by square brackets. White space, formatting, and additional characters are
  145.     --allowed, as long as the list contains exact matches of delimited valid column names.
  146.     @output_column_list VARCHAR(8000) = '[dd%][session_id][sql_text][sql_command][login_name][wait_info][tasks][tran_log%][cpu%][temp%][block%][reads%][writes%][context%][physical%][query_plan][locks][%]',
  147.  
  148.     --Column(s) by which to sort output, optionally with sort directions.
  149.         --Valid column choices:
  150.         --session_id, physical_io, reads, physical_reads, writes, tempdb_allocations,
  151.         --tempdb_current, CPU, context_switches, used_memory, physical_io_delta,
  152.         --reads_delta, physical_reads_delta, writes_delta, tempdb_allocations_delta,
  153.         --tempdb_current_delta, CPU_delta, context_switches_delta, used_memory_delta,
  154.         --tasks, tran_start_time, open_tran_count, blocking_session_id, blocked_session_count,
  155.         --percent_complete, host_name, login_name, database_name, start_time, login_time
  156.         --
  157.         --Note that column names in the list must be bracket-delimited. Commas and/or white
  158.         --space are not required.
  159.     @sort_order VARCHAR(500) = '[start_time] ASC',
  160.  
  161.     --Formats some of the output columns in a more "human readable" form
  162.     --0 disables outfput format
  163.     --1 formats the output for variable-width fonts
  164.     --2 formats the output for fixed-width fonts
  165.     @format_output TINYINT = 1,
  166.  
  167.     --If set to a non-blank value, the script will attempt to insert into the specified
  168.     --destination table. Please note that the script will not verify that the table exists,
  169.     --or that it has the correct schema, before doing the insert.
  170.     --Table can be specified in one, two, or three-part format
  171.     @destination_table VARCHAR(4000) = '',
  172.  
  173.     --If set to 1, no data collection will happen and no result set will be returned; instead,
  174.     --a CREATE TABLE statement will be returned via the @schema parameter, which will match
  175.     --the schema of the result set that would be returned by using the same collection of the
  176.     --rest of the parameters. The CREATE TABLE statement will have a placeholder token of
  177.     --<table_name> in place of an actual table name.
  178.     @return_schema BIT = 0,
  179.     @schema VARCHAR(MAX) = NULL OUTPUT,
  180.  
  181.     --Help! What do I do?
  182.     @help BIT = 0
  183. --~
  184. )
  185. /*
  186. OUTPUT COLUMNS
  187. --------------
  188. Formatted/Non:  [session_id] [smallint] NOT NULL
  189.     Session ID (a.k.a. SPID)
  190.  
  191. Formatted:      [dd hh:mm:ss.mss] [varchar](15) NULL
  192. Non-Formatted:  <not returned>
  193.     For an active request, time the query has been running
  194.     For a sleeping session, time since the last batch completed
  195.  
  196. Formatted:      [dd hh:mm:ss.mss (avg)] [varchar](15) NULL
  197. Non-Formatted:  [avg_elapsed_time] [int] NULL
  198.     (Requires @get_avg_time option)
  199.     How much time has the active portion of the query taken in the past, on average?
  200.  
  201. Formatted:      [physical_io] [varchar](30) NULL
  202. Non-Formatted:  [physical_io] [bigint] NULL
  203.     Shows the number of physical I/Os, for active requests
  204.  
  205. Formatted:      [reads] [varchar](30) NULL
  206. Non-Formatted:  [reads] [bigint] NULL
  207.     For an active request, number of reads done for the current query
  208.     For a sleeping session, total number of reads done over the lifetime of the session
  209.  
  210. Formatted:      [physical_reads] [varchar](30) NULL
  211. Non-Formatted:  [physical_reads] [bigint] NULL
  212.     For an active request, number of physical reads done for the current query
  213.     For a sleeping session, total number of physical reads done over the lifetime of the session
  214.  
  215. Formatted:      [writes] [varchar](30) NULL
  216. Non-Formatted:  [writes] [bigint] NULL
  217.     For an active request, number of writes done for the current query
  218.     For a sleeping session, total number of writes done over the lifetime of the session
  219.  
  220. Formatted:      [tempdb_allocations] [varchar](30) NULL
  221. Non-Formatted:  [tempdb_allocations] [bigint] NULL
  222.     For an active request, number of TempDB writes done for the current query
  223.     For a sleeping session, total number of TempDB writes done over the lifetime of the session
  224.  
  225. Formatted:      [tempdb_current] [varchar](30) NULL
  226. Non-Formatted:  [tempdb_current] [bigint] NULL
  227.     For an active request, number of TempDB pages currently allocated for the query
  228.     For a sleeping session, number of TempDB pages currently allocated for the session
  229.  
  230. Formatted:      [CPU] [varchar](30) NULL
  231. Non-Formatted:  [CPU] [int] NULL
  232.     For an active request, total CPU time consumed by the current query
  233.     For a sleeping session, total CPU time consumed over the lifetime of the session
  234.  
  235. Formatted:      [context_switches] [varchar](30) NULL
  236. Non-Formatted:  [context_switches] [bigint] NULL
  237.     Shows the number of context switches, for active requests
  238.  
  239. Formatted:      [used_memory] [varchar](30) NOT NULL
  240. Non-Formatted:  [used_memory] [bigint] NOT NULL
  241.     For an active request, total memory consumption for the current query
  242.     For a sleeping session, total current memory consumption
  243.  
  244. Formatted:      [physical_io_delta] [varchar](30) NULL
  245. Non-Formatted:  [physical_io_delta] [bigint] NULL
  246.     (Requires @delta_interval option)
  247.     Difference between the number of physical I/Os reported on the first and second collections.
  248.     If the request started after the first collection, the value will be NULL
  249.  
  250. Formatted:      [reads_delta] [varchar](30) NULL
  251. Non-Formatted:  [reads_delta] [bigint] NULL
  252.     (Requires @delta_interval option)
  253.     Difference between the number of reads reported on the first and second collections.
  254.     If the request started after the first collection, the value will be NULL
  255.  
  256. Formatted:      [physical_reads_delta] [varchar](30) NULL
  257. Non-Formatted:  [physical_reads_delta] [bigint] NULL
  258.     (Requires @delta_interval option)
  259.     Difference between the number of physical reads reported on the first and second collections.
  260.     If the request started after the first collection, the value will be NULL
  261.  
  262. Formatted:      [writes_delta] [varchar](30) NULL
  263. Non-Formatted:  [writes_delta] [bigint] NULL
  264.     (Requires @delta_interval option)
  265.     Difference between the number of writes reported on the first and second collections.
  266.     If the request started after the first collection, the value will be NULL
  267.  
  268. Formatted:      [tempdb_allocations_delta] [varchar](30) NULL
  269. Non-Formatted:  [tempdb_allocations_delta] [bigint] NULL
  270.     (Requires @delta_interval option)
  271.     Difference between the number of TempDB writes reported on the first and second collections.
  272.     If the request started after the first collection, the value will be NULL
  273.  
  274. Formatted:      [tempdb_current_delta] [varchar](30) NULL
  275. Non-Formatted:  [tempdb_current_delta] [bigint] NULL
  276.     (Requires @delta_interval option)
  277.     Difference between the number of allocated TempDB pages reported on the first and second
  278.     collections. If the request started after the first collection, the value will be NULL
  279.  
  280. Formatted:      [CPU_delta] [varchar](30) NULL
  281. Non-Formatted:  [CPU_delta] [int] NULL
  282.     (Requires @delta_interval option)
  283.     Difference between the CPU time reported on the first and second collections.
  284.     If the request started after the first collection, the value will be NULL
  285.  
  286. Formatted:      [context_switches_delta] [varchar](30) NULL
  287. Non-Formatted:  [context_switches_delta] [bigint] NULL
  288.     (Requires @delta_interval option)
  289.     Difference between the context switches count reported on the first and second collections
  290.     If the request started after the first collection, the value will be NULL
  291.  
  292. Formatted:      [used_memory_delta] [varchar](30) NULL
  293. Non-Formatted:  [used_memory_delta] [bigint] NULL
  294.     Difference between the memory usage reported on the first and second collections
  295.     If the request started after the first collection, the value will be NULL
  296.  
  297. Formatted:      [tasks] [varchar](30) NULL
  298. Non-Formatted:  [tasks] [smallint] NULL
  299.     Number of worker tasks currently allocated, for active requests
  300.  
  301. Formatted/Non:  [status] [varchar](30) NOT NULL
  302.     Activity status for the session (running, sleeping, etc)
  303.  
  304. Formatted/Non:  [wait_info] [nvarchar](4000) NULL
  305.     Aggregates wait information, in the following format:
  306.         (Ax: Bms/Cms/Dms)E
  307.     A is the number of waiting tasks currently waiting on resource type E. B/C/D are wait
  308.     times, in milliseconds. If only one thread is waiting, its wait time will be shown as B.
  309.     If two tasks are waiting, each of their wait times will be shown (B/C). If three or more
  310.     tasks are waiting, the minimum, average, and maximum wait times will be shown (B/C/D).
  311.     If wait type E is a page latch wait and the page is of a "special" type (e.g. PFS, GAM, SGAM),
  312.     the page type will be identified.
  313.     If wait type E is CXPACKET, the nodeId from the query plan will be identified
  314.  
  315. Formatted/Non:  [locks] [xml] NULL
  316.     (Requires @get_locks option)
  317.     Aggregates lock information, in XML format.
  318.     The lock XML includes the lock mode, locked object, and aggregates the number of requests.
  319.     Attempts are made to identify locked objects by name
  320.  
  321. Formatted/Non:  [tran_start_time] [datetime] NULL
  322.     (Requires @get_transaction_info option)
  323.     Date and time that the first transaction opened by a session caused a transaction log
  324.     write to occur.
  325.  
  326. Formatted/Non:  [tran_log_writes] [nvarchar](4000) NULL
  327.     (Requires @get_transaction_info option)
  328.     Aggregates transaction log write information, in the following format:
  329.     A:wB (C kB)
  330.     A is a database that has been touched by an active transaction
  331.     B is the number of log writes that have been made in the database as a result of the transaction
  332.     C is the number of log kilobytes consumed by the log records
  333.  
  334. Formatted:      [open_tran_count] [varchar](30) NULL
  335. Non-Formatted:  [open_tran_count] [smallint] NULL
  336.     Shows the number of open transactions the session has open
  337.  
  338. Formatted:      [sql_command] [xml] NULL
  339. Non-Formatted:  [sql_command] [nvarchar](max) NULL
  340.     (Requires @get_outer_command option)
  341.     Shows the "outer" SQL command, i.e. the text of the batch or RPC sent to the server,
  342.     if available
  343.  
  344. Formatted:      [sql_text] [xml] NULL
  345. Non-Formatted:  [sql_text] [nvarchar](max) NULL
  346.     Shows the SQL text for active requests or the last statement executed
  347.     for sleeping sessions, if available in either case.
  348.     If @get_full_inner_text option is set, shows the full text of the batch.
  349.     Otherwise, shows only the active statement within the batch.
  350.     If the query text is locked, a special timeout message will be sent, in the following format:
  351.         <timeout_exceeded />
  352.     If an error occurs, an error message will be sent, in the following format:
  353.         <error message="message" />
  354.  
  355. Formatted/Non:  [query_plan] [xml] NULL
  356.     (Requires @get_plans option)
  357.     Shows the query plan for the request, if available.
  358.     If the plan is locked, a special timeout message will be sent, in the following format:
  359.         <timeout_exceeded />
  360.     If an error occurs, an error message will be sent, in the following format:
  361.         <error message="message" />
  362.  
  363. Formatted/Non:  [blocking_session_id] [smallint] NULL
  364.     When applicable, shows the blocking SPID
  365.  
  366. Formatted:      [blocked_session_count] [varchar](30) NULL
  367. Non-Formatted:  [blocked_session_count] [smallint] NULL
  368.     (Requires @find_block_leaders option)
  369.     The total number of SPIDs blocked by this session,
  370.     all the way down the blocking chain.
  371.  
  372. Formatted:      [percent_complete] [varchar](30) NULL
  373. Non-Formatted:  [percent_complete] [real] NULL
  374.     When applicable, shows the percent complete (e.g. for backups, restores, and some rollbacks)
  375.  
  376. Formatted/Non:  [host_name] [sysname] NOT NULL
  377.     Shows the host name for the connection
  378.  
  379. Formatted/Non:  [login_name] [sysname] NOT NULL
  380.     Shows the login name for the connection
  381.  
  382. Formatted/Non:  [database_name] [sysname] NULL
  383.     Shows the connected database
  384.  
  385. Formatted/Non:  [program_name] [sysname] NULL
  386.     Shows the reported program/application name
  387.  
  388. Formatted/Non:  [additional_info] [xml] NULL
  389.     (Requires @get_additional_info option)
  390.     Returns additional non-performance-related session/request information
  391.     If the script finds a SQL Agent job running, the name of the job and job step will be reported
  392.     If @get_task_info = 2 and the script finds a lock wait, the locked object will be reported
  393.  
  394. Formatted/Non:  [start_time] [datetime] NOT NULL
  395.     For active requests, shows the time the request started
  396.     For sleeping sessions, shows the time the last batch completed
  397.  
  398. Formatted/Non:  [login_time] [datetime] NOT NULL
  399.     Shows the time that the session connected
  400.  
  401. Formatted/Non:  [request_id] [int] NULL
  402.     For active requests, shows the request_id
  403.     Should be 0 unless MARS is being used
  404.  
  405. Formatted/Non:  [collection_time] [datetime] NOT NULL
  406.     Time that this script's final SELECT ran
  407. */
  408. AS
  409. BEGIN;
  410.     SET NOCOUNT ON;
  411.     SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
  412.     SET QUOTED_IDENTIFIER ON;
  413.     SET ANSI_PADDING ON;
  414.     SET CONCAT_NULL_YIELDS_NULL ON;
  415.     SET ANSI_WARNINGS ON;
  416.     SET NUMERIC_ROUNDABORT OFF;
  417.     SET ARITHABORT ON;
  418.  
  419.     IF
  420.         @filter IS NULL
  421.         OR @filter_type IS NULL
  422.         OR @not_filter IS NULL
  423.         OR @not_filter_type IS NULL
  424.         OR @show_own_spid IS NULL
  425.         OR @show_system_spids IS NULL
  426.         OR @show_sleeping_spids IS NULL
  427.         OR @get_full_inner_text IS NULL
  428.         OR @get_plans IS NULL
  429.         OR @get_outer_command IS NULL
  430.         OR @get_transaction_info IS NULL
  431.         OR @get_task_info IS NULL
  432.         OR @get_locks IS NULL
  433.         OR @get_avg_time IS NULL
  434.         OR @get_additional_info IS NULL
  435.         OR @find_block_leaders IS NULL
  436.         OR @delta_interval IS NULL
  437.         OR @format_output IS NULL
  438.         OR @output_column_list IS NULL
  439.         OR @sort_order IS NULL
  440.         OR @return_schema IS NULL
  441.         OR @destination_table IS NULL
  442.         OR @help IS NULL
  443.     BEGIN;
  444.         RAISERROR('Input parameters cannot be NULL', 16, 1);
  445.         RETURN;
  446.     END;
  447.    
  448.     IF @filter_type NOT IN ('session', 'program', 'database', 'login', 'host')
  449.     BEGIN;
  450.         RAISERROR('Valid filter types are: session, program, database, login, host', 16, 1);
  451.         RETURN;
  452.     END;
  453.    
  454.     IF @filter_type = 'session' AND @filter LIKE '%[^0123456789]%'
  455.     BEGIN;
  456.         RAISERROR('Session filters must be valid integers', 16, 1);
  457.         RETURN;
  458.     END;
  459.    
  460.     IF @not_filter_type NOT IN ('session', 'program', 'database', 'login', 'host')
  461.     BEGIN;
  462.         RAISERROR('Valid filter types are: session, program, database, login, host', 16, 1);
  463.         RETURN;
  464.     END;
  465.    
  466.     IF @not_filter_type = 'session' AND @not_filter LIKE '%[^0123456789]%'
  467.     BEGIN;
  468.         RAISERROR('Session filters must be valid integers', 16, 1);
  469.         RETURN;
  470.     END;
  471.    
  472.     IF @show_sleeping_spids NOT IN (0, 1, 2)
  473.     BEGIN;
  474.         RAISERROR('Valid values for @show_sleeping_spids are: 0, 1, or 2', 16, 1);
  475.         RETURN;
  476.     END;
  477.    
  478.     IF @get_plans NOT IN (0, 1, 2)
  479.     BEGIN;
  480.         RAISERROR('Valid values for @get_plans are: 0, 1, or 2', 16, 1);
  481.         RETURN;
  482.     END;
  483.  
  484.     IF @get_task_info NOT IN (0, 1, 2)
  485.     BEGIN;
  486.         RAISERROR('Valid values for @get_task_info are: 0, 1, or 2', 16, 1);
  487.         RETURN;
  488.     END;
  489.  
  490.     IF @format_output NOT IN (0, 1, 2)
  491.     BEGIN;
  492.         RAISERROR('Valid values for @format_output are: 0, 1, or 2', 16, 1);
  493.         RETURN;
  494.     END;
  495.    
  496.     IF @help = 1
  497.     BEGIN;
  498.         DECLARE
  499.             @header VARCHAR(MAX),
  500.             @params VARCHAR(MAX),
  501.             @outputs VARCHAR(MAX);
  502.  
  503.         SELECT
  504.             @header =
  505.                 REPLACE
  506.                 (
  507.                     REPLACE
  508.                     (
  509.                         CONVERT
  510.                         (
  511.                             VARCHAR(MAX),
  512.                             SUBSTRING
  513.                             (
  514.                                 t.text,
  515.                                 CHARINDEX('/' + REPLICATE('*', 93), t.text) + 94,
  516.                                 CHARINDEX(REPLICATE('*', 93) + '/', t.text) - (CHARINDEX('/' + REPLICATE('*', 93), t.text) + 94)
  517.                             )
  518.                         ),
  519.                         CHAR(13)+CHAR(10),
  520.                         CHAR(13)
  521.                     ),
  522.                     '   ',
  523.                     ''
  524.                 ),
  525.             @params =
  526.                 CHAR(13) +
  527.                     REPLACE
  528.                     (
  529.                         REPLACE
  530.                         (
  531.                             CONVERT
  532.                             (
  533.                                 VARCHAR(MAX),
  534.                                 SUBSTRING
  535.                                 (
  536.                                     t.text,
  537.                                     CHARINDEX('--~', t.text) + 5,
  538.                                     CHARINDEX('--~', t.text, CHARINDEX('--~', t.text) + 5) - (CHARINDEX('--~', t.text) + 5)
  539.                                 )
  540.                             ),
  541.                             CHAR(13)+CHAR(10),
  542.                             CHAR(13)
  543.                         ),
  544.                         '   ',
  545.                         ''
  546.                     ),
  547.                 @outputs =
  548.                     CHAR(13) +
  549.                         REPLACE
  550.                         (
  551.                             REPLACE
  552.                             (
  553.                                 REPLACE
  554.                                 (
  555.                                     CONVERT
  556.                                     (
  557.                                         VARCHAR(MAX),
  558.                                         SUBSTRING
  559.                                         (
  560.                                             t.text,
  561.                                             CHARINDEX('OUTPUT COLUMNS'+CHAR(13)+CHAR(10)+'--------------', t.text) + 32,
  562.                                             CHARINDEX('*/', t.text, CHARINDEX('OUTPUT COLUMNS'+CHAR(13)+CHAR(10)+'--------------', t.text) + 32) - (CHARINDEX('OUTPUT COLUMNS'+CHAR(13)+CHAR(10)+'--------------', t.text) + 32)
  563.                                         )
  564.                                     ),
  565.                                     CHAR(9),
  566.                                     CHAR(255)
  567.                                 ),
  568.                                 CHAR(13)+CHAR(10),
  569.                                 CHAR(13)
  570.                             ),
  571.                             '   ',
  572.                             ''
  573.                         ) +
  574.                         CHAR(13)
  575.         FROM sys.dm_exec_requests AS r
  576.         CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) AS t
  577.         WHERE
  578.             r.session_id = @@SPID;
  579.  
  580.         WITH
  581.         a0 AS
  582.         (SELECT 1 AS n UNION ALL SELECT 1),
  583.         a1 AS
  584.         (SELECT 1 AS n FROM a0 AS a, a0 AS b),
  585.         a2 AS
  586.         (SELECT 1 AS n FROM a1 AS a, a1 AS b),
  587.         a3 AS
  588.         (SELECT 1 AS n FROM a2 AS a, a2 AS b),
  589.         a4 AS
  590.         (SELECT 1 AS n FROM a3 AS a, a3 AS b),
  591.         numbers AS
  592.         (
  593.             SELECT TOP(LEN(@header) - 1)
  594.                 ROW_NUMBER() OVER
  595.                 (
  596.                     ORDER BY (SELECT NULL)
  597.                 ) AS number
  598.             FROM a4
  599.             ORDER BY
  600.                 number
  601.         )
  602.         SELECT
  603.             RTRIM(LTRIM(
  604.                 SUBSTRING
  605.                 (
  606.                     @header,
  607.                     number + 1,
  608.                     CHARINDEX(CHAR(13), @header, number + 1) - number - 1
  609.                 )
  610.             )) AS [------header---------------------------------------------------------------------------------------------------------------]
  611.         FROM numbers
  612.         WHERE
  613.             SUBSTRING(@header, number, 1) = CHAR(13);
  614.  
  615.         WITH
  616.         a0 AS
  617.         (SELECT 1 AS n UNION ALL SELECT 1),
  618.         a1 AS
  619.         (SELECT 1 AS n FROM a0 AS a, a0 AS b),
  620.         a2 AS
  621.         (SELECT 1 AS n FROM a1 AS a, a1 AS b),
  622.         a3 AS
  623.         (SELECT 1 AS n FROM a2 AS a, a2 AS b),
  624.         a4 AS
  625.         (SELECT 1 AS n FROM a3 AS a, a3 AS b),
  626.         numbers AS
  627.         (
  628.             SELECT TOP(LEN(@params) - 1)
  629.                 ROW_NUMBER() OVER
  630.                 (
  631.                     ORDER BY (SELECT NULL)
  632.                 ) AS number
  633.             FROM a4
  634.             ORDER BY
  635.                 number
  636.         ),
  637.         tokens AS
  638.         (
  639.             SELECT
  640.                 RTRIM(LTRIM(
  641.                     SUBSTRING
  642.                     (
  643.                         @params,
  644.                         number + 1,
  645.                         CHARINDEX(CHAR(13), @params, number + 1) - number - 1
  646.                     )
  647.                 )) AS token,
  648.                 number,
  649.                 CASE
  650.                     WHEN SUBSTRING(@params, number + 1, 1) = CHAR(13) THEN number
  651.                     ELSE COALESCE(NULLIF(CHARINDEX(',' + CHAR(13) + CHAR(13), @params, number), 0), LEN(@params))
  652.                 END AS param_group,
  653.                 ROW_NUMBER() OVER
  654.                 (
  655.                     PARTITION BY
  656.                         CHARINDEX(',' + CHAR(13) + CHAR(13), @params, number),
  657.                         SUBSTRING(@params, number+1, 1)
  658.                     ORDER BY
  659.                         number
  660.                 ) AS group_order
  661.             FROM numbers
  662.             WHERE
  663.                 SUBSTRING(@params, number, 1) = CHAR(13)
  664.         ),
  665.         parsed_tokens AS
  666.         (
  667.             SELECT
  668.                 MIN
  669.                 (
  670.                     CASE
  671.                         WHEN token LIKE '@%' THEN token
  672.                         ELSE NULL
  673.                     END
  674.                 ) AS parameter,
  675.                 MIN
  676.                 (
  677.                     CASE
  678.                         WHEN token LIKE '--%' THEN RIGHT(token, LEN(token) - 2)
  679.                         ELSE NULL
  680.                     END
  681.                 ) AS description,
  682.                 param_group,
  683.                 group_order
  684.             FROM tokens
  685.             WHERE
  686.                 NOT
  687.                 (
  688.                     token = ''
  689.                     AND group_order > 1
  690.                 )
  691.             GROUP BY
  692.                 param_group,
  693.                 group_order
  694.         )
  695.         SELECT
  696.             CASE
  697.                 WHEN description IS NULL AND parameter IS NULL THEN '-------------------------------------------------------------------------'
  698.                 WHEN param_group = MAX(param_group) OVER() THEN parameter
  699.                 ELSE COALESCE(LEFT(parameter, LEN(parameter) - 1), '')
  700.             END AS [------parameter----------------------------------------------------------],
  701.             CASE
  702.                 WHEN description IS NULL AND parameter IS NULL THEN '----------------------------------------------------------------------------------------------------------------------'
  703.                 ELSE COALESCE(description, '')
  704.             END AS [------description-----------------------------------------------------------------------------------------------------]
  705.         FROM parsed_tokens
  706.         ORDER BY
  707.             param_group,
  708.             group_order;
  709.        
  710.         WITH
  711.         a0 AS
  712.         (SELECT 1 AS n UNION ALL SELECT 1),
  713.         a1 AS
  714.         (SELECT 1 AS n FROM a0 AS a, a0 AS b),
  715.         a2 AS
  716.         (SELECT 1 AS n FROM a1 AS a, a1 AS b),
  717.         a3 AS
  718.         (SELECT 1 AS n FROM a2 AS a, a2 AS b),
  719.         a4 AS
  720.         (SELECT 1 AS n FROM a3 AS a, a3 AS b),
  721.         numbers AS
  722.         (
  723.             SELECT TOP(LEN(@outputs) - 1)
  724.                 ROW_NUMBER() OVER
  725.                 (
  726.                     ORDER BY (SELECT NULL)
  727.                 ) AS number
  728.             FROM a4
  729.             ORDER BY
  730.                 number
  731.         ),
  732.         tokens AS
  733.         (
  734.             SELECT
  735.                 RTRIM(LTRIM(
  736.                     SUBSTRING
  737.                     (
  738.                         @outputs,
  739.                         number + 1,
  740.                         CASE
  741.                             WHEN
  742.                                 COALESCE(NULLIF(CHARINDEX(CHAR(13) + 'Formatted', @outputs, number + 1), 0), LEN(@outputs)) <
  743.                                 COALESCE(NULLIF(CHARINDEX(CHAR(13) + CHAR(255) COLLATE Latin1_General_Bin2, @outputs, number + 1), 0), LEN(@outputs))
  744.                                 THEN COALESCE(NULLIF(CHARINDEX(CHAR(13) + 'Formatted', @outputs, number + 1), 0), LEN(@outputs)) - number - 1
  745.                             ELSE
  746.                                 COALESCE(NULLIF(CHARINDEX(CHAR(13) + CHAR(255) COLLATE Latin1_General_Bin2, @outputs, number + 1), 0), LEN(@outputs)) - number - 1
  747.                         END
  748.                     )
  749.                 )) AS token,
  750.                 number,
  751.                 COALESCE(NULLIF(CHARINDEX(CHAR(13) + 'Formatted', @outputs, number + 1), 0), LEN(@outputs)) AS output_group,
  752.                 ROW_NUMBER() OVER
  753.                 (
  754.                     PARTITION BY
  755.                         COALESCE(NULLIF(CHARINDEX(CHAR(13) + 'Formatted', @outputs, number + 1), 0), LEN(@outputs))
  756.                     ORDER BY
  757.                         number
  758.                 ) AS output_group_order
  759.             FROM numbers
  760.             WHERE
  761.                 SUBSTRING(@outputs, number, 10) = CHAR(13) + 'Formatted'
  762.                 OR SUBSTRING(@outputs, number, 2) = CHAR(13) + CHAR(255) COLLATE Latin1_General_Bin2
  763.         ),
  764.         output_tokens AS
  765.         (
  766.             SELECT
  767.                 *,
  768.                 CASE output_group_order
  769.                     WHEN 2 THEN MAX(CASE output_group_order WHEN 1 THEN token ELSE NULL END) OVER (PARTITION BY output_group)
  770.                     ELSE ''
  771.                 END COLLATE Latin1_General_Bin2 AS column_info
  772.             FROM tokens
  773.         )
  774.         SELECT
  775.             CASE output_group_order
  776.                 WHEN 1 THEN '-----------------------------------'
  777.                 WHEN 2 THEN
  778.                     CASE
  779.                         WHEN CHARINDEX('Formatted/Non:', column_info) = 1 THEN
  780.                             SUBSTRING(column_info, CHARINDEX(CHAR(255) COLLATE Latin1_General_Bin2, column_info)+1, CHARINDEX(']', column_info, CHARINDEX(CHAR(255) COLLATE Latin1_General_Bin2, column_info)+2) - CHARINDEX(CHAR(255) COLLATE Latin1_General_Bin2, column_info))
  781.                         ELSE
  782.                             SUBSTRING(column_info, CHARINDEX(CHAR(255) COLLATE Latin1_General_Bin2, column_info)+2, CHARINDEX(']', column_info, CHARINDEX(CHAR(255) COLLATE Latin1_General_Bin2, column_info)+2) - CHARINDEX(CHAR(255) COLLATE Latin1_General_Bin2, column_info)-1)
  783.                     END
  784.                 ELSE ''
  785.             END AS formatted_column_name,
  786.             CASE output_group_order
  787.                 WHEN 1 THEN '-----------------------------------'
  788.                 WHEN 2 THEN
  789.                     CASE
  790.                         WHEN CHARINDEX('Formatted/Non:', column_info) = 1 THEN
  791.                             SUBSTRING(column_info, CHARINDEX(']', column_info)+2, LEN(column_info))
  792.                         ELSE
  793.                             SUBSTRING(column_info, CHARINDEX(']', column_info)+2, CHARINDEX('Non-Formatted:', column_info, CHARINDEX(']', column_info)+2) - CHARINDEX(']', column_info)-3)
  794.                     END
  795.                 ELSE ''
  796.             END AS formatted_column_type,
  797.             CASE output_group_order
  798.                 WHEN 1 THEN '---------------------------------------'
  799.                 WHEN 2 THEN
  800.                     CASE
  801.                         WHEN CHARINDEX('Formatted/Non:', column_info) = 1 THEN ''
  802.                         ELSE
  803.                             CASE
  804.                                 WHEN SUBSTRING(column_info, CHARINDEX(CHAR(255) COLLATE Latin1_General_Bin2, column_info, CHARINDEX('Non-Formatted:', column_info))+1, 1) = '<' THEN
  805.                                     SUBSTRING(column_info, CHARINDEX(CHAR(255) COLLATE Latin1_General_Bin2, column_info, CHARINDEX('Non-Formatted:', column_info))+1, CHARINDEX('>', column_info, CHARINDEX(CHAR(255) COLLATE Latin1_General_Bin2, column_info, CHARINDEX('Non-Formatted:', column_info))+1) - CHARINDEX(CHAR(255) COLLATE Latin1_General_Bin2, column_info, CHARINDEX('Non-Formatted:', column_info)))
  806.                                 ELSE
  807.                                     SUBSTRING(column_info, CHARINDEX(CHAR(255) COLLATE Latin1_General_Bin2, column_info, CHARINDEX('Non-Formatted:', column_info))+1, CHARINDEX(']', column_info, CHARINDEX(CHAR(255) COLLATE Latin1_General_Bin2, column_info, CHARINDEX('Non-Formatted:', column_info))+1) - CHARINDEX(CHAR(255) COLLATE Latin1_General_Bin2, column_info, CHARINDEX('Non-Formatted:', column_info)))
  808.                             END
  809.                     END
  810.                 ELSE ''
  811.             END AS unformatted_column_name,
  812.             CASE output_group_order
  813.                 WHEN 1 THEN '---------------------------------------'
  814.                 WHEN 2 THEN
  815.                     CASE
  816.                         WHEN CHARINDEX('Formatted/Non:', column_info) = 1 THEN ''
  817.                         ELSE
  818.                             CASE
  819.                                 WHEN SUBSTRING(column_info, CHARINDEX(CHAR(255) COLLATE Latin1_General_Bin2, column_info, CHARINDEX('Non-Formatted:', column_info))+1, 1) = '<' THEN ''
  820.                                 ELSE
  821.                                     SUBSTRING(column_info, CHARINDEX(']', column_info, CHARINDEX('Non-Formatted:', column_info))+2, CHARINDEX('Non-Formatted:', column_info, CHARINDEX(']', column_info)+2) - CHARINDEX(']', column_info)-3)
  822.                             END
  823.                     END
  824.                 ELSE ''
  825.             END AS unformatted_column_type,
  826.             CASE output_group_order
  827.                 WHEN 1 THEN '----------------------------------------------------------------------------------------------------------------------'
  828.                 ELSE REPLACE(token, CHAR(255) COLLATE Latin1_General_Bin2, '')
  829.             END AS [------description-----------------------------------------------------------------------------------------------------]
  830.         FROM output_tokens
  831.         WHERE
  832.             NOT
  833.             (
  834.                 output_group_order = 1
  835.                 AND output_group = LEN(@outputs)
  836.             )
  837.         ORDER BY
  838.             output_group,
  839.             CASE output_group_order
  840.                 WHEN 1 THEN 99
  841.                 ELSE output_group_order
  842.             END;
  843.  
  844.         RETURN;
  845.     END;
  846.  
  847.     WITH
  848.     a0 AS
  849.     (SELECT 1 AS n UNION ALL SELECT 1),
  850.     a1 AS
  851.     (SELECT 1 AS n FROM a0 AS a, a0 AS b),
  852.     a2 AS
  853.     (SELECT 1 AS n FROM a1 AS a, a1 AS b),
  854.     a3 AS
  855.     (SELECT 1 AS n FROM a2 AS a, a2 AS b),
  856.     a4 AS
  857.     (SELECT 1 AS n FROM a3 AS a, a3 AS b),
  858.     numbers AS
  859.     (
  860.         SELECT TOP(LEN(@output_column_list))
  861.             ROW_NUMBER() OVER
  862.             (
  863.                 ORDER BY (SELECT NULL)
  864.             ) AS number
  865.         FROM a4
  866.         ORDER BY
  867.             number
  868.     ),
  869.     tokens AS
  870.     (
  871.         SELECT
  872.             '|[' +
  873.                 SUBSTRING
  874.                 (
  875.                     @output_column_list,
  876.                     number + 1,
  877.                     CHARINDEX(']', @output_column_list, number) - number - 1
  878.                 ) + '|]' AS token,
  879.             number
  880.         FROM numbers
  881.         WHERE
  882.             SUBSTRING(@output_column_list, number, 1) = '['
  883.     ),
  884.     ordered_columns AS
  885.     (
  886.         SELECT
  887.             x.column_name,
  888.             ROW_NUMBER() OVER
  889.             (
  890.                 PARTITION BY
  891.                     x.column_name
  892.                 ORDER BY
  893.                     tokens.number,
  894.                     x.default_order
  895.             ) AS r,
  896.             ROW_NUMBER() OVER
  897.             (
  898.                 ORDER BY
  899.                     tokens.number,
  900.                     x.default_order
  901.             ) AS s
  902.         FROM tokens
  903.         JOIN
  904.         (
  905.             SELECT '[session_id]' AS column_name, 1 AS default_order
  906.             UNION ALL
  907.             SELECT '[dd hh:mm:ss.mss]', 2
  908.             WHERE
  909.                 @format_output IN (1, 2)
  910.             UNION ALL
  911.             SELECT '[dd hh:mm:ss.mss (avg)]', 3
  912.             WHERE
  913.                 @format_output IN (1, 2)
  914.                 AND @get_avg_time = 1
  915.             UNION ALL
  916.             SELECT '[avg_elapsed_time]', 4
  917.             WHERE
  918.                 @format_output = 0
  919.                 AND @get_avg_time = 1
  920.             UNION ALL
  921.             SELECT '[physical_io]', 5
  922.             WHERE
  923.                 @get_task_info = 2
  924.             UNION ALL
  925.             SELECT '[reads]', 6
  926.             UNION ALL
  927.             SELECT '[physical_reads]', 7
  928.             UNION ALL
  929.             SELECT '[writes]', 8
  930.             UNION ALL
  931.             SELECT '[tempdb_allocations]', 9
  932.             UNION ALL
  933.             SELECT '[tempdb_current]', 10
  934.             UNION ALL
  935.             SELECT '[CPU]', 11
  936.             UNION ALL
  937.             SELECT '[context_switches]', 12
  938.             WHERE
  939.                 @get_task_info = 2
  940.             UNION ALL
  941.             SELECT '[used_memory]', 13
  942.             UNION ALL
  943.             SELECT '[physical_io_delta]', 14
  944.             WHERE
  945.                 @delta_interval > 0
  946.                 AND @get_task_info = 2
  947.             UNION ALL
  948.             SELECT '[reads_delta]', 15
  949.             WHERE
  950.                 @delta_interval > 0
  951.             UNION ALL
  952.             SELECT '[physical_reads_delta]', 16
  953.             WHERE
  954.                 @delta_interval > 0
  955.             UNION ALL
  956.             SELECT '[writes_delta]', 17
  957.             WHERE
  958.                 @delta_interval > 0
  959.             UNION ALL
  960.             SELECT '[tempdb_allocations_delta]', 18
  961.             WHERE
  962.                 @delta_interval > 0
  963.             UNION ALL
  964.             SELECT '[tempdb_current_delta]', 19
  965.             WHERE
  966.                 @delta_interval > 0
  967.             UNION ALL
  968.             SELECT '[CPU_delta]', 20
  969.             WHERE
  970.                 @delta_interval > 0
  971.             UNION ALL
  972.             SELECT '[context_switches_delta]', 21
  973.             WHERE
  974.                 @delta_interval > 0
  975.                 AND @get_task_info = 2
  976.             UNION ALL
  977.             SELECT '[used_memory_delta]', 22
  978.             WHERE
  979.                 @delta_interval > 0
  980.             UNION ALL
  981.             SELECT '[tasks]', 23
  982.             WHERE
  983.                 @get_task_info = 2
  984.             UNION ALL
  985.             SELECT '[status]', 24
  986.             UNION ALL
  987.             SELECT '[wait_info]', 25
  988.             WHERE
  989.                 @get_task_info > 0
  990.                 OR @find_block_leaders = 1
  991.             UNION ALL
  992.             SELECT '[locks]', 26
  993.             WHERE
  994.                 @get_locks = 1
  995.             UNION ALL
  996.             SELECT '[tran_start_time]', 27
  997.             WHERE
  998.                 @get_transaction_info = 1
  999.             UNION ALL
  1000.             SELECT '[tran_log_writes]', 28
  1001.             WHERE
  1002.                 @get_transaction_info = 1
  1003.             UNION ALL
  1004.             SELECT '[open_tran_count]', 29
  1005.             UNION ALL
  1006.             SELECT '[sql_command]', 30
  1007.             WHERE
  1008.                 @get_outer_command = 1
  1009.             UNION ALL
  1010.             SELECT '[sql_text]', 31
  1011.             UNION ALL
  1012.             SELECT '[query_plan]', 32
  1013.             WHERE
  1014.                 @get_plans >= 1
  1015.             UNION ALL
  1016.             SELECT '[blocking_session_id]', 33
  1017.             WHERE
  1018.                 @get_task_info > 0
  1019.                 OR @find_block_leaders = 1
  1020.             UNION ALL
  1021.             SELECT '[blocked_session_count]', 34
  1022.             WHERE
  1023.                 @find_block_leaders = 1
  1024.             UNION ALL
  1025.             SELECT '[percent_complete]', 35
  1026.             UNION ALL
  1027.             SELECT '[host_name]', 36
  1028.             UNION ALL
  1029.             SELECT '[login_name]', 37
  1030.             UNION ALL
  1031.             SELECT '[database_name]', 38
  1032.             UNION ALL
  1033.             SELECT '[program_name]', 39
  1034.             UNION ALL
  1035.             SELECT '[additional_info]', 40
  1036.             WHERE
  1037.                 @get_additional_info = 1
  1038.             UNION ALL
  1039.             SELECT '[start_time]', 41
  1040.             UNION ALL
  1041.             SELECT '[login_time]', 42
  1042.             UNION ALL
  1043.             SELECT '[request_id]', 43
  1044.             UNION ALL
  1045.             SELECT '[collection_time]', 44
  1046.         ) AS x ON
  1047.             x.column_name LIKE token ESCAPE '|'
  1048.     )
  1049.     SELECT
  1050.         @output_column_list =
  1051.             STUFF
  1052.             (
  1053.                 (
  1054.                     SELECT
  1055.                         ',' + column_name as [text()]
  1056.                     FROM ordered_columns
  1057.                     WHERE
  1058.                         r = 1
  1059.                     ORDER BY
  1060.                         s
  1061.                     FOR XML
  1062.                         PATH('')
  1063.                 ),
  1064.                 1,
  1065.                 1,
  1066.                 ''
  1067.             );
  1068.    
  1069.     IF COALESCE(RTRIM(@output_column_list), '') = ''
  1070.     BEGIN;
  1071.         RAISERROR('No valid column matches found in @output_column_list or no columns remain due to selected options.', 16, 1);
  1072.         RETURN;
  1073.     END;
  1074.    
  1075.     IF @destination_table <> ''
  1076.     BEGIN;
  1077.         SET @destination_table =
  1078.             --database
  1079.             COALESCE(QUOTENAME(PARSENAME(@destination_table, 3)) + '.', '') +
  1080.             --schema
  1081.             COALESCE(QUOTENAME(PARSENAME(@destination_table, 2)) + '.', '') +
  1082.             --table
  1083.             COALESCE(QUOTENAME(PARSENAME(@destination_table, 1)), '');
  1084.            
  1085.         IF COALESCE(RTRIM(@destination_table), '') = ''
  1086.         BEGIN;
  1087.             RAISERROR('Destination table not properly formatted.', 16, 1);
  1088.             RETURN;
  1089.         END;
  1090.     END;
  1091.  
  1092.     WITH
  1093.     a0 AS
  1094.     (SELECT 1 AS n UNION ALL SELECT 1),
  1095.     a1 AS
  1096.     (SELECT 1 AS n FROM a0 AS a, a0 AS b),
  1097.     a2 AS
  1098.     (SELECT 1 AS n FROM a1 AS a, a1 AS b),
  1099.     a3 AS
  1100.     (SELECT 1 AS n FROM a2 AS a, a2 AS b),
  1101.     a4 AS
  1102.     (SELECT 1 AS n FROM a3 AS a, a3 AS b),
  1103.     numbers AS
  1104.     (
  1105.         SELECT TOP(LEN(@sort_order))
  1106.             ROW_NUMBER() OVER
  1107.             (
  1108.                 ORDER BY (SELECT NULL)
  1109.             ) AS number
  1110.         FROM a4
  1111.         ORDER BY
  1112.             number
  1113.     ),
  1114.     tokens AS
  1115.     (
  1116.         SELECT
  1117.             '|[' +
  1118.                 SUBSTRING
  1119.                 (
  1120.                     @sort_order,
  1121.                     number + 1,
  1122.                     CHARINDEX(']', @sort_order, number) - number - 1
  1123.                 ) + '|]' AS token,
  1124.             SUBSTRING
  1125.             (
  1126.                 @sort_order,
  1127.                 CHARINDEX(']', @sort_order, number) + 1,
  1128.                 COALESCE(NULLIF(CHARINDEX('[', @sort_order, CHARINDEX(']', @sort_order, number)), 0), LEN(@sort_order)) - CHARINDEX(']', @sort_order, number)
  1129.             ) AS next_chunk,
  1130.             number
  1131.         FROM numbers
  1132.         WHERE
  1133.             SUBSTRING(@sort_order, number, 1) = '['
  1134.     ),
  1135.     ordered_columns AS
  1136.     (
  1137.         SELECT
  1138.             x.column_name +
  1139.                 CASE
  1140.                     WHEN tokens.next_chunk LIKE '%asc%' THEN ' ASC'
  1141.                     WHEN tokens.next_chunk LIKE '%desc%' THEN ' DESC'
  1142.                     ELSE ''
  1143.                 END AS column_name,
  1144.             ROW_NUMBER() OVER
  1145.             (
  1146.                 PARTITION BY
  1147.                     x.column_name
  1148.                 ORDER BY
  1149.                     tokens.number
  1150.             ) AS r,
  1151.             tokens.number
  1152.         FROM tokens
  1153.         JOIN
  1154.         (
  1155.             SELECT '[session_id]' AS column_name
  1156.             UNION ALL
  1157.             SELECT '[physical_io]'
  1158.             UNION ALL
  1159.             SELECT '[reads]'
  1160.             UNION ALL
  1161.             SELECT '[physical_reads]'
  1162.             UNION ALL
  1163.             SELECT '[writes]'
  1164.             UNION ALL
  1165.             SELECT '[tempdb_allocations]'
  1166.             UNION ALL
  1167.             SELECT '[tempdb_current]'
  1168.             UNION ALL
  1169.             SELECT '[CPU]'
  1170.             UNION ALL
  1171.             SELECT '[context_switches]'
  1172.             UNION ALL
  1173.             SELECT '[used_memory]'
  1174.             UNION ALL
  1175.             SELECT '[physical_io_delta]'
  1176.             UNION ALL
  1177.             SELECT '[reads_delta]'
  1178.             UNION ALL
  1179.             SELECT '[physical_reads_delta]'
  1180.             UNION ALL
  1181.             SELECT '[writes_delta]'
  1182.             UNION ALL
  1183.             SELECT '[tempdb_allocations_delta]'
  1184.             UNION ALL
  1185.             SELECT '[tempdb_current_delta]'
  1186.             UNION ALL
  1187.             SELECT '[CPU_delta]'
  1188.             UNION ALL
  1189.             SELECT '[context_switches_delta]'
  1190.             UNION ALL
  1191.             SELECT '[used_memory_delta]'
  1192.             UNION ALL
  1193.             SELECT '[tasks]'
  1194.             UNION ALL
  1195.             SELECT '[tran_start_time]'
  1196.             UNION ALL
  1197.             SELECT '[open_tran_count]'
  1198.             UNION ALL
  1199.             SELECT '[blocking_session_id]'
  1200.             UNION ALL
  1201.             SELECT '[blocked_session_count]'
  1202.             UNION ALL
  1203.             SELECT '[percent_complete]'
  1204.             UNION ALL
  1205.             SELECT '[host_name]'
  1206.             UNION ALL
  1207.             SELECT '[login_name]'
  1208.             UNION ALL
  1209.             SELECT '[database_name]'
  1210.             UNION ALL
  1211.             SELECT '[start_time]'
  1212.             UNION ALL
  1213.             SELECT '[login_time]'
  1214.         ) AS x ON
  1215.             x.column_name LIKE token ESCAPE '|'
  1216.     )
  1217.     SELECT
  1218.         @sort_order = COALESCE(z.sort_order, '')
  1219.     FROM
  1220.     (
  1221.         SELECT
  1222.             STUFF
  1223.             (
  1224.                 (
  1225.                     SELECT
  1226.                         ',' + column_name as [text()]
  1227.                     FROM ordered_columns
  1228.                     WHERE
  1229.                         r = 1
  1230.                     ORDER BY
  1231.                         number
  1232.                     FOR XML
  1233.                         PATH('')
  1234.                 ),
  1235.                 1,
  1236.                 1,
  1237.                 ''
  1238.             ) AS sort_order
  1239.     ) AS z;
  1240.  
  1241.     CREATE TABLE #sessions
  1242.     (
  1243.         recursion SMALLINT NOT NULL,
  1244.         session_id SMALLINT NOT NULL,
  1245.         request_id INT NOT NULL,
  1246.         session_number INT NOT NULL,
  1247.         elapsed_time INT NOT NULL,
  1248.         avg_elapsed_time INT NULL,
  1249.         physical_io BIGINT NULL,
  1250.         reads BIGINT NULL,
  1251.         physical_reads BIGINT NULL,
  1252.         writes BIGINT NULL,
  1253.         tempdb_allocations BIGINT NULL,
  1254.         tempdb_current BIGINT NULL,
  1255.         CPU INT NULL,
  1256.         thread_CPU_snapshot BIGINT NULL,
  1257.         context_switches BIGINT NULL,
  1258.         used_memory BIGINT NOT NULL,
  1259.         tasks SMALLINT NULL,
  1260.         status VARCHAR(30) NOT NULL,
  1261.         wait_info NVARCHAR(4000) NULL,
  1262.         locks XML NULL,
  1263.         transaction_id BIGINT NULL,
  1264.         tran_start_time DATETIME NULL,
  1265.         tran_log_writes NVARCHAR(4000) NULL,
  1266.         open_tran_count SMALLINT NULL,
  1267.         sql_command XML NULL,
  1268.         sql_handle VARBINARY(64) NULL,
  1269.         statement_start_offset INT NULL,
  1270.         statement_end_offset INT NULL,
  1271.         sql_text XML NULL,
  1272.         plan_handle VARBINARY(64) NULL,
  1273.         query_plan XML NULL,
  1274.         blocking_session_id SMALLINT NULL,
  1275.         blocked_session_count SMALLINT NULL,
  1276.         percent_complete REAL NULL,
  1277.         host_name sysname NULL,
  1278.         login_name sysname NOT NULL,
  1279.         database_name sysname NULL,
  1280.         program_name sysname NULL,
  1281.         additional_info XML NULL,
  1282.         start_time DATETIME NOT NULL,
  1283.         login_time DATETIME NULL,
  1284.         last_request_start_time DATETIME NULL,
  1285.         PRIMARY KEY CLUSTERED (session_id, request_id, recursion) WITH (IGNORE_DUP_KEY = ON),
  1286.         UNIQUE NONCLUSTERED (transaction_id, session_id, request_id, recursion) WITH (IGNORE_DUP_KEY = ON)
  1287.     );
  1288.  
  1289.     IF @return_schema = 0
  1290.     BEGIN;
  1291.         --Disable unnecessary autostats on the table
  1292.         CREATE STATISTICS s_session_id ON #sessions (session_id)
  1293.         WITH SAMPLE 0 ROWS, NORECOMPUTE;
  1294.         CREATE STATISTICS s_request_id ON #sessions (request_id)
  1295.         WITH SAMPLE 0 ROWS, NORECOMPUTE;
  1296.         CREATE STATISTICS s_transaction_id ON #sessions (transaction_id)
  1297.         WITH SAMPLE 0 ROWS, NORECOMPUTE;
  1298.         CREATE STATISTICS s_session_number ON #sessions (session_number)
  1299.         WITH SAMPLE 0 ROWS, NORECOMPUTE;
  1300.         CREATE STATISTICS s_status ON #sessions (status)
  1301.         WITH SAMPLE 0 ROWS, NORECOMPUTE;
  1302.         CREATE STATISTICS s_start_time ON #sessions (start_time)
  1303.         WITH SAMPLE 0 ROWS, NORECOMPUTE;
  1304.         CREATE STATISTICS s_last_request_start_time ON #sessions (last_request_start_time)
  1305.         WITH SAMPLE 0 ROWS, NORECOMPUTE;
  1306.         CREATE STATISTICS s_recursion ON #sessions (recursion)
  1307.         WITH SAMPLE 0 ROWS, NORECOMPUTE;
  1308.  
  1309.         DECLARE @recursion SMALLINT;
  1310.         SET @recursion =
  1311.             CASE @delta_interval
  1312.                 WHEN 0 THEN 1
  1313.                 ELSE -1
  1314.             END;
  1315.  
  1316.         DECLARE @first_collection_ms_ticks BIGINT;
  1317.         DECLARE @last_collection_start DATETIME;
  1318.  
  1319.         --Used for the delta pull
  1320.         REDO:;
  1321.        
  1322.         IF
  1323.             @get_locks = 1
  1324.             AND @recursion = 1
  1325.             AND @output_column_list LIKE '%|[locks|]%' ESCAPE '|'
  1326.         BEGIN;
  1327.             SELECT
  1328.                 y.resource_type,
  1329.                 y.database_name,
  1330.                 y.object_id,
  1331.                 y.file_id,
  1332.                 y.page_type,
  1333.                 y.hobt_id,
  1334.                 y.allocation_unit_id,
  1335.                 y.index_id,
  1336.                 y.schema_id,
  1337.                 y.principal_id,
  1338.                 y.request_mode,
  1339.                 y.request_status,
  1340.                 y.session_id,
  1341.                 y.resource_description,
  1342.                 y.request_count,
  1343.                 s.request_id,
  1344.                 s.start_time,
  1345.                 CONVERT(sysname, NULL) AS object_name,
  1346.                 CONVERT(sysname, NULL) AS index_name,
  1347.                 CONVERT(sysname, NULL) AS schema_name,
  1348.                 CONVERT(sysname, NULL) AS principal_name,
  1349.                 CONVERT(NVARCHAR(2048), NULL) AS query_error
  1350.             INTO #locks
  1351.             FROM
  1352.             (
  1353.                 SELECT
  1354.                     sp.spid AS session_id,
  1355.                     CASE sp.status
  1356.                         WHEN 'sleeping' THEN CONVERT(INT, 0)
  1357.                         ELSE sp.request_id
  1358.                     END AS request_id,
  1359.                     CASE sp.status
  1360.                         WHEN 'sleeping' THEN sp.last_batch
  1361.                         ELSE COALESCE(req.start_time, sp.last_batch)
  1362.                     END AS start_time,
  1363.                     sp.dbid
  1364.                 FROM sys.sysprocesses AS sp
  1365.                 OUTER APPLY
  1366.                 (
  1367.                     SELECT TOP(1)
  1368.                         CASE
  1369.                             WHEN
  1370.                             (
  1371.                                 sp.hostprocess > ''
  1372.                                 OR r.total_elapsed_time < 0
  1373.                             ) THEN
  1374.                                 r.start_time
  1375.                             ELSE
  1376.                                 DATEADD
  1377.                                 (
  1378.                                     ms,
  1379.                                     1000 * (DATEPART(ms, DATEADD(second, -(r.total_elapsed_time / 1000), GETDATE())) / 500) - DATEPART(ms, DATEADD(second, -(r.total_elapsed_time / 1000), GETDATE())),
  1380.                                     DATEADD(second, -(r.total_elapsed_time / 1000), GETDATE())
  1381.                                 )
  1382.                         END AS start_time
  1383.                     FROM sys.dm_exec_requests AS r
  1384.                     WHERE
  1385.                         r.session_id = sp.spid
  1386.                         AND r.request_id = sp.request_id
  1387.                 ) AS req
  1388.                 WHERE
  1389.                     --Process inclusive filter
  1390.                     1 =
  1391.                         CASE
  1392.                             WHEN @filter <> '' THEN
  1393.                                 CASE @filter_type
  1394.                                     WHEN 'session' THEN
  1395.                                         CASE
  1396.                                             WHEN
  1397.                                                 CONVERT(SMALLINT, @filter) = 0
  1398.                                                 OR sp.spid = CONVERT(SMALLINT, @filter)
  1399.                                                     THEN 1
  1400.                                             ELSE 0
  1401.                                         END
  1402.                                     WHEN 'program' THEN
  1403.                                         CASE
  1404.                                             WHEN sp.program_name LIKE @filter THEN 1
  1405.                                             ELSE 0
  1406.                                         END
  1407.                                     WHEN 'login' THEN
  1408.                                         CASE
  1409.                                             WHEN sp.loginame LIKE @filter THEN 1
  1410.                                             ELSE 0
  1411.                                         END
  1412.                                     WHEN 'host' THEN
  1413.                                         CASE
  1414.                                             WHEN sp.hostname LIKE @filter THEN 1
  1415.                                             ELSE 0
  1416.                                         END
  1417.                                     WHEN 'database' THEN
  1418.                                         CASE
  1419.                                             WHEN DB_NAME(sp.dbid) LIKE @filter THEN 1
  1420.                                             ELSE 0
  1421.                                         END
  1422.                                     ELSE 0
  1423.                                 END
  1424.                             ELSE 1
  1425.                         END
  1426.                     --Process exclusive filter
  1427.                     AND 0 =
  1428.                         CASE
  1429.                             WHEN @not_filter <> '' THEN
  1430.                                 CASE @not_filter_type
  1431.                                     WHEN 'session' THEN
  1432.                                         CASE
  1433.                                             WHEN sp.spid = CONVERT(SMALLINT, @not_filter) THEN 1
  1434.                                             ELSE 0
  1435.                                         END
  1436.                                     WHEN 'program' THEN
  1437.                                         CASE
  1438.                                             WHEN sp.program_name LIKE @not_filter THEN 1
  1439.                                             ELSE 0
  1440.                                         END
  1441.                                     WHEN 'login' THEN
  1442.                                         CASE
  1443.                                             WHEN sp.loginame LIKE @not_filter THEN 1
  1444.                                             ELSE 0
  1445.                                         END
  1446.                                     WHEN 'host' THEN
  1447.                                         CASE
  1448.                                             WHEN sp.hostname LIKE @not_filter THEN 1
  1449.                                             ELSE 0
  1450.                                         END
  1451.                                     WHEN 'database' THEN
  1452.                                         CASE
  1453.                                             WHEN DB_NAME(sp.dbid) LIKE @not_filter THEN 1
  1454.                                             ELSE 0
  1455.                                         END
  1456.                                     ELSE 0
  1457.                                 END
  1458.                             ELSE 0
  1459.                         END
  1460.                     AND
  1461.                     (
  1462.                         @show_own_spid = 1
  1463.                         OR sp.spid <> @@SPID
  1464.                     )
  1465.                     AND
  1466.                     (
  1467.                         @show_system_spids = 1
  1468.                         OR sp.hostprocess > ''
  1469.                     )
  1470.                     AND sp.ecid = 0
  1471.             ) AS s
  1472.             INNER HASH JOIN
  1473.             (
  1474.                 SELECT
  1475.                     x.resource_type,
  1476.                     x.database_name,
  1477.                     x.object_id,
  1478.                     x.file_id,
  1479.                     CASE
  1480.                         WHEN x.page_no = 1 OR x.page_no % 8088 = 0 THEN 'PFS'
  1481.                         WHEN x.page_no = 2 OR x.page_no % 511232 = 0 THEN 'GAM'
  1482.                         WHEN x.page_no = 3 OR x.page_no % 511233 = 0 THEN 'SGAM'
  1483.                         WHEN x.page_no = 6 OR x.page_no % 511238 = 0 THEN 'DCM'
  1484.                         WHEN x.page_no = 7 OR x.page_no % 511239 = 0 THEN 'BCM'
  1485.                         WHEN x.page_no IS NOT NULL THEN '*'
  1486.                         ELSE NULL
  1487.                     END AS page_type,
  1488.                     x.hobt_id,
  1489.                     x.allocation_unit_id,
  1490.                     x.index_id,
  1491.                     x.schema_id,
  1492.                     x.principal_id,
  1493.                     x.request_mode,
  1494.                     x.request_status,
  1495.                     x.session_id,
  1496.                     x.request_id,
  1497.                     CASE
  1498.                         WHEN COALESCE(x.object_id, x.file_id, x.hobt_id, x.allocation_unit_id, x.index_id, x.schema_id, x.principal_id) IS NULL THEN NULLIF(resource_description, '')
  1499.                         ELSE NULL
  1500.                     END AS resource_description,
  1501.                     COUNT(*) AS request_count
  1502.                 FROM
  1503.                 (
  1504.                     SELECT
  1505.                         tl.resource_type +
  1506.                             CASE
  1507.                                 WHEN tl.resource_subtype = '' THEN ''
  1508.                                 ELSE '.' + tl.resource_subtype
  1509.                             END AS resource_type,
  1510.                         COALESCE(DB_NAME(tl.resource_database_id), N'(null)') AS database_name,
  1511.                         CONVERT
  1512.                         (
  1513.                             INT,
  1514.                             CASE
  1515.                                 WHEN tl.resource_type = 'OBJECT' THEN tl.resource_associated_entity_id
  1516.                                 WHEN tl.resource_description LIKE '%object_id = %' THEN
  1517.                                     (
  1518.                                         SUBSTRING
  1519.                                         (
  1520.                                             tl.resource_description,
  1521.                                             (CHARINDEX('object_id = ', tl.resource_description) + 12),
  1522.                                             COALESCE
  1523.                                             (
  1524.                                                 NULLIF
  1525.                                                 (
  1526.                                                     CHARINDEX(',', tl.resource_description, CHARINDEX('object_id = ', tl.resource_description) + 12),
  1527.                                                     0
  1528.                                                 ),
  1529.                                                 DATALENGTH(tl.resource_description)+1
  1530.                                             ) - (CHARINDEX('object_id = ', tl.resource_description) + 12)
  1531.                                         )
  1532.                                     )
  1533.                                 ELSE NULL
  1534.                             END
  1535.                         ) AS object_id,
  1536.                         CONVERT
  1537.                         (
  1538.                             INT,
  1539.                             CASE
  1540.                                 WHEN tl.resource_type = 'FILE' THEN CONVERT(INT, tl.resource_description)
  1541.                                 WHEN tl.resource_type IN ('PAGE', 'EXTENT', 'RID') THEN LEFT(tl.resource_description, CHARINDEX(':', tl.resource_description)-1)
  1542.                                 ELSE NULL
  1543.                             END
  1544.                         ) AS file_id,
  1545.                         CONVERT
  1546.                         (
  1547.                             INT,
  1548.                             CASE
  1549.                                 WHEN tl.resource_type IN ('PAGE', 'EXTENT', 'RID') THEN
  1550.                                     SUBSTRING
  1551.                                     (
  1552.                                         tl.resource_description,
  1553.                                         CHARINDEX(':', tl.resource_description) + 1,
  1554.                                         COALESCE
  1555.                                         (
  1556.                                             NULLIF
  1557.                                             (
  1558.                                                 CHARINDEX(':', tl.resource_description, CHARINDEX(':', tl.resource_description) + 1),
  1559.                                                 0
  1560.                                             ),
  1561.                                             DATALENGTH(tl.resource_description)+1
  1562.                                         ) - (CHARINDEX(':', tl.resource_description) + 1)
  1563.                                     )
  1564.                                 ELSE NULL
  1565.                             END
  1566.                         ) AS page_no,
  1567.                         CASE
  1568.                             WHEN tl.resource_type IN ('PAGE', 'KEY', 'RID', 'HOBT') THEN tl.resource_associated_entity_id
  1569.                             ELSE NULL
  1570.                         END AS hobt_id,
  1571.                         CASE
  1572.                             WHEN tl.resource_type = 'ALLOCATION_UNIT' THEN tl.resource_associated_entity_id
  1573.                             ELSE NULL
  1574.                         END AS allocation_unit_id,
  1575.                         CONVERT
  1576.                         (
  1577.                             INT,
  1578.                             CASE
  1579.                                 WHEN
  1580.                                     /*TODO: Deal with server principals*/
  1581.                                     tl.resource_subtype <> 'SERVER_PRINCIPAL'
  1582.                                     AND tl.resource_description LIKE '%index_id or stats_id = %' THEN
  1583.                                     (
  1584.                                         SUBSTRING
  1585.                                         (
  1586.                                             tl.resource_description,
  1587.                                             (CHARINDEX('index_id or stats_id = ', tl.resource_description) + 23),
  1588.                                             COALESCE
  1589.                                             (
  1590.                                                 NULLIF
  1591.                                                 (
  1592.                                                     CHARINDEX(',', tl.resource_description, CHARINDEX('index_id or stats_id = ', tl.resource_description) + 23),
  1593.                                                     0
  1594.                                                 ),
  1595.                                                 DATALENGTH(tl.resource_description)+1
  1596.                                             ) - (CHARINDEX('index_id or stats_id = ', tl.resource_description) + 23)
  1597.                                         )
  1598.                                     )
  1599.                                 ELSE NULL
  1600.                             END
  1601.                         ) AS index_id,
  1602.                         CONVERT
  1603.                         (
  1604.                             INT,
  1605.                             CASE
  1606.                                 WHEN tl.resource_description LIKE '%schema_id = %' THEN
  1607.                                     (
  1608.                                         SUBSTRING
  1609.                                         (
  1610.                                             tl.resource_description,
  1611.                                             (CHARINDEX('schema_id = ', tl.resource_description) + 12),
  1612.                                             COALESCE
  1613.                                             (
  1614.                                                 NULLIF
  1615.                                                 (
  1616.                                                     CHARINDEX(',', tl.resource_description, CHARINDEX('schema_id = ', tl.resource_description) + 12),
  1617.                                                     0
  1618.                                                 ),
  1619.                                                 DATALENGTH(tl.resource_description)+1
  1620.                                             ) - (CHARINDEX('schema_id = ', tl.resource_description) + 12)
  1621.                                         )
  1622.                                     )
  1623.                                 ELSE NULL
  1624.                             END
  1625.                         ) AS schema_id,
  1626.                         CONVERT
  1627.                         (
  1628.                             INT,
  1629.                             CASE
  1630.                                 WHEN tl.resource_description LIKE '%principal_id = %' THEN
  1631.                                     (
  1632.                                         SUBSTRING
  1633.                                         (
  1634.                                             tl.resource_description,
  1635.                                             (CHARINDEX('principal_id = ', tl.resource_description) + 15),
  1636.                                             COALESCE
  1637.                                             (
  1638.                                                 NULLIF
  1639.                                                 (
  1640.                                                     CHARINDEX(',', tl.resource_description, CHARINDEX('principal_id = ', tl.resource_description) + 15),
  1641.                                                     0
  1642.                                                 ),
  1643.                                                 DATALENGTH(tl.resource_description)+1
  1644.                                             ) - (CHARINDEX('principal_id = ', tl.resource_description) + 15)
  1645.                                         )
  1646.                                     )
  1647.                                 ELSE NULL
  1648.                             END
  1649.                         ) AS principal_id,
  1650.                         tl.request_mode,
  1651.                         tl.request_status,
  1652.                         tl.request_session_id AS session_id,
  1653.                         tl.request_request_id AS request_id,
  1654.  
  1655.                         /*TODO: Applocks, other resource_descriptions*/
  1656.                         RTRIM(tl.resource_description) AS resource_description,
  1657.                         tl.resource_associated_entity_id
  1658.                         /*********************************************/
  1659.                     FROM
  1660.                     (
  1661.                         SELECT
  1662.                             request_session_id,
  1663.                             CONVERT(VARCHAR(120), resource_type) COLLATE Latin1_General_Bin2 AS resource_type,
  1664.                             CONVERT(VARCHAR(120), resource_subtype) COLLATE Latin1_General_Bin2 AS resource_subtype,
  1665.                             resource_database_id,
  1666.                             CONVERT(VARCHAR(512), resource_description) COLLATE Latin1_General_Bin2 AS resource_description,
  1667.                             resource_associated_entity_id,
  1668.                             CONVERT(VARCHAR(120), request_mode) COLLATE Latin1_General_Bin2 AS request_mode,
  1669.                             CONVERT(VARCHAR(120), request_status) COLLATE Latin1_General_Bin2 AS request_status,
  1670.                             request_request_id
  1671.                         FROM sys.dm_tran_locks
  1672.                     ) AS tl
  1673.                 ) AS x
  1674.                 GROUP BY
  1675.                     x.resource_type,
  1676.                     x.database_name,
  1677.                     x.object_id,
  1678.                     x.file_id,
  1679.                     CASE
  1680.                         WHEN x.page_no = 1 OR x.page_no % 8088 = 0 THEN 'PFS'
  1681.                         WHEN x.page_no = 2 OR x.page_no % 511232 = 0 THEN 'GAM'
  1682.                         WHEN x.page_no = 3 OR x.page_no % 511233 = 0 THEN 'SGAM'
  1683.                         WHEN x.page_no = 6 OR x.page_no % 511238 = 0 THEN 'DCM'
  1684.                         WHEN x.page_no = 7 OR x.page_no % 511239 = 0 THEN 'BCM'
  1685.                         WHEN x.page_no IS NOT NULL THEN '*'
  1686.                         ELSE NULL
  1687.                     END,
  1688.                     x.hobt_id,
  1689.                     x.allocation_unit_id,
  1690.                     x.index_id,
  1691.                     x.schema_id,
  1692.                     x.principal_id,
  1693.                     x.request_mode,
  1694.                     x.request_status,
  1695.                     x.session_id,
  1696.                     x.request_id,
  1697.                     CASE
  1698.                         WHEN COALESCE(x.object_id, x.file_id, x.hobt_id, x.allocation_unit_id, x.index_id, x.schema_id, x.principal_id) IS NULL THEN NULLIF(resource_description, '')
  1699.                         ELSE NULL
  1700.                     END
  1701.             ) AS y ON
  1702.                 y.session_id = s.session_id
  1703.                 AND y.request_id = s.request_id
  1704.             OPTION (HASH GROUP);
  1705.  
  1706.             --Disable unnecessary autostats on the table
  1707.             CREATE STATISTICS s_database_name ON #locks (database_name)
  1708.             WITH SAMPLE 0 ROWS, NORECOMPUTE;
  1709.             CREATE STATISTICS s_object_id ON #locks (object_id)
  1710.             WITH SAMPLE 0 ROWS, NORECOMPUTE;
  1711.             CREATE STATISTICS s_hobt_id ON #locks (hobt_id)
  1712.             WITH SAMPLE 0 ROWS, NORECOMPUTE;
  1713.             CREATE STATISTICS s_allocation_unit_id ON #locks (allocation_unit_id)
  1714.             WITH SAMPLE 0 ROWS, NORECOMPUTE;
  1715.             CREATE STATISTICS s_index_id ON #locks (index_id)
  1716.             WITH SAMPLE 0 ROWS, NORECOMPUTE;
  1717.             CREATE STATISTICS s_schema_id ON #locks (schema_id)
  1718.             WITH SAMPLE 0 ROWS, NORECOMPUTE;
  1719.             CREATE STATISTICS s_principal_id ON #locks (principal_id)
  1720.             WITH SAMPLE 0 ROWS, NORECOMPUTE;
  1721.             CREATE STATISTICS s_request_id ON #locks (request_id)
  1722.             WITH SAMPLE 0 ROWS, NORECOMPUTE;
  1723.             CREATE STATISTICS s_start_time ON #locks (start_time)
  1724.             WITH SAMPLE 0 ROWS, NORECOMPUTE;
  1725.             CREATE STATISTICS s_resource_type ON #locks (resource_type)
  1726.             WITH SAMPLE 0 ROWS, NORECOMPUTE;
  1727.             CREATE STATISTICS s_object_name ON #locks (object_name)
  1728.             WITH SAMPLE 0 ROWS, NORECOMPUTE;
  1729.             CREATE STATISTICS s_schema_name ON #locks (schema_name)
  1730.             WITH SAMPLE 0 ROWS, NORECOMPUTE;
  1731.             CREATE STATISTICS s_page_type ON #locks (page_type)
  1732.             WITH SAMPLE 0 ROWS, NORECOMPUTE;
  1733.             CREATE STATISTICS s_request_mode ON #locks (request_mode)
  1734.             WITH SAMPLE 0 ROWS, NORECOMPUTE;
  1735.             CREATE STATISTICS s_request_status ON #locks (request_status)
  1736.             WITH SAMPLE 0 ROWS, NORECOMPUTE;
  1737.             CREATE STATISTICS s_resource_description ON #locks (resource_description)
  1738.             WITH SAMPLE 0 ROWS, NORECOMPUTE;
  1739.             CREATE STATISTICS s_index_name ON #locks (index_name)
  1740.             WITH SAMPLE 0 ROWS, NORECOMPUTE;
  1741.             CREATE STATISTICS s_principal_name ON #locks (principal_name)
  1742.             WITH SAMPLE 0 ROWS, NORECOMPUTE;
  1743.         END;
  1744.        
  1745.         DECLARE
  1746.             @sql VARCHAR(MAX),
  1747.             @sql_n NVARCHAR(MAX);
  1748.  
  1749.         SET @sql =
  1750.             CONVERT(VARCHAR(MAX), '') +
  1751.             'DECLARE @blocker BIT;
  1752.             SET @blocker = 0;
  1753.             DECLARE @i INT;
  1754.             SET @i = 2147483647;
  1755.  
  1756.             DECLARE @sessions TABLE
  1757.             (
  1758.                 session_id SMALLINT NOT NULL,
  1759.                 request_id INT NOT NULL,
  1760.                 login_time DATETIME,
  1761.                 last_request_end_time DATETIME,
  1762.                 status VARCHAR(30),
  1763.                 statement_start_offset INT,
  1764.                 statement_end_offset INT,
  1765.                 sql_handle BINARY(20),
  1766.                 host_name NVARCHAR(128),
  1767.                 login_name NVARCHAR(128),
  1768.                 program_name NVARCHAR(128),
  1769.                 database_id SMALLINT,
  1770.                 memory_usage INT,
  1771.                 open_tran_count SMALLINT,
  1772.                 ' +
  1773.                 CASE
  1774.                     WHEN
  1775.                     (
  1776.                         @get_task_info <> 0
  1777.                         OR @find_block_leaders = 1
  1778.                     ) THEN
  1779.                         'wait_type NVARCHAR(32),
  1780.                         wait_resource NVARCHAR(256),
  1781.                         wait_time BIGINT,
  1782.                         '
  1783.                     ELSE
  1784.                         ''
  1785.                 END +
  1786.                 'blocked SMALLINT,
  1787.                 is_user_process BIT,
  1788.                 cmd VARCHAR(32),
  1789.                 PRIMARY KEY CLUSTERED (session_id, request_id) WITH (IGNORE_DUP_KEY = ON)
  1790.             );
  1791.  
  1792.             DECLARE @blockers TABLE
  1793.             (
  1794.                 session_id INT NOT NULL PRIMARY KEY
  1795.             );
  1796.  
  1797.             BLOCKERS:;
  1798.  
  1799.             INSERT @sessions
  1800.             (
  1801.                 session_id,
  1802.                 request_id,
  1803.                 login_time,
  1804.                 last_request_end_time,
  1805.                 status,
  1806.                 statement_start_offset,
  1807.                 statement_end_offset,
  1808.                 sql_handle,
  1809.                 host_name,
  1810.                 login_name,
  1811.                 program_name,
  1812.                 database_id,
  1813.                 memory_usage,
  1814.                 open_tran_count,
  1815.                 ' +
  1816.                 CASE
  1817.                     WHEN
  1818.                     (
  1819.                         @get_task_info <> 0
  1820.                         OR @find_block_leaders = 1
  1821.                     ) THEN
  1822.                         'wait_type,
  1823.                         wait_resource,
  1824.                         wait_time,
  1825.                         '
  1826.                     ELSE
  1827.                         ''
  1828.                 END +
  1829.                 'blocked,
  1830.                 is_user_process,
  1831.                 cmd
  1832.             )
  1833.             SELECT TOP(@i)
  1834.                 spy.session_id,
  1835.                 spy.request_id,
  1836.                 spy.login_time,
  1837.                 spy.last_request_end_time,
  1838.                 spy.status,
  1839.                 spy.statement_start_offset,
  1840.                 spy.statement_end_offset,
  1841.                 spy.sql_handle,
  1842.                 spy.host_name,
  1843.                 spy.login_name,
  1844.                 spy.program_name,
  1845.                 spy.database_id,
  1846.                 spy.memory_usage,
  1847.                 spy.open_tran_count,
  1848.                 ' +
  1849.                 CASE
  1850.                     WHEN
  1851.                     (
  1852.                         @get_task_info <> 0  
  1853.                         OR @find_block_leaders = 1
  1854.                     ) THEN
  1855.                         'spy.wait_type,
  1856.                         CASE
  1857.                             WHEN
  1858.                                 spy.wait_type LIKE N''PAGE%LATCH_%''
  1859.                                 OR spy.wait_type = N''CXPACKET''
  1860.                                 OR spy.wait_type LIKE N''LATCH[_]%''
  1861.                                 OR spy.wait_type = N''OLEDB'' THEN
  1862.                                     spy.wait_resource
  1863.                             ELSE
  1864.                                 NULL
  1865.                         END AS wait_resource,
  1866.                         spy.wait_time,
  1867.                         '
  1868.                     ELSE
  1869.                         ''
  1870.                 END +
  1871.                 'spy.blocked,
  1872.                 spy.is_user_process,
  1873.                 spy.cmd
  1874.             FROM
  1875.             (
  1876.                 SELECT TOP(@i)
  1877.                     spx.*,
  1878.                     ' +
  1879.                     CASE
  1880.                         WHEN
  1881.                         (
  1882.                             @get_task_info <> 0
  1883.                             OR @find_block_leaders = 1
  1884.                         ) THEN
  1885.                             'ROW_NUMBER() OVER
  1886.                             (
  1887.                                 PARTITION BY
  1888.                                     spx.session_id,
  1889.                                     spx.request_id
  1890.                                 ORDER BY
  1891.                                     CASE
  1892.                                         WHEN spx.wait_type LIKE N''LCK[_]%'' THEN
  1893.                                             1
  1894.                                         ELSE
  1895.                                             99
  1896.                                     END,
  1897.                                     spx.wait_time DESC,
  1898.                                     spx.blocked DESC
  1899.                             ) AS r
  1900.                             '
  1901.                         ELSE
  1902.                             '1 AS r
  1903.                             '
  1904.                     END +
  1905.                 'FROM
  1906.                 (
  1907.                     SELECT TOP(@i)
  1908.                         sp0.session_id,
  1909.                         sp0.request_id,
  1910.                         sp0.login_time,
  1911.                         sp0.last_request_end_time,
  1912.                         LOWER(sp0.status) AS status,
  1913.                         CASE
  1914.                             WHEN sp0.cmd = ''CREATE INDEX'' THEN
  1915.                                 0
  1916.                             ELSE
  1917.                                 sp0.stmt_start
  1918.                         END AS statement_start_offset,
  1919.                         CASE
  1920.                             WHEN sp0.cmd = N''CREATE INDEX'' THEN
  1921.                                 -1
  1922.                             ELSE
  1923.                                 COALESCE(NULLIF(sp0.stmt_end, 0), -1)
  1924.                         END AS statement_end_offset,
  1925.                         sp0.sql_handle,
  1926.                         sp0.host_name,
  1927.                         sp0.login_name,
  1928.                         sp0.program_name,
  1929.                         sp0.database_id,
  1930.                         sp0.memory_usage,
  1931.                         sp0.open_tran_count,
  1932.                         ' +
  1933.                         CASE
  1934.                             WHEN
  1935.                             (
  1936.                                 @get_task_info <> 0
  1937.                                 OR @find_block_leaders = 1
  1938.                             ) THEN
  1939.                                 'CASE
  1940.                                     WHEN sp0.wait_time > 0 AND sp0.wait_type <> N''CXPACKET'' THEN
  1941.                                         sp0.wait_type
  1942.                                     ELSE
  1943.                                         NULL
  1944.                                 END AS wait_type,
  1945.                                 CASE
  1946.                                     WHEN sp0.wait_time > 0 AND sp0.wait_type <> N''CXPACKET'' THEN
  1947.                                         sp0.wait_resource
  1948.                                     ELSE
  1949.                                         NULL
  1950.                                 END AS wait_resource,
  1951.                                 CASE
  1952.                                     WHEN sp0.wait_type <> N''CXPACKET'' THEN
  1953.                                         sp0.wait_time
  1954.                                     ELSE
  1955.                                         0
  1956.                                 END AS wait_time,
  1957.                                 '
  1958.                             ELSE
  1959.                                 ''
  1960.                         END +
  1961.                         'sp0.blocked,
  1962.                         sp0.is_user_process,
  1963.                         sp0.cmd
  1964.                     FROM
  1965.                     (
  1966.                         SELECT TOP(@i)
  1967.                             sp1.session_id,
  1968.                             sp1.request_id,
  1969.                             sp1.login_time,
  1970.                             sp1.last_request_end_time,
  1971.                             sp1.status,
  1972.                             sp1.cmd,
  1973.                             sp1.stmt_start,
  1974.                             sp1.stmt_end,
  1975.                             MAX(NULLIF(sp1.sql_handle, 0x00)) OVER (PARTITION BY sp1.session_id, sp1.request_id) AS sql_handle,
  1976.                             sp1.host_name,
  1977.                             MAX(sp1.login_name) OVER (PARTITION BY sp1.session_id, sp1.request_id) AS login_name,
  1978.                             sp1.program_name,
  1979.                             sp1.database_id,
  1980.                             MAX(sp1.memory_usage)  OVER (PARTITION BY sp1.session_id, sp1.request_id) AS memory_usage,
  1981.                             MAX(sp1.open_tran_count)  OVER (PARTITION BY sp1.session_id, sp1.request_id) AS open_tran_count,
  1982.                             sp1.wait_type,
  1983.                             sp1.wait_resource,
  1984.                             sp1.wait_time,
  1985.                             sp1.blocked,
  1986.                             sp1.hostprocess,
  1987.                             sp1.is_user_process
  1988.                         FROM
  1989.                         (
  1990.                             SELECT TOP(@i)
  1991.                                 sp2.spid AS session_id,
  1992.                                 CASE sp2.status
  1993.                                     WHEN ''sleeping'' THEN
  1994.                                         CONVERT(INT, 0)
  1995.                                     ELSE
  1996.                                         sp2.request_id
  1997.                                 END AS request_id,
  1998.                                 MAX(sp2.login_time) AS login_time,
  1999.                                 MAX(sp2.last_batch) AS last_request_end_time,
  2000.                                 MAX(CONVERT(VARCHAR(30), RTRIM(sp2.status)) COLLATE Latin1_General_Bin2) AS status,
  2001.                                 MAX(CONVERT(VARCHAR(32), RTRIM(sp2.cmd)) COLLATE Latin1_General_Bin2) AS cmd,
  2002.                                 MAX(sp2.stmt_start) AS stmt_start,
  2003.                                 MAX(sp2.stmt_end) AS stmt_end,
  2004.                                 MAX(sp2.sql_handle) AS sql_handle,
  2005.                                 MAX(CONVERT(sysname, RTRIM(sp2.hostname)) COLLATE SQL_Latin1_General_CP1_CI_AS) AS host_name,
  2006.                                 MAX(CONVERT(sysname, RTRIM(sp2.loginame)) COLLATE SQL_Latin1_General_CP1_CI_AS) AS login_name,
  2007.                                 MAX
  2008.                                 (
  2009.                                     CASE
  2010.                                         WHEN blk.queue_id IS NOT NULL THEN
  2011.                                             N''Service Broker
  2012.                                                 database_id: '' + CONVERT(NVARCHAR, blk.database_id) +
  2013.                                                 N'' queue_id: '' + CONVERT(NVARCHAR, blk.queue_id)
  2014.                                         ELSE
  2015.                                             CONVERT
  2016.                                             (
  2017.                                                 sysname,
  2018.                                                 RTRIM(sp2.program_name)
  2019.                                             )
  2020.                                     END COLLATE SQL_Latin1_General_CP1_CI_AS
  2021.                                 ) AS program_name,
  2022.                                 MAX(sp2.dbid) AS database_id,
  2023.                                 MAX(sp2.memusage) AS memory_usage,
  2024.                                 MAX(sp2.open_tran) AS open_tran_count,
  2025.                                 RTRIM(sp2.lastwaittype) AS wait_type,
  2026.                                 RTRIM(sp2.waitresource) AS wait_resource,
  2027.                                 MAX(sp2.waittime) AS wait_time,
  2028.                                 COALESCE(NULLIF(sp2.blocked, sp2.spid), 0) AS blocked,
  2029.                                 MAX
  2030.                                 (
  2031.                                     CASE
  2032.                                         WHEN blk.session_id = sp2.spid THEN
  2033.                                             ''blocker''
  2034.                                         ELSE
  2035.                                             RTRIM(sp2.hostprocess)
  2036.                                     END
  2037.                                 ) AS hostprocess,
  2038.                                 CONVERT
  2039.                                 (
  2040.                                     BIT,
  2041.                                     MAX
  2042.                                     (
  2043.                                         CASE
  2044.                                             WHEN sp2.hostprocess > '''' THEN
  2045.                                                 1
  2046.                                             ELSE
  2047.                                                 0
  2048.                                         END
  2049.                                     )
  2050.                                 ) AS is_user_process
  2051.                             FROM
  2052.                             (
  2053.                                 SELECT TOP(@i)
  2054.                                     session_id,
  2055.                                     CONVERT(INT, NULL) AS queue_id,
  2056.                                     CONVERT(INT, NULL) AS database_id
  2057.                                 FROM @blockers
  2058.  
  2059.                                 UNION ALL
  2060.  
  2061.                                 SELECT TOP(@i)
  2062.                                     CONVERT(SMALLINT, 0),
  2063.                                     CONVERT(INT, NULL) AS queue_id,
  2064.                                     CONVERT(INT, NULL) AS database_id
  2065.                                 WHERE
  2066.                                     @blocker = 0
  2067.  
  2068.                                 UNION ALL
  2069.  
  2070.                                 SELECT TOP(@i)
  2071.                                     CONVERT(SMALLINT, spid),
  2072.                                     queue_id,
  2073.                                     database_id
  2074.                                 FROM sys.dm_broker_activated_tasks
  2075.                                 WHERE
  2076.                                     @blocker = 0
  2077.                             ) AS blk
  2078.                             INNER JOIN sys.sysprocesses AS sp2 ON
  2079.                                 sp2.spid = blk.session_id
  2080.                                 OR
  2081.                                 (
  2082.                                     blk.session_id = 0
  2083.                                     AND @blocker = 0
  2084.                                 )
  2085.                             ' +
  2086.                             CASE
  2087.                                 WHEN
  2088.                                 (
  2089.                                     @get_task_info = 0
  2090.                                     AND @find_block_leaders = 0
  2091.                                 ) THEN
  2092.                                     'WHERE
  2093.                                         sp2.ecid = 0
  2094.                                     '
  2095.                                 ELSE
  2096.                                     ''
  2097.                             END +
  2098.                             'GROUP BY
  2099.                                 sp2.spid,
  2100.                                 CASE sp2.status
  2101.                                     WHEN ''sleeping'' THEN
  2102.                                         CONVERT(INT, 0)
  2103.                                     ELSE
  2104.                                         sp2.request_id
  2105.                                 END,
  2106.                                 RTRIM(sp2.lastwaittype),
  2107.                                 RTRIM(sp2.waitresource),
  2108.                                 COALESCE(NULLIF(sp2.blocked, sp2.spid), 0)
  2109.                         ) AS sp1
  2110.                     ) AS sp0
  2111.                     WHERE
  2112.                         @blocker = 1
  2113.                         OR
  2114.                         (1=1
  2115.                         ' +
  2116.                             --inclusive filter
  2117.                             CASE
  2118.                                 WHEN @filter <> '' THEN
  2119.                                     CASE @filter_type
  2120.                                         WHEN 'session' THEN
  2121.                                             CASE
  2122.                                                 WHEN CONVERT(SMALLINT, @filter) <> 0 THEN
  2123.                                                     'AND sp0.session_id = CONVERT(SMALLINT, @filter)
  2124.                                                     '
  2125.                                                 ELSE
  2126.                                                     ''
  2127.                                             END
  2128.                                         WHEN 'program' THEN
  2129.                                             'AND sp0.program_name LIKE @filter
  2130.                                             '
  2131.                                         WHEN 'login' THEN
  2132.                                             'AND sp0.login_name LIKE @filter
  2133.                                             '
  2134.                                         WHEN 'host' THEN
  2135.                                             'AND sp0.host_name LIKE @filter
  2136.                                             '
  2137.                                         WHEN 'database' THEN
  2138.                                             'AND DB_NAME(sp0.database_id) LIKE @filter
  2139.                                             '
  2140.                                         ELSE
  2141.                                             ''
  2142.                                     END
  2143.                                 ELSE
  2144.                                     ''
  2145.                             END +
  2146.                             --exclusive filter
  2147.                             CASE
  2148.                                 WHEN @not_filter <> '' THEN
  2149.                                     CASE @not_filter_type
  2150.                                         WHEN 'session' THEN
  2151.                                             CASE
  2152.                                                 WHEN CONVERT(SMALLINT, @not_filter) <> 0 THEN
  2153.                                                     'AND sp0.session_id <> CONVERT(SMALLINT, @not_filter)
  2154.                                                     '
  2155.                                                 ELSE
  2156.                                                     ''
  2157.                                             END
  2158.                                         WHEN 'program' THEN
  2159.                                             'AND sp0.program_name NOT LIKE @not_filter
  2160.                                             '
  2161.                                         WHEN 'login' THEN
  2162.                                             'AND sp0.login_name NOT LIKE @not_filter
  2163.                                             '
  2164.                                         WHEN 'host' THEN
  2165.                                             'AND sp0.host_name NOT LIKE @not_filter
  2166.                                             '
  2167.                                         WHEN 'database' THEN
  2168.                                             'AND DB_NAME(sp0.database_id) NOT LIKE @not_filter
  2169.                                             '
  2170.                                         ELSE
  2171.                                             ''
  2172.                                     END
  2173.                                 ELSE
  2174.                                     ''
  2175.                             END +
  2176.                             CASE @show_own_spid
  2177.                                 WHEN 1 THEN
  2178.                                     ''
  2179.                                 ELSE
  2180.                                     'AND sp0.session_id <> @@spid
  2181.                                     '
  2182.                             END +
  2183.                             CASE
  2184.                                 WHEN @show_system_spids = 0 THEN
  2185.                                     'AND sp0.hostprocess > ''''
  2186.                                     '
  2187.                                 ELSE
  2188.                                     ''
  2189.                             END +
  2190.                             CASE @show_sleeping_spids
  2191.                                 WHEN 0 THEN
  2192.                                     'AND sp0.status <> ''sleeping''
  2193.                                     '
  2194.                                 WHEN 1 THEN
  2195.                                     'AND
  2196.                                     (
  2197.                                         sp0.status <> ''sleeping''
  2198.                                         OR sp0.open_tran_count > 0
  2199.                                     )
  2200.                                     '
  2201.                                 ELSE
  2202.                                     ''
  2203.                             END +
  2204.                         ')
  2205.                 ) AS spx
  2206.             ) AS spy
  2207.             WHERE
  2208.                 spy.r = 1;
  2209.             ' +
  2210.             CASE @recursion
  2211.                 WHEN 1 THEN
  2212.                     'IF @@ROWCOUNT > 0
  2213.                     BEGIN;
  2214.                         INSERT @blockers
  2215.                         (
  2216.                             session_id
  2217.                         )
  2218.                         SELECT TOP(@i)
  2219.                             blocked
  2220.                         FROM @sessions
  2221.                         WHERE
  2222.                             NULLIF(blocked, 0) IS NOT NULL
  2223.  
  2224.                         EXCEPT
  2225.  
  2226.                         SELECT TOP(@i)
  2227.                             session_id
  2228.                         FROM @sessions;
  2229.                         ' +
  2230.  
  2231.                         CASE
  2232.                             WHEN
  2233.                             (
  2234.                                 @get_task_info > 0
  2235.                                 OR @find_block_leaders = 1
  2236.                             ) THEN
  2237.                                 'IF @@ROWCOUNT > 0
  2238.                                 BEGIN;
  2239.                                     SET @blocker = 1;
  2240.                                     GOTO BLOCKERS;
  2241.                                 END;
  2242.                                 '
  2243.                             ELSE
  2244.                                 ''
  2245.                         END +
  2246.                     'END;
  2247.                     '
  2248.                 ELSE
  2249.                     ''
  2250.             END +
  2251.             'SELECT TOP(@i)
  2252.                 @recursion AS recursion,
  2253.                 x.session_id,
  2254.                 x.request_id,
  2255.                 DENSE_RANK() OVER
  2256.                 (
  2257.                     ORDER BY
  2258.                         x.session_id
  2259.                 ) AS session_number,
  2260.                 ' +
  2261.                 CASE
  2262.                     WHEN @output_column_list LIKE '%|[dd hh:mm:ss.mss|]%' ESCAPE '|' THEN
  2263.                         'x.elapsed_time '
  2264.                     ELSE
  2265.                         '0 '
  2266.                 END +
  2267.                     'AS elapsed_time,
  2268.                     ' +
  2269.                 CASE
  2270.                     WHEN
  2271.                         (
  2272.                             @output_column_list LIKE '%|[dd hh:mm:ss.mss (avg)|]%' ESCAPE '|' OR
  2273.                             @output_column_list LIKE '%|[avg_elapsed_time|]%' ESCAPE '|'
  2274.                         )
  2275.                         AND @recursion = 1
  2276.                             THEN
  2277.                                 'x.avg_elapsed_time / 1000 '
  2278.                     ELSE
  2279.                         'NULL '
  2280.                 END +
  2281.                     'AS avg_elapsed_time,
  2282.                     ' +
  2283.                 CASE
  2284.                     WHEN
  2285.                         @output_column_list LIKE '%|[physical_io|]%' ESCAPE '|'
  2286.                         OR @output_column_list LIKE '%|[physical_io_delta|]%' ESCAPE '|'
  2287.                             THEN
  2288.                                 'x.physical_io '
  2289.                     ELSE
  2290.                         'NULL '
  2291.                 END +
  2292.                     'AS physical_io,
  2293.                     ' +
  2294.                 CASE
  2295.                     WHEN
  2296.                         @output_column_list LIKE '%|[reads|]%' ESCAPE '|'
  2297.                         OR @output_column_list LIKE '%|[reads_delta|]%' ESCAPE '|'
  2298.                             THEN
  2299.                                 'x.reads '
  2300.                     ELSE
  2301.                         '0 '
  2302.                 END +
  2303.                     'AS reads,
  2304.                     ' +
  2305.                 CASE
  2306.                     WHEN
  2307.                         @output_column_list LIKE '%|[physical_reads|]%' ESCAPE '|'
  2308.                         OR @output_column_list LIKE '%|[physical_reads_delta|]%' ESCAPE '|'
  2309.                             THEN
  2310.                                 'x.physical_reads '
  2311.                     ELSE
  2312.                         '0 '
  2313.                 END +
  2314.                     'AS physical_reads,
  2315.                     ' +
  2316.                 CASE
  2317.                     WHEN
  2318.                         @output_column_list LIKE '%|[writes|]%' ESCAPE '|'
  2319.                         OR @output_column_list LIKE '%|[writes_delta|]%' ESCAPE '|'
  2320.                             THEN
  2321.                                 'x.writes '
  2322.                     ELSE
  2323.                         '0 '
  2324.                 END +
  2325.                     'AS writes,
  2326.                     ' +
  2327.                 CASE
  2328.                     WHEN
  2329.                         @output_column_list LIKE '%|[tempdb_allocations|]%' ESCAPE '|'
  2330.                         OR @output_column_list LIKE '%|[tempdb_allocations_delta|]%' ESCAPE '|'
  2331.                             THEN
  2332.                                 'x.tempdb_allocations '
  2333.                     ELSE
  2334.                         '0 '
  2335.                 END +
  2336.                     'AS tempdb_allocations,
  2337.                     ' +
  2338.                 CASE
  2339.                     WHEN
  2340.                         @output_column_list LIKE '%|[tempdb_current|]%' ESCAPE '|'
  2341.                         OR @output_column_list LIKE '%|[tempdb_current_delta|]%' ESCAPE '|'
  2342.                             THEN
  2343.                                 'x.tempdb_current '
  2344.                     ELSE
  2345.                         '0 '
  2346.                 END +
  2347.                     'AS tempdb_current,
  2348.                     ' +
  2349.                 CASE
  2350.                     WHEN
  2351.                         @output_column_list LIKE '%|[CPU|]%' ESCAPE '|'
  2352.                         OR @output_column_list LIKE '%|[CPU_delta|]%' ESCAPE '|'
  2353.                             THEN
  2354.                                 'x.CPU '
  2355.                     ELSE
  2356.                         '0 '
  2357.                 END +
  2358.                     'AS CPU,
  2359.                     ' +
  2360.                 CASE
  2361.                     WHEN
  2362.                         @output_column_list LIKE '%|[CPU_delta|]%' ESCAPE '|'
  2363.                         AND @get_task_info = 2
  2364.                             THEN
  2365.                                 'x.thread_CPU_snapshot '
  2366.                     ELSE
  2367.                         '0 '
  2368.                 END +
  2369.                     'AS thread_CPU_snapshot,
  2370.                     ' +
  2371.                 CASE
  2372.                     WHEN
  2373.                         @output_column_list LIKE '%|[context_switches|]%' ESCAPE '|'
  2374.                         OR @output_column_list LIKE '%|[context_switches_delta|]%' ESCAPE '|'
  2375.                             THEN
  2376.                                 'x.context_switches '
  2377.                     ELSE
  2378.                         'NULL '
  2379.                 END +
  2380.                     'AS context_switches,
  2381.                     ' +
  2382.                 CASE
  2383.                     WHEN
  2384.                         @output_column_list LIKE '%|[used_memory|]%' ESCAPE '|'
  2385.                         OR @output_column_list LIKE '%|[used_memory_delta|]%' ESCAPE '|'
  2386.                             THEN
  2387.                                 'x.used_memory '
  2388.                     ELSE
  2389.                         '0 '
  2390.                 END +
  2391.                     'AS used_memory,
  2392.                     ' +
  2393.                 CASE
  2394.                     WHEN
  2395.                         @output_column_list LIKE '%|[tasks|]%' ESCAPE '|'
  2396.                         AND @recursion = 1
  2397.                             THEN
  2398.                                 'x.tasks '
  2399.                     ELSE
  2400.                         'NULL '
  2401.                 END +
  2402.                     'AS tasks,
  2403.                     ' +
  2404.                 CASE
  2405.                     WHEN
  2406.                         (
  2407.                             @output_column_list LIKE '%|[status|]%' ESCAPE '|'
  2408.                             OR @output_column_list LIKE '%|[sql_command|]%' ESCAPE '|'
  2409.                         )
  2410.                         AND @recursion = 1
  2411.                             THEN
  2412.                                 'x.status '
  2413.                     ELSE
  2414.                         ''''' '
  2415.                 END +
  2416.                     'AS status,
  2417.                     ' +
  2418.                 CASE
  2419.                     WHEN
  2420.                         @output_column_list LIKE '%|[wait_info|]%' ESCAPE '|'
  2421.                         AND @recursion = 1
  2422.                             THEN
  2423.                                 CASE @get_task_info
  2424.                                     WHEN 2 THEN
  2425.                                         'COALESCE(x.task_wait_info, x.sys_wait_info) '
  2426.                                     ELSE
  2427.                                         'x.sys_wait_info '
  2428.                                 END
  2429.                     ELSE
  2430.                         'NULL '
  2431.                 END +
  2432.                     'AS wait_info,
  2433.                     ' +
  2434.                 CASE
  2435.                     WHEN
  2436.                         (
  2437.                             @output_column_list LIKE '%|[tran_start_time|]%' ESCAPE '|'
  2438.                             OR @output_column_list LIKE '%|[tran_log_writes|]%' ESCAPE '|'
  2439.                         )
  2440.                         AND @recursion = 1
  2441.                             THEN
  2442.                                 'x.transaction_id '
  2443.                     ELSE
  2444.                         'NULL '
  2445.                 END +
  2446.                     'AS transaction_id,
  2447.                     ' +
  2448.                 CASE
  2449.                     WHEN
  2450.                         @output_column_list LIKE '%|[open_tran_count|]%' ESCAPE '|'
  2451.                         AND @recursion = 1
  2452.                             THEN
  2453.                                 'x.open_tran_count '
  2454.                     ELSE
  2455.                         'NULL '
  2456.                 END +
  2457.                     'AS open_tran_count,
  2458.                     ' +
  2459.                 CASE
  2460.                     WHEN
  2461.                         @output_column_list LIKE '%|[sql_text|]%' ESCAPE '|'
  2462.                         AND @recursion = 1
  2463.                             THEN
  2464.                                 'x.sql_handle '
  2465.                     ELSE
  2466.                         'NULL '
  2467.                 END +
  2468.                     'AS sql_handle,
  2469.                     ' +
  2470.                 CASE
  2471.                     WHEN
  2472.                         (
  2473.                             @output_column_list LIKE '%|[sql_text|]%' ESCAPE '|'
  2474.                             OR @output_column_list LIKE '%|[query_plan|]%' ESCAPE '|'
  2475.                         )
  2476.                         AND @recursion = 1
  2477.                             THEN
  2478.                                 'x.statement_start_offset '
  2479.                     ELSE
  2480.                         'NULL '
  2481.                 END +
  2482.                     'AS statement_start_offset,
  2483.                     ' +
  2484.                 CASE
  2485.                     WHEN
  2486.                         (
  2487.                             @output_column_list LIKE '%|[sql_text|]%' ESCAPE '|'
  2488.                             OR @output_column_list LIKE '%|[query_plan|]%' ESCAPE '|'
  2489.                         )
  2490.                         AND @recursion = 1
  2491.                             THEN
  2492.                                 'x.statement_end_offset '
  2493.                     ELSE
  2494.                         'NULL '
  2495.                 END +
  2496.                     'AS statement_end_offset,
  2497.                     ' +
  2498.                 'NULL AS sql_text,
  2499.                     ' +
  2500.                 CASE
  2501.                     WHEN
  2502.                         @output_column_list LIKE '%|[query_plan|]%' ESCAPE '|'
  2503.                         AND @recursion = 1
  2504.                             THEN
  2505.                                 'x.plan_handle '
  2506.                     ELSE
  2507.                         'NULL '
  2508.                 END +
  2509.                     'AS plan_handle,
  2510.                     ' +
  2511.                 CASE
  2512.                     WHEN
  2513.                         @output_column_list LIKE '%|[blocking_session_id|]%' ESCAPE '|'
  2514.                         AND @recursion = 1
  2515.                             THEN
  2516.                                 'NULLIF(x.blocking_session_id, 0) '
  2517.                     ELSE
  2518.                         'NULL '
  2519.                 END +
  2520.                     'AS blocking_session_id,
  2521.                     ' +
  2522.                 CASE
  2523.                     WHEN
  2524.                         @output_column_list LIKE '%|[percent_complete|]%' ESCAPE '|'
  2525.                         AND @recursion = 1
  2526.                             THEN
  2527.                                 'x.percent_complete '
  2528.                     ELSE
  2529.                         'NULL '
  2530.                 END +
  2531.                     'AS percent_complete,
  2532.                     ' +
  2533.                 CASE
  2534.                     WHEN
  2535.                         @output_column_list LIKE '%|[host_name|]%' ESCAPE '|'
  2536.                         AND @recursion = 1
  2537.                             THEN
  2538.                                 'x.host_name '
  2539.                     ELSE
  2540.                         ''''' '
  2541.                 END +
  2542.                     'AS host_name,
  2543.                     ' +
  2544.                 CASE
  2545.                     WHEN
  2546.                         @output_column_list LIKE '%|[login_name|]%' ESCAPE '|'
  2547.                         AND @recursion = 1
  2548.                             THEN
  2549.                                 'x.login_name '
  2550.                     ELSE
  2551.                         ''''' '
  2552.                 END +
  2553.                     'AS login_name,
  2554.                     ' +
  2555.                 CASE
  2556.                     WHEN
  2557.                         @output_column_list LIKE '%|[database_name|]%' ESCAPE '|'
  2558.                         AND @recursion = 1
  2559.                             THEN
  2560.                                 'DB_NAME(x.database_id) '
  2561.                     ELSE
  2562.                         'NULL '
  2563.                 END +
  2564.                     'AS database_name,
  2565.                     ' +
  2566.                 CASE
  2567.                     WHEN
  2568.                         @output_column_list LIKE '%|[program_name|]%' ESCAPE '|'
  2569.                         AND @recursion = 1
  2570.                             THEN
  2571.                                 'x.program_name '
  2572.                     ELSE
  2573.                         ''''' '
  2574.                 END +
  2575.                     'AS program_name,
  2576.                     ' +
  2577.                 CASE
  2578.                     WHEN
  2579.                         @output_column_list LIKE '%|[additional_info|]%' ESCAPE '|'
  2580.                         AND @recursion = 1
  2581.                             THEN
  2582.                                 '(
  2583.                                     SELECT TOP(@i)
  2584.                                         x.text_size,
  2585.                                         x.language,
  2586.                                         x.date_format,
  2587.                                         x.date_first,
  2588.                                         CASE x.quoted_identifier
  2589.                                             WHEN 0 THEN ''OFF''
  2590.                                             WHEN 1 THEN ''ON''
  2591.                                         END AS quoted_identifier,
  2592.                                         CASE x.arithabort
  2593.                                             WHEN 0 THEN ''OFF''
  2594.                                             WHEN 1 THEN ''ON''
  2595.                                         END AS arithabort,
  2596.                                         CASE x.ansi_null_dflt_on
  2597.                                             WHEN 0 THEN ''OFF''
  2598.                                             WHEN 1 THEN ''ON''
  2599.                                         END AS ansi_null_dflt_on,
  2600.                                         CASE x.ansi_defaults
  2601.                                             WHEN 0 THEN ''OFF''
  2602.                                             WHEN 1 THEN ''ON''
  2603.                                         END AS ansi_defaults,
  2604.                                         CASE x.ansi_warnings
  2605.                                             WHEN 0 THEN ''OFF''
  2606.                                             WHEN 1 THEN ''ON''
  2607.                                         END AS ansi_warnings,
  2608.                                         CASE x.ansi_padding
  2609.                                             WHEN 0 THEN ''OFF''
  2610.                                             WHEN 1 THEN ''ON''
  2611.                                         END AS ansi_padding,
  2612.                                         CASE ansi_nulls
  2613.                                             WHEN 0 THEN ''OFF''
  2614.                                             WHEN 1 THEN ''ON''
  2615.                                         END AS ansi_nulls,
  2616.                                         CASE x.concat_null_yields_null
  2617.                                             WHEN 0 THEN ''OFF''
  2618.                                             WHEN 1 THEN ''ON''
  2619.                                         END AS concat_null_yields_null,
  2620.                                         CASE x.transaction_isolation_level
  2621.                                             WHEN 0 THEN ''Unspecified''
  2622.                                             WHEN 1 THEN ''ReadUncomitted''
  2623.                                             WHEN 2 THEN ''ReadCommitted''
  2624.                                             WHEN 3 THEN ''Repeatable''
  2625.                                             WHEN 4 THEN ''Serializable''
  2626.                                             WHEN 5 THEN ''Snapshot''
  2627.                                         END AS transaction_isolation_level,
  2628.                                         x.lock_timeout,
  2629.                                         x.deadlock_priority,
  2630.                                         x.row_count,
  2631.                                         x.command_type,
  2632.                                         ' +
  2633.                                         CASE
  2634.                                             WHEN @output_column_list LIKE '%|[program_name|]%' ESCAPE '|' THEN
  2635.                                                 '(
  2636.                                                     SELECT TOP(1)
  2637.                                                         CONVERT(uniqueidentifier, CONVERT(XML, '''').value(''xs:hexBinary( substring(sql:column("agent_info.job_id_string"), 0) )'', ''binary(16)'')) AS job_id,
  2638.                                                         agent_info.step_id,
  2639.                                                         (
  2640.                                                             SELECT TOP(1)
  2641.                                                                 NULL
  2642.                                                             FOR XML
  2643.                                                                 PATH(''job_name''),
  2644.                                                                 TYPE
  2645.                                                         ),
  2646.                                                         (
  2647.                                                             SELECT TOP(1)
  2648.                                                                 NULL
  2649.                                                             FOR XML
  2650.                                                                 PATH(''step_name''),
  2651.                                                                 TYPE
  2652.                                                         )
  2653.                                                     FROM
  2654.                                                     (
  2655.                                                         SELECT TOP(1)
  2656.                                                             SUBSTRING(x.program_name, CHARINDEX(''0x'', x.program_name) + 2, 32) AS job_id_string,
  2657.                                                             SUBSTRING(x.program_name, CHARINDEX('': Step '', x.program_name) + 7, CHARINDEX('')'', x.program_name, CHARINDEX('': Step '', x.program_name)) - (CHARINDEX('': Step '', x.program_name) + 7)) AS step_id
  2658.                                                         WHERE
  2659.                                                             x.program_name LIKE N''SQLAgent - TSQL JobStep (Job 0x%''
  2660.                                                     ) AS agent_info
  2661.                                                     FOR XML
  2662.                                                         PATH(''agent_job_info''),
  2663.                                                         TYPE
  2664.                                                 ),
  2665.                                                 '
  2666.                                             ELSE ''
  2667.                                         END +
  2668.                                         CASE
  2669.                                             WHEN @get_task_info = 2 THEN
  2670.                                                 'CONVERT(XML, x.block_info) AS block_info,
  2671.                                                 '
  2672.                                             ELSE
  2673.                                                 ''
  2674.                                         END +
  2675.                                         'x.host_process_id
  2676.                                     FOR XML
  2677.                                         PATH(''additional_info''),
  2678.                                         TYPE
  2679.                                 ) '
  2680.                     ELSE
  2681.                         'NULL '
  2682.                 END +
  2683.                     'AS additional_info,
  2684.                 x.start_time,
  2685.                     ' +
  2686.                 CASE
  2687.                     WHEN
  2688.                         @output_column_list LIKE '%|[login_time|]%' ESCAPE '|'
  2689.                         AND @recursion = 1
  2690.                             THEN
  2691.                                 'x.login_time '
  2692.                     ELSE
  2693.                         'NULL '
  2694.                 END +
  2695.                     'AS login_time,
  2696.                 x.last_request_start_time
  2697.             FROM
  2698.             (
  2699.                 SELECT TOP(@i)
  2700.                     y.*,
  2701.                     CASE
  2702.                         WHEN DATEDIFF(day, y.start_time, GETDATE()) > 24 THEN
  2703.                             DATEDIFF(second, GETDATE(), y.start_time)
  2704.                         ELSE DATEDIFF(ms, y.start_time, GETDATE())
  2705.                     END AS elapsed_time,
  2706.                     COALESCE(tempdb_info.tempdb_allocations, 0) AS tempdb_allocations,
  2707.                     COALESCE
  2708.                     (
  2709.                         CASE
  2710.                             WHEN tempdb_info.tempdb_current < 0 THEN 0
  2711.                             ELSE tempdb_info.tempdb_current
  2712.                         END,
  2713.                         0
  2714.                     ) AS tempdb_current,
  2715.                     ' +
  2716.                     CASE
  2717.                         WHEN
  2718.                             (
  2719.                                 @get_task_info <> 0
  2720.                                 OR @find_block_leaders = 1
  2721.                             ) THEN
  2722.                                 'N''('' + CONVERT(NVARCHAR, y.wait_duration_ms) + N''ms)'' +
  2723.                                     y.wait_type +
  2724.                                         CASE
  2725.                                             WHEN y.wait_type LIKE N''PAGE%LATCH_%'' THEN
  2726.                                                 N'':'' +
  2727.                                                 COALESCE(DB_NAME(CONVERT(INT, LEFT(y.resource_description, CHARINDEX(N'':'', y.resource_description) - 1))), N''(null)'') +
  2728.                                                 N'':'' +
  2729.                                                 SUBSTRING(y.resource_description, CHARINDEX(N'':'', y.resource_description) + 1, LEN(y.resource_description) - CHARINDEX(N'':'', REVERSE(y.resource_description)) - CHARINDEX(N'':'', y.resource_description)) +
  2730.                                                 N''('' +
  2731.                                                     CASE
  2732.                                                         WHEN
  2733.                                                             CONVERT(INT, RIGHT(y.resource_description, CHARINDEX(N'':'', REVERSE(y.resource_description)) - 1)) = 1 OR
  2734.                                                             CONVERT(INT, RIGHT(y.resource_description, CHARINDEX(N'':'', REVERSE(y.resource_description)) - 1)) % 8088 = 0
  2735.                                                                 THEN
  2736.                                                                     N''PFS''
  2737.                                                         WHEN
  2738.                                                             CONVERT(INT, RIGHT(y.resource_description, CHARINDEX(N'':'', REVERSE(y.resource_description)) - 1)) = 2 OR
  2739.                                                             CONVERT(INT, RIGHT(y.resource_description, CHARINDEX(N'':'', REVERSE(y.resource_description)) - 1)) % 511232 = 0
  2740.                                                                 THEN
  2741.                                                                     N''GAM''
  2742.                                                         WHEN
  2743.                                                             CONVERT(INT, RIGHT(y.resource_description, CHARINDEX(N'':'', REVERSE(y.resource_description)) - 1)) = 3 OR
  2744.                                                             CONVERT(INT, RIGHT(y.resource_description, CHARINDEX(N'':'', REVERSE(y.resource_description)) - 1)) % 511233 = 0
  2745.                                                                 THEN
  2746.                                                                     N''SGAM''
  2747.                                                         WHEN
  2748.                                                             CONVERT(INT, RIGHT(y.resource_description, CHARINDEX(N'':'', REVERSE(y.resource_description)) - 1)) = 6 OR
  2749.                                                             CONVERT(INT, RIGHT(y.resource_description, CHARINDEX(N'':'', REVERSE(y.resource_description)) - 1)) % 511238 = 0
  2750.                                                                 THEN
  2751.                                                                     N''DCM''
  2752.                                                         WHEN
  2753.                                                             CONVERT(INT, RIGHT(y.resource_description, CHARINDEX(N'':'', REVERSE(y.resource_description)) - 1)) = 7 OR
  2754.                                                             CONVERT(INT, RIGHT(y.resource_description, CHARINDEX(N'':'', REVERSE(y.resource_description)) - 1)) % 511239 = 0
  2755.                                                                 THEN
  2756.                                                                     N''BCM''
  2757.                                                         ELSE
  2758.                                                             N''*''
  2759.                                                     END +
  2760.                                                 N'')''
  2761.                                             WHEN y.wait_type = N''CXPACKET'' THEN
  2762.                                                 N'':'' + SUBSTRING(y.resource_description, CHARINDEX(N''nodeId'', y.resource_description) + 7, 4)
  2763.                                             WHEN y.wait_type LIKE N''LATCH[_]%'' THEN
  2764.                                                 N'' ['' + LEFT(y.resource_description, COALESCE(NULLIF(CHARINDEX(N'' '', y.resource_description), 0), LEN(y.resource_description) + 1) - 1) + N'']''
  2765.                                             WHEN
  2766.                                                 y.wait_type = N''OLEDB''
  2767.                                                 AND y.resource_description LIKE N''%(SPID=%)'' THEN
  2768.                                                     N''['' + LEFT(y.resource_description, CHARINDEX(N''(SPID='', y.resource_description) - 2) +
  2769.                                                         N'':'' + SUBSTRING(y.resource_description, CHARINDEX(N''(SPID='', y.resource_description) + 6, CHARINDEX(N'')'', y.resource_description, (CHARINDEX(N''(SPID='', y.resource_description) + 6)) - (CHARINDEX(N''(SPID='', y.resource_description) + 6)) + '']''
  2770.                                             ELSE
  2771.                                                 N''''
  2772.                                         END COLLATE Latin1_General_Bin2 AS sys_wait_info,
  2773.                                         '
  2774.                             ELSE
  2775.                                 ''
  2776.                         END +
  2777.                         CASE
  2778.                             WHEN @get_task_info = 2 THEN
  2779.                                 'tasks.physical_io,
  2780.                                 tasks.context_switches,
  2781.                                 tasks.tasks,
  2782.                                 tasks.block_info,
  2783.                                 tasks.wait_info AS task_wait_info,
  2784.                                 tasks.thread_CPU_snapshot,
  2785.                                 '
  2786.                             ELSE
  2787.                                 ''
  2788.                     END +
  2789.                     CASE
  2790.                         WHEN NOT (@get_avg_time = 1 AND @recursion = 1) THEN
  2791.                             'CONVERT(INT, NULL) '
  2792.                         ELSE
  2793.                             'qs.total_elapsed_time / qs.execution_count '
  2794.                     END +
  2795.                         'AS avg_elapsed_time
  2796.                 FROM
  2797.                 (
  2798.                     SELECT TOP(@i)
  2799.                         sp.session_id,
  2800.                         sp.request_id,
  2801.                         COALESCE(r.logical_reads, s.logical_reads) AS reads,
  2802.                         COALESCE(r.reads, s.reads) AS physical_reads,
  2803.                         COALESCE(r.writes, s.writes) AS writes,
  2804.                         COALESCE(r.CPU_time, s.CPU_time) AS CPU,
  2805.                         sp.memory_usage + COALESCE(r.granted_query_memory, 0) AS used_memory,
  2806.                         LOWER(sp.status) AS status,
  2807.                         COALESCE(r.sql_handle, sp.sql_handle) AS sql_handle,
  2808.                         COALESCE(r.statement_start_offset, sp.statement_start_offset) AS statement_start_offset,
  2809.                         COALESCE(r.statement_end_offset, sp.statement_end_offset) AS statement_end_offset,
  2810.                         ' +
  2811.                         CASE
  2812.                             WHEN
  2813.                             (
  2814.                                 @get_task_info <> 0
  2815.                                 OR @find_block_leaders = 1
  2816.                             ) THEN
  2817.                                 'sp.wait_type COLLATE Latin1_General_Bin2 AS wait_type,
  2818.                                 sp.wait_resource COLLATE Latin1_General_Bin2 AS resource_description,
  2819.                                 sp.wait_time AS wait_duration_ms,
  2820.                                 '
  2821.                             ELSE
  2822.                                 ''
  2823.                         END +
  2824.                         'NULLIF(sp.blocked, 0) AS blocking_session_id,
  2825.                         r.plan_handle,
  2826.                         NULLIF(r.percent_complete, 0) AS percent_complete,
  2827.                         sp.host_name,
  2828.                         sp.login_name,
  2829.                         sp.program_name,
  2830.                         s.host_process_id,
  2831.                         COALESCE(r.text_size, s.text_size) AS text_size,
  2832.                         COALESCE(r.language, s.language) AS language,
  2833.                         COALESCE(r.date_format, s.date_format) AS date_format,
  2834.                         COALESCE(r.date_first, s.date_first) AS date_first,
  2835.                         COALESCE(r.quoted_identifier, s.quoted_identifier) AS quoted_identifier,
  2836.                         COALESCE(r.arithabort, s.arithabort) AS arithabort,
  2837.                         COALESCE(r.ansi_null_dflt_on, s.ansi_null_dflt_on) AS ansi_null_dflt_on,
  2838.                         COALESCE(r.ansi_defaults, s.ansi_defaults) AS ansi_defaults,
  2839.                         COALESCE(r.ansi_warnings, s.ansi_warnings) AS ansi_warnings,
  2840.                         COALESCE(r.ansi_padding, s.ansi_padding) AS ansi_padding,
  2841.                         COALESCE(r.ansi_nulls, s.ansi_nulls) AS ansi_nulls,
  2842.                         COALESCE(r.concat_null_yields_null, s.concat_null_yields_null) AS concat_null_yields_null,
  2843.                         COALESCE(r.transaction_isolation_level, s.transaction_isolation_level) AS transaction_isolation_level,
  2844.                         COALESCE(r.lock_timeout, s.lock_timeout) AS lock_timeout,
  2845.                         COALESCE(r.deadlock_priority, s.deadlock_priority) AS deadlock_priority,
  2846.                         COALESCE(r.row_count, s.row_count) AS row_count,
  2847.                         COALESCE(r.command, sp.cmd) AS command_type,
  2848.                         COALESCE
  2849.                         (
  2850.                             CASE
  2851.                                 WHEN
  2852.                                 (
  2853.                                     s.is_user_process = 0
  2854.                                     AND r.total_elapsed_time >= 0
  2855.                                 ) THEN
  2856.                                     DATEADD
  2857.                                     (
  2858.                                         ms,
  2859.                                         1000 * (DATEPART(ms, DATEADD(second, -(r.total_elapsed_time / 1000), GETDATE())) / 500) - DATEPART(ms, DATEADD(second, -(r.total_elapsed_time / 1000), GETDATE())),
  2860.                                         DATEADD(second, -(r.total_elapsed_time / 1000), GETDATE())
  2861.                                     )
  2862.                             END,
  2863.                             NULLIF(COALESCE(r.start_time, sp.last_request_end_time), CONVERT(DATETIME, ''19000101'', 112)),
  2864.                             (
  2865.                                 SELECT TOP(1)
  2866.                                     DATEADD(second, -(ms_ticks / 1000), GETDATE())
  2867.                                 FROM sys.dm_os_sys_info
  2868.                             )
  2869.                         ) AS start_time,
  2870.                         sp.login_time,
  2871.                         CASE
  2872.                             WHEN s.is_user_process = 1 THEN
  2873.                                 s.last_request_start_time
  2874.                             ELSE
  2875.                                 COALESCE
  2876.                                 (
  2877.                                     DATEADD
  2878.                                     (
  2879.                                         ms,
  2880.                                         1000 * (DATEPART(ms, DATEADD(second, -(r.total_elapsed_time / 1000), GETDATE())) / 500) - DATEPART(ms, DATEADD(second, -(r.total_elapsed_time / 1000), GETDATE())),
  2881.                                         DATEADD(second, -(r.total_elapsed_time / 1000), GETDATE())
  2882.                                     ),
  2883.                                     s.last_request_start_time
  2884.                                 )
  2885.                         END AS last_request_start_time,
  2886.                         r.transaction_id,
  2887.                         sp.database_id,
  2888.                         sp.open_tran_count
  2889.                     FROM @sessions AS sp
  2890.                     LEFT OUTER LOOP JOIN sys.dm_exec_sessions AS s ON
  2891.                         s.session_id = sp.session_id
  2892.                         AND s.login_time = sp.login_time
  2893.                     LEFT OUTER LOOP JOIN sys.dm_exec_requests AS r ON
  2894.                         sp.status <> ''sleeping''
  2895.                         AND r.session_id = sp.session_id
  2896.                         AND r.request_id = sp.request_id
  2897.                         AND
  2898.                         (
  2899.                             (
  2900.                                 s.is_user_process = 0
  2901.                                 AND sp.is_user_process = 0
  2902.                             )
  2903.                             OR
  2904.                             (
  2905.                                 r.start_time = s.last_request_start_time
  2906.                                 AND s.last_request_end_time = sp.last_request_end_time
  2907.                             )
  2908.                         )
  2909.                 ) AS y
  2910.                 ' +
  2911.                 CASE
  2912.                     WHEN @get_task_info = 2 THEN
  2913.                         CONVERT(VARCHAR(MAX), '') +
  2914.                         'LEFT OUTER HASH JOIN
  2915.                         (
  2916.                             SELECT TOP(@i)
  2917.                                 task_nodes.task_node.value(''(session_id/text())[1]'', ''SMALLINT'') AS session_id,
  2918.                                 task_nodes.task_node.value(''(request_id/text())[1]'', ''INT'') AS request_id,
  2919.                                 task_nodes.task_node.value(''(physical_io/text())[1]'', ''BIGINT'') AS physical_io,
  2920.                                 task_nodes.task_node.value(''(context_switches/text())[1]'', ''BIGINT'') AS context_switches,
  2921.                                 task_nodes.task_node.value(''(tasks/text())[1]'', ''INT'') AS tasks,
  2922.                                 task_nodes.task_node.value(''(block_info/text())[1]'', ''NVARCHAR(4000)'') AS block_info,
  2923.                                 task_nodes.task_node.value(''(waits/text())[1]'', ''NVARCHAR(4000)'') AS wait_info,
  2924.                                 task_nodes.task_node.value(''(thread_CPU_snapshot/text())[1]'', ''BIGINT'') AS thread_CPU_snapshot
  2925.                             FROM
  2926.                             (
  2927.                                 SELECT TOP(@i)
  2928.                                     CONVERT
  2929.                                     (
  2930.                                         XML,
  2931.                                         REPLACE
  2932.                                         (
  2933.                                             CONVERT(NVARCHAR(MAX), tasks_raw.task_xml_raw) COLLATE Latin1_General_Bin2,
  2934.                                             N''</waits></tasks><tasks><waits>'',
  2935.                                             N'', ''
  2936.                                         )
  2937.                                     ) AS task_xml
  2938.                                 FROM
  2939.                                 (
  2940.                                     SELECT TOP(@i)
  2941.                                         CASE waits.r
  2942.                                             WHEN 1 THEN
  2943.                                                 waits.session_id
  2944.                                             ELSE
  2945.                                                 NULL
  2946.                                         END AS [session_id],
  2947.                                         CASE waits.r
  2948.                                             WHEN 1 THEN
  2949.                                                 waits.request_id
  2950.                                             ELSE
  2951.                                                 NULL
  2952.                                         END AS [request_id],                                           
  2953.                                         CASE waits.r
  2954.                                             WHEN 1 THEN
  2955.                                                 waits.physical_io
  2956.                                             ELSE
  2957.                                                 NULL
  2958.                                         END AS [physical_io],
  2959.                                         CASE waits.r
  2960.                                             WHEN 1 THEN
  2961.                                                 waits.context_switches
  2962.                                             ELSE
  2963.                                                 NULL
  2964.                                         END AS [context_switches],
  2965.                                         CASE waits.r
  2966.                                             WHEN 1 THEN
  2967.                                                 waits.thread_CPU_snapshot
  2968.                                             ELSE
  2969.                                                 NULL
  2970.                                         END AS [thread_CPU_snapshot],
  2971.                                         CASE waits.r
  2972.                                             WHEN 1 THEN
  2973.                                                 waits.tasks
  2974.                                             ELSE
  2975.                                                 NULL
  2976.                                         END AS [tasks],
  2977.                                         CASE waits.r
  2978.                                             WHEN 1 THEN
  2979.                                                 waits.block_info
  2980.                                             ELSE
  2981.                                                 NULL
  2982.                                         END AS [block_info],
  2983.                                         REPLACE
  2984.                                         (
  2985.                                             REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
  2986.                                             REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
  2987.                                             REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
  2988.                                                 CONVERT
  2989.                                                 (
  2990.                                                     NVARCHAR(MAX),
  2991.                                                     N''('' +
  2992.                                                         CONVERT(NVARCHAR, num_waits) + N''x: '' +
  2993.                                                         CASE num_waits
  2994.                                                             WHEN 1 THEN
  2995.                                                                 CONVERT(NVARCHAR, min_wait_time) + N''ms''
  2996.                                                             WHEN 2 THEN
  2997.                                                                 CASE
  2998.                                                                     WHEN min_wait_time <> max_wait_time THEN
  2999.                                                                         CONVERT(NVARCHAR, min_wait_time) + N''/'' + CONVERT(NVARCHAR, max_wait_time) + N''ms''
  3000.                                                                     ELSE
  3001.                                                                         CONVERT(NVARCHAR, max_wait_time) + N''ms''
  3002.                                                                 END
  3003.                                                             ELSE
  3004.                                                                 CASE
  3005.                                                                     WHEN min_wait_time <> max_wait_time THEN
  3006.                                                                         CONVERT(NVARCHAR, min_wait_time) + N''/'' + CONVERT(NVARCHAR, avg_wait_time) + N''/'' + CONVERT(NVARCHAR, max_wait_time) + N''ms''
  3007.                                                                     ELSE
  3008.                                                                         CONVERT(NVARCHAR, max_wait_time) + N''ms''
  3009.                                                                 END
  3010.                                                         END +
  3011.                                                     N'')'' + wait_type COLLATE Latin1_General_Bin2
  3012.                                                 ),
  3013.                                                 NCHAR(31),N''?''),NCHAR(30),N''?''),NCHAR(29),N''?''),NCHAR(28),N''?''),NCHAR(27),N''?''),NCHAR(26),N''?''),NCHAR(25),N''?''),NCHAR(24),N''?''),NCHAR(23),N''?''),NCHAR(22),N''?''),
  3014.                                                 NCHAR(21),N''?''),NCHAR(20),N''?''),NCHAR(19),N''?''),NCHAR(18),N''?''),NCHAR(17),N''?''),NCHAR(16),N''?''),NCHAR(15),N''?''),NCHAR(14),N''?''),NCHAR(12),N''?''),
  3015.                                                 NCHAR(11),N''?''),NCHAR(8),N''?''),NCHAR(7),N''?''),NCHAR(6),N''?''),NCHAR(5),N''?''),NCHAR(4),N''?''),NCHAR(3),N''?''),NCHAR(2),N''?''),NCHAR(1),N''?''),
  3016.                                             NCHAR(0),
  3017.                                             N''''
  3018.                                         ) AS [waits]
  3019.                                     FROM
  3020.                                     (
  3021.                                         SELECT TOP(@i)
  3022.                                             w1.*,
  3023.                                             ROW_NUMBER() OVER
  3024.                                             (
  3025.                                                 PARTITION BY
  3026.                                                     w1.session_id,
  3027.                                                     w1.request_id
  3028.                                                 ORDER BY
  3029.                                                     w1.block_info DESC,
  3030.                                                     w1.num_waits DESC,
  3031.                                                     w1.wait_type
  3032.                                             ) AS r
  3033.                                         FROM
  3034.                                         (
  3035.                                             SELECT TOP(@i)
  3036.                                                 task_info.session_id,
  3037.                                                 task_info.request_id,
  3038.                                                 task_info.physical_io,
  3039.                                                 task_info.context_switches,
  3040.                                                 task_info.thread_CPU_snapshot,
  3041.                                                 task_info.num_tasks AS tasks,
  3042.                                                 CASE
  3043.                                                     WHEN task_info.runnable_time IS NOT NULL THEN
  3044.                                                         ''RUNNABLE''
  3045.                                                     ELSE
  3046.                                                         wt2.wait_type
  3047.                                                 END AS wait_type,
  3048.                                                 NULLIF(COUNT(COALESCE(task_info.runnable_time, wt2.waiting_task_address)), 0) AS num_waits,
  3049.                                                 MIN(COALESCE(task_info.runnable_time, wt2.wait_duration_ms)) AS min_wait_time,
  3050.                                                 AVG(COALESCE(task_info.runnable_time, wt2.wait_duration_ms)) AS avg_wait_time,
  3051.                                                 MAX(COALESCE(task_info.runnable_time, wt2.wait_duration_ms)) AS max_wait_time,
  3052.                                                 MAX(wt2.block_info) AS block_info
  3053.                                             FROM
  3054.                                             (
  3055.                                                 SELECT TOP(@i)
  3056.                                                     t.session_id,
  3057.                                                     t.request_id,
  3058.                                                     SUM(CONVERT(BIGINT, t.pending_io_count)) OVER (PARTITION BY t.session_id, t.request_id) AS physical_io,
  3059.                                                     SUM(CONVERT(BIGINT, t.context_switches_count)) OVER (PARTITION BY t.session_id, t.request_id) AS context_switches,
  3060.                                                     ' +
  3061.                                                     CASE
  3062.                                                         WHEN @output_column_list LIKE '%|[CPU_delta|]%' ESCAPE '|'
  3063.                                                             THEN
  3064.                                                                 'SUM(tr.usermode_time + tr.kernel_time) OVER (PARTITION BY t.session_id, t.request_id) '
  3065.                                                         ELSE
  3066.                                                             'CONVERT(BIGINT, NULL) '
  3067.                                                     END +
  3068.                                                         ' AS thread_CPU_snapshot,
  3069.                                                     COUNT(*) OVER (PARTITION BY t.session_id, t.request_id) AS num_tasks,
  3070.                                                     t.task_address,
  3071.                                                     t.task_state,
  3072.                                                     CASE
  3073.                                                         WHEN
  3074.                                                             t.task_state = ''RUNNABLE''
  3075.                                                             AND w.runnable_time > 0 THEN
  3076.                                                                 w.runnable_time
  3077.                                                         ELSE
  3078.                                                             NULL
  3079.                                                     END AS runnable_time
  3080.                                                 FROM sys.dm_os_tasks AS t
  3081.                                                 CROSS APPLY
  3082.                                                 (
  3083.                                                     SELECT TOP(1)
  3084.                                                         sp2.session_id
  3085.                                                     FROM @sessions AS sp2
  3086.                                                     WHERE
  3087.                                                         sp2.session_id = t.session_id
  3088.                                                         AND sp2.request_id = t.request_id
  3089.                                                         AND sp2.status <> ''sleeping''
  3090.                                                 ) AS sp20
  3091.                                                 LEFT OUTER HASH JOIN
  3092.                                                 (
  3093.                                                     SELECT TOP(@i)
  3094.                                                         (
  3095.                                                             SELECT TOP(@i)
  3096.                                                                 ms_ticks
  3097.                                                             FROM sys.dm_os_sys_info
  3098.                                                         ) -
  3099.                                                             w0.wait_resumed_ms_ticks AS runnable_time,
  3100.                                                         w0.worker_address,
  3101.                                                         w0.thread_address,
  3102.                                                         w0.task_bound_ms_ticks
  3103.                                                     FROM sys.dm_os_workers AS w0
  3104.                                                     WHERE
  3105.                                                         w0.state = ''RUNNABLE''
  3106.                                                         OR @first_collection_ms_ticks >= w0.task_bound_ms_ticks
  3107.                                                 ) AS w ON
  3108.                                                     w.worker_address = t.worker_address
  3109.                                                 ' +
  3110.                                                 CASE
  3111.                                                     WHEN @output_column_list LIKE '%|[CPU_delta|]%' ESCAPE '|'
  3112.                                                         THEN
  3113.                                                             'LEFT OUTER HASH JOIN sys.dm_os_threads AS tr ON
  3114.                                                                 tr.thread_address = w.thread_address
  3115.                                                                 AND @first_collection_ms_ticks >= w.task_bound_ms_ticks
  3116.                                                             '
  3117.                                                     ELSE
  3118.                                                         ''
  3119.                                                 END +
  3120.                                             ') AS task_info
  3121.                                             LEFT OUTER HASH JOIN
  3122.                                             (
  3123.                                                 SELECT TOP(@i)
  3124.                                                     wt1.wait_type,
  3125.                                                     wt1.waiting_task_address,
  3126.                                                     MAX(wt1.wait_duration_ms) AS wait_duration_ms,
  3127.                                                     MAX(wt1.block_info) AS block_info
  3128.                                                 FROM
  3129.                                                 (
  3130.                                                     SELECT DISTINCT TOP(@i)
  3131.                                                         wt.wait_type +
  3132.                                                             CASE
  3133.                                                                 WHEN wt.wait_type LIKE N''PAGE%LATCH_%'' THEN
  3134.                                                                     '':'' +
  3135.                                                                     COALESCE(DB_NAME(CONVERT(INT, LEFT(wt.resource_description, CHARINDEX(N'':'', wt.resource_description) - 1))), N''(null)'') +
  3136.                                                                     N'':'' +
  3137.                                                                     SUBSTRING(wt.resource_description, CHARINDEX(N'':'', wt.resource_description) + 1, LEN(wt.resource_description) - CHARINDEX(N'':'', REVERSE(wt.resource_description)) - CHARINDEX(N'':'', wt.resource_description)) +
  3138.                                                                     N''('' +
  3139.                                                                         CASE
  3140.                                                                             WHEN
  3141.                                                                                 CONVERT(INT, RIGHT(wt.resource_description, CHARINDEX(N'':'', REVERSE(wt.resource_description)) - 1)) = 1 OR
  3142.                                                                                 CONVERT(INT, RIGHT(wt.resource_description, CHARINDEX(N'':'', REVERSE(wt.resource_description)) - 1)) % 8088 = 0
  3143.                                                                                     THEN
  3144.                                                                                         N''PFS''
  3145.                                                                             WHEN
  3146.                                                                                 CONVERT(INT, RIGHT(wt.resource_description, CHARINDEX(N'':'', REVERSE(wt.resource_description)) - 1)) = 2 OR
  3147.                                                                                 CONVERT(INT, RIGHT(wt.resource_description, CHARINDEX(N'':'', REVERSE(wt.resource_description)) - 1)) % 511232 = 0
  3148.                                                                                     THEN
  3149.                                                                                         N''GAM''
  3150.                                                                             WHEN
  3151.                                                                                 CONVERT(INT, RIGHT(wt.resource_description, CHARINDEX(N'':'', REVERSE(wt.resource_description)) - 1)) = 3 OR
  3152.                                                                                 CONVERT(INT, RIGHT(wt.resource_description, CHARINDEX(N'':'', REVERSE(wt.resource_description)) - 1)) % 511233 = 0
  3153.                                                                                     THEN
  3154.                                                                                         N''SGAM''
  3155.                                                                             WHEN
  3156.                                                                                 CONVERT(INT, RIGHT(wt.resource_description, CHARINDEX(N'':'', REVERSE(wt.resource_description)) - 1)) = 6 OR
  3157.                                                                                 CONVERT(INT, RIGHT(wt.resource_description, CHARINDEX(N'':'', REVERSE(wt.resource_description)) - 1)) % 511238 = 0
  3158.                                                                                     THEN
  3159.                                                                                         N''DCM''
  3160.                                                                             WHEN
  3161.                                                                                 CONVERT(INT, RIGHT(wt.resource_description, CHARINDEX(N'':'', REVERSE(wt.resource_description)) - 1)) = 7 OR
  3162.                                                                                 CONVERT(INT, RIGHT(wt.resource_description, CHARINDEX(N'':'', REVERSE(wt.resource_description)) - 1)) % 511239 = 0
  3163.                                                                                     THEN
  3164.                                                                                         N''BCM''
  3165.                                                                             ELSE
  3166.                                                                                 N''*''
  3167.                                                                         END +
  3168.                                                                     N'')''
  3169.                                                                 WHEN wt.wait_type = N''CXPACKET'' THEN
  3170.                                                                     N'':'' + SUBSTRING(wt.resource_description, CHARINDEX(N''nodeId'', wt.resource_description) + 7, 4)
  3171.                                                                 WHEN wt.wait_type LIKE N''LATCH[_]%'' THEN
  3172.                                                                     N'' ['' + LEFT(wt.resource_description, COALESCE(NULLIF(CHARINDEX(N'' '', wt.resource_description), 0), LEN(wt.resource_description) + 1) - 1) + N'']''
  3173.                                                                 ELSE
  3174.                                                                     N''''
  3175.                                                             END COLLATE Latin1_General_Bin2 AS wait_type,
  3176.                                                         CASE
  3177.                                                             WHEN
  3178.                                                             (
  3179.                                                                 wt.blocking_session_id IS NOT NULL
  3180.                                                                 AND wt.wait_type LIKE N''LCK[_]%''
  3181.                                                             ) THEN
  3182.                                                                 (
  3183.                                                                     SELECT TOP(@i)
  3184.                                                                         x.lock_type,
  3185.                                                                         REPLACE
  3186.                                                                         (
  3187.                                                                             REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
  3188.                                                                             REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
  3189.                                                                             REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
  3190.                                                                                 DB_NAME
  3191.                                                                                 (
  3192.                                                                                     CONVERT
  3193.                                                                                     (
  3194.                                                                                         INT,
  3195.                                                                                         SUBSTRING(wt.resource_description, NULLIF(CHARINDEX(N''dbid='', wt.resource_description), 0) + 5, COALESCE(NULLIF(CHARINDEX(N'' '', wt.resource_description, CHARINDEX(N''dbid='', wt.resource_description) + 5), 0), LEN(wt.resource_description) + 1) - CHARINDEX(N''dbid='', wt.resource_description) - 5)
  3196.                                                                                     )
  3197.                                                                                 ),
  3198.                                                                                 NCHAR(31),N''?''),NCHAR(30),N''?''),NCHAR(29),N''?''),NCHAR(28),N''?''),NCHAR(27),N''?''),NCHAR(26),N''?''),NCHAR(25),N''?''),NCHAR(24),N''?''),NCHAR(23),N''?''),NCHAR(22),N''?''),
  3199.                                                                                 NCHAR(21),N''?''),NCHAR(20),N''?''),NCHAR(19),N''?''),NCHAR(18),N''?''),NCHAR(17),N''?''),NCHAR(16),N''?''),NCHAR(15),N''?''),NCHAR(14),N''?''),NCHAR(12),N''?''),
  3200.                                                                                 NCHAR(11),N''?''),NCHAR(8),N''?''),NCHAR(7),N''?''),NCHAR(6),N''?''),NCHAR(5),N''?''),NCHAR(4),N''?''),NCHAR(3),N''?''),NCHAR(2),N''?''),NCHAR(1),N''?''),
  3201.                                                                             NCHAR(0),
  3202.                                                                             N''''
  3203.                                                                         ) AS database_name,
  3204.                                                                         CASE x.lock_type
  3205.                                                                             WHEN N''objectlock'' THEN
  3206.                                                                                 SUBSTRING(wt.resource_description, NULLIF(CHARINDEX(N''objid='', wt.resource_description), 0) + 6, COALESCE(NULLIF(CHARINDEX(N'' '', wt.resource_description, CHARINDEX(N''objid='', wt.resource_description) + 6), 0), LEN(wt.resource_description) + 1) - CHARINDEX(N''objid='', wt.resource_description) - 6)
  3207.                                                                             ELSE
  3208.                                                                                 NULL
  3209.                                                                         END AS object_id,
  3210.                                                                         CASE x.lock_type
  3211.                                                                             WHEN N''filelock'' THEN
  3212.                                                                                 SUBSTRING(wt.resource_description, NULLIF(CHARINDEX(N''fileid='', wt.resource_description), 0) + 7, COALESCE(NULLIF(CHARINDEX(N'' '', wt.resource_description, CHARINDEX(N''fileid='', wt.resource_description) + 7), 0), LEN(wt.resource_description) + 1) - CHARINDEX(N''fileid='', wt.resource_description) - 7)
  3213.                                                                             ELSE
  3214.                                                                                 NULL
  3215.                                                                         END AS file_id,
  3216.                                                                         CASE
  3217.                                                                             WHEN x.lock_type in (N''pagelock'', N''extentlock'', N''ridlock'') THEN
  3218.                                                                                 SUBSTRING(wt.resource_description, NULLIF(CHARINDEX(N''associatedObjectId='', wt.resource_description), 0) + 19, COALESCE(NULLIF(CHARINDEX(N'' '', wt.resource_description, CHARINDEX(N''associatedObjectId='', wt.resource_description) + 19), 0), LEN(wt.resource_description) + 1) - CHARINDEX(N''associatedObjectId='', wt.resource_description) - 19)
  3219.                                                                             WHEN x.lock_type in (N''keylock'', N''hobtlock'', N''allocunitlock'') THEN
  3220.                                                                                 SUBSTRING(wt.resource_description, NULLIF(CHARINDEX(N''hobtid='', wt.resource_description), 0) + 7, COALESCE(NULLIF(CHARINDEX(N'' '', wt.resource_description, CHARINDEX(N''hobtid='', wt.resource_description) + 7), 0), LEN(wt.resource_description) + 1) - CHARINDEX(N''hobtid='', wt.resource_description) - 7)
  3221.                                                                             ELSE
  3222.                                                                                 NULL
  3223.                                                                         END AS hobt_id,
  3224.                                                                         CASE x.lock_type
  3225.                                                                             WHEN N''applicationlock'' THEN
  3226.                                                                                 SUBSTRING(wt.resource_description, NULLIF(CHARINDEX(N''hash='', wt.resource_description), 0) + 5, COALESCE(NULLIF(CHARINDEX(N'' '', wt.resource_description, CHARINDEX(N''hash='', wt.resource_description) + 5), 0), LEN(wt.resource_description) + 1) - CHARINDEX(N''hash='', wt.resource_description) - 5)
  3227.                                                                             ELSE
  3228.                                                                                 NULL
  3229.                                                                         END AS applock_hash,
  3230.                                                                         CASE x.lock_type
  3231.                                                                             WHEN N''metadatalock'' THEN
  3232.                                                                                 SUBSTRING(wt.resource_description, NULLIF(CHARINDEX(N''subresource='', wt.resource_description), 0) + 12, COALESCE(NULLIF(CHARINDEX(N'' '', wt.resource_description, CHARINDEX(N''subresource='', wt.resource_description) + 12), 0), LEN(wt.resource_description) + 1) - CHARINDEX(N''subresource='', wt.resource_description) - 12)
  3233.                                                                             ELSE
  3234.                                                                                 NULL
  3235.                                                                         END AS metadata_resource,
  3236.                                                                         CASE x.lock_type
  3237.                                                                             WHEN N''metadatalock'' THEN
  3238.                                                                                 SUBSTRING(wt.resource_description, NULLIF(CHARINDEX(N''classid='', wt.resource_description), 0) + 8, COALESCE(NULLIF(CHARINDEX(N'' dbid='', wt.resource_description) - CHARINDEX(N''classid='', wt.resource_description), 0), LEN(wt.resource_description) + 1) - 8)
  3239.                                                                             ELSE
  3240.                                                                                 NULL
  3241.                                                                         END AS metadata_class_id
  3242.                                                                     FROM
  3243.                                                                     (
  3244.                                                                         SELECT TOP(1)
  3245.                                                                             LEFT(wt.resource_description, CHARINDEX(N'' '', wt.resource_description) - 1) COLLATE Latin1_General_Bin2 AS lock_type
  3246.                                                                     ) AS x
  3247.                                                                     FOR XML
  3248.                                                                         PATH('''')
  3249.                                                                 )
  3250.                                                             ELSE NULL
  3251.                                                         END AS block_info,
  3252.                                                         wt.wait_duration_ms,
  3253.                                                         wt.waiting_task_address
  3254.                                                     FROM
  3255.                                                     (
  3256.                                                         SELECT TOP(@i)
  3257.                                                             wt0.wait_type COLLATE Latin1_General_Bin2 AS wait_type,
  3258.                                                             wt0.resource_description COLLATE Latin1_General_Bin2 AS resource_description,
  3259.                                                             wt0.wait_duration_ms,
  3260.                                                             wt0.waiting_task_address,
  3261.                                                             CASE
  3262.                                                                 WHEN wt0.blocking_session_id = p.blocked THEN
  3263.                                                                     wt0.blocking_session_id
  3264.                                                                 ELSE
  3265.                                                                     NULL
  3266.                                                             END AS blocking_session_id
  3267.                                                         FROM sys.dm_os_waiting_tasks AS wt0
  3268.                                                         CROSS APPLY
  3269.                                                         (
  3270.                                                             SELECT TOP(1)
  3271.                                                                 s0.blocked
  3272.                                                             FROM @sessions AS s0
  3273.                                                             WHERE
  3274.                                                                 s0.session_id = wt0.session_id
  3275.                                                                 AND COALESCE(s0.wait_type, N'''') <> N''OLEDB''
  3276.                                                                 AND wt0.wait_type <> N''OLEDB''
  3277.                                                         ) AS p
  3278.                                                     ) AS wt
  3279.                                                 ) AS wt1
  3280.                                                 GROUP BY
  3281.                                                     wt1.wait_type,
  3282.                                                     wt1.waiting_task_address
  3283.                                             ) AS wt2 ON
  3284.                                                 wt2.waiting_task_address = task_info.task_address
  3285.                                                 AND wt2.wait_duration_ms > 0
  3286.                                                 AND task_info.runnable_time IS NULL
  3287.                                             GROUP BY
  3288.                                                 task_info.session_id,
  3289.                                                 task_info.request_id,
  3290.                                                 task_info.physical_io,
  3291.                                                 task_info.context_switches,
  3292.                                                 task_info.thread_CPU_snapshot,
  3293.                                                 task_info.num_tasks,
  3294.                                                 CASE
  3295.                                                     WHEN task_info.runnable_time IS NOT NULL THEN
  3296.                                                         ''RUNNABLE''
  3297.                                                     ELSE
  3298.                                                         wt2.wait_type
  3299.                                                 END
  3300.                                         ) AS w1
  3301.                                     ) AS waits
  3302.                                     ORDER BY
  3303.                                         waits.session_id,
  3304.                                         waits.request_id,
  3305.                                         waits.r
  3306.                                     FOR XML
  3307.                                         PATH(N''tasks''),
  3308.                                         TYPE
  3309.                                 ) AS tasks_raw (task_xml_raw)
  3310.                             ) AS tasks_final
  3311.                             CROSS APPLY tasks_final.task_xml.nodes(N''/tasks'') AS task_nodes (task_node)
  3312.                             WHERE
  3313.                                 task_nodes.task_node.exist(N''session_id'') = 1
  3314.                         ) AS tasks ON
  3315.                             tasks.session_id = y.session_id
  3316.                             AND tasks.request_id = y.request_id
  3317.                         '
  3318.                     ELSE
  3319.                         ''
  3320.                 END +
  3321.                 'LEFT OUTER HASH JOIN
  3322.                 (
  3323.                     SELECT TOP(@i)
  3324.                         t_info.session_id,
  3325.                         COALESCE(t_info.request_id, -1) AS request_id,
  3326.                         SUM(t_info.tempdb_allocations) AS tempdb_allocations,
  3327.                         SUM(t_info.tempdb_current) AS tempdb_current
  3328.                     FROM
  3329.                     (
  3330.                         SELECT TOP(@i)
  3331.                             tsu.session_id,
  3332.                             tsu.request_id,
  3333.                             tsu.user_objects_alloc_page_count +
  3334.                                 tsu.internal_objects_alloc_page_count AS tempdb_allocations,
  3335.                             tsu.user_objects_alloc_page_count +
  3336.                                 tsu.internal_objects_alloc_page_count -
  3337.                                 tsu.user_objects_dealloc_page_count -
  3338.                                 tsu.internal_objects_dealloc_page_count AS tempdb_current
  3339.                         FROM sys.dm_db_task_space_usage AS tsu
  3340.                         CROSS APPLY
  3341.                         (
  3342.                             SELECT TOP(1)
  3343.                                 s0.session_id
  3344.                             FROM @sessions AS s0
  3345.                             WHERE
  3346.                                 s0.session_id = tsu.session_id
  3347.                         ) AS p
  3348.  
  3349.                         UNION ALL
  3350.  
  3351.                         SELECT TOP(@i)
  3352.                             ssu.session_id,
  3353.                             NULL AS request_id,
  3354.                             ssu.user_objects_alloc_page_count +
  3355.                                 ssu.internal_objects_alloc_page_count AS tempdb_allocations,
  3356.                             ssu.user_objects_alloc_page_count +
  3357.                                 ssu.internal_objects_alloc_page_count -
  3358.                                 ssu.user_objects_dealloc_page_count -
  3359.                                 ssu.internal_objects_dealloc_page_count AS tempdb_current
  3360.                         FROM sys.dm_db_session_space_usage AS ssu
  3361.                         CROSS APPLY
  3362.                         (
  3363.                             SELECT TOP(1)
  3364.                                 s0.session_id
  3365.                             FROM @sessions AS s0
  3366.                             WHERE
  3367.                                 s0.session_id = ssu.session_id
  3368.                         ) AS p
  3369.                     ) AS t_info
  3370.                     GROUP BY
  3371.                         t_info.session_id,
  3372.                         COALESCE(t_info.request_id, -1)
  3373.                 ) AS tempdb_info ON
  3374.                     tempdb_info.session_id = y.session_id
  3375.                     AND tempdb_info.request_id =
  3376.                         CASE
  3377.                             WHEN y.status = N''sleeping'' THEN
  3378.                                 -1
  3379.                             ELSE
  3380.                                 y.request_id
  3381.                         END
  3382.                 ' +
  3383.                 CASE
  3384.                     WHEN
  3385.                         NOT
  3386.                         (
  3387.                             @get_avg_time = 1
  3388.                             AND @recursion = 1
  3389.                         ) THEN
  3390.                             ''
  3391.                     ELSE
  3392.                         'LEFT OUTER HASH JOIN
  3393.                         (
  3394.                             SELECT TOP(@i)
  3395.                                 *
  3396.                             FROM sys.dm_exec_query_stats
  3397.                         ) AS qs ON
  3398.                             qs.sql_handle = y.sql_handle
  3399.                             AND qs.plan_handle = y.plan_handle
  3400.                             AND qs.statement_start_offset = y.statement_start_offset
  3401.                             AND qs.statement_end_offset = y.statement_end_offset
  3402.                         '
  3403.                 END +
  3404.             ') AS x
  3405.             OPTION (KEEPFIXED PLAN, OPTIMIZE FOR (@i = 1)); ';
  3406.  
  3407.         SET @sql_n = CONVERT(NVARCHAR(MAX), @sql);
  3408.  
  3409.         SET @last_collection_start = GETDATE();
  3410.  
  3411.         IF @recursion = -1
  3412.         BEGIN;
  3413.             SELECT
  3414.                 @first_collection_ms_ticks = ms_ticks
  3415.             FROM sys.dm_os_sys_info;
  3416.         END;
  3417.  
  3418.         INSERT #sessions
  3419.         (
  3420.             recursion,
  3421.             session_id,
  3422.             request_id,
  3423.             session_number,
  3424.             elapsed_time,
  3425.             avg_elapsed_time,
  3426.             physical_io,
  3427.             reads,
  3428.             physical_reads,
  3429.             writes,
  3430.             tempdb_allocations,
  3431.             tempdb_current,
  3432.             CPU,
  3433.             thread_CPU_snapshot,
  3434.             context_switches,
  3435.             used_memory,
  3436.             tasks,
  3437.             status,
  3438.             wait_info,
  3439.             transaction_id,
  3440.             open_tran_count,
  3441.             sql_handle,
  3442.             statement_start_offset,
  3443.             statement_end_offset,      
  3444.             sql_text,
  3445.             plan_handle,
  3446.             blocking_session_id,
  3447.             percent_complete,
  3448.             host_name,
  3449.             login_name,
  3450.             database_name,
  3451.             program_name,
  3452.             additional_info,
  3453.             start_time,
  3454.             login_time,
  3455.             last_request_start_time
  3456.         )
  3457.         EXEC sp_executesql
  3458.             @sql_n,
  3459.             N'@recursion SMALLINT, @filter sysname, @not_filter sysname, @first_collection_ms_ticks BIGINT',
  3460.             @recursion, @filter, @not_filter, @first_collection_ms_ticks;
  3461.  
  3462.         --Collect transaction information?
  3463.         IF
  3464.             @recursion = 1
  3465.             AND
  3466.             (
  3467.                 @output_column_list LIKE '%|[tran_start_time|]%' ESCAPE '|'
  3468.                 OR @output_column_list LIKE '%|[tran_log_writes|]%' ESCAPE '|'
  3469.             )
  3470.         BEGIN
  3471.             DECLARE @i INT;
  3472.             SET @i = 2147483647;
  3473.  
  3474.             UPDATE s
  3475.             SET
  3476.                 tran_start_time =
  3477.                     CONVERT
  3478.                     (
  3479.                         DATETIME,
  3480.                         LEFT
  3481.                         (
  3482.                             x.trans_info,
  3483.                             NULLIF(CHARINDEX(NCHAR(254) COLLATE Latin1_General_Bin2, x.trans_info) - 1, -1)
  3484.                         ),
  3485.                         121
  3486.                     ),
  3487.                 tran_log_writes =
  3488.                     RIGHT
  3489.                     (
  3490.                         x.trans_info,
  3491.                         LEN(x.trans_info) - CHARINDEX(NCHAR(254) COLLATE Latin1_General_Bin2, x.trans_info)
  3492.                     )
  3493.             FROM
  3494.             (
  3495.                 SELECT TOP(@i)
  3496.                     trans_nodes.trans_node.value('(session_id/text())[1]', 'SMALLINT') AS session_id,
  3497.                     COALESCE(trans_nodes.trans_node.value('(request_id/text())[1]', 'INT'), 0) AS request_id,
  3498.                     trans_nodes.trans_node.value('(trans_info/text())[1]', 'NVARCHAR(4000)') AS trans_info             
  3499.                 FROM
  3500.                 (
  3501.                     SELECT TOP(@i)
  3502.                         CONVERT
  3503.                         (
  3504.                             XML,
  3505.                             REPLACE
  3506.                             (
  3507.                                 CONVERT(NVARCHAR(MAX), trans_raw.trans_xml_raw) COLLATE Latin1_General_Bin2,
  3508.                                 N'</trans_info></trans><trans><trans_info>', N''
  3509.                             )
  3510.                         )
  3511.                     FROM
  3512.                     (
  3513.                         SELECT TOP(@i)
  3514.                             CASE u_trans.r
  3515.                                 WHEN 1 THEN u_trans.session_id
  3516.                                 ELSE NULL
  3517.                             END AS [session_id],
  3518.                             CASE u_trans.r
  3519.                                 WHEN 1 THEN u_trans.request_id
  3520.                                 ELSE NULL
  3521.                             END AS [request_id],
  3522.                             CONVERT
  3523.                             (
  3524.                                 NVARCHAR(MAX),
  3525.                                 CASE
  3526.                                     WHEN u_trans.database_id IS NOT NULL THEN
  3527.                                         CASE u_trans.r
  3528.                                             WHEN 1 THEN COALESCE(CONVERT(NVARCHAR, u_trans.transaction_start_time, 121) + NCHAR(254), N'')
  3529.                                             ELSE N''
  3530.                                         END +
  3531.                                             REPLACE
  3532.                                             (
  3533.                                                 REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
  3534.                                                 REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
  3535.                                                 REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
  3536.                                                     CONVERT(VARCHAR(128), COALESCE(DB_NAME(u_trans.database_id), N'(null)')),
  3537.                                                     NCHAR(31),N'?'),NCHAR(30),N'?'),NCHAR(29),N'?'),NCHAR(28),N'?'),NCHAR(27),N'?'),NCHAR(26),N'?'),NCHAR(25),N'?'),NCHAR(24),N'?'),NCHAR(23),N'?'),NCHAR(22),N'?'),
  3538.                                                     NCHAR(21),N'?'),NCHAR(20),N'?'),NCHAR(19),N'?'),NCHAR(18),N'?'),NCHAR(17),N'?'),NCHAR(16),N'?'),NCHAR(15),N'?'),NCHAR(14),N'?'),NCHAR(12),N'?'),
  3539.                                                     NCHAR(11),N'?'),NCHAR(8),N'?'),NCHAR(7),N'?'),NCHAR(6),N'?'),NCHAR(5),N'?'),NCHAR(4),N'?'),NCHAR(3),N'?'),NCHAR(2),N'?'),NCHAR(1),N'?'),
  3540.                                                 NCHAR(0),
  3541.                                                 N'?'
  3542.                                             ) +
  3543.                                             N': ' +
  3544.                                         CONVERT(NVARCHAR, u_trans.log_record_count) + N' (' + CONVERT(NVARCHAR, u_trans.log_kb_used) + N' kB)' +
  3545.                                         N','
  3546.                                     ELSE
  3547.                                         N'N/A,'
  3548.                                 END COLLATE Latin1_General_Bin2
  3549.                             ) AS [trans_info]
  3550.                         FROM
  3551.                         (
  3552.                             SELECT TOP(@i)
  3553.                                 trans.*,
  3554.                                 ROW_NUMBER() OVER
  3555.                                 (
  3556.                                     PARTITION BY
  3557.                                         trans.session_id,
  3558.                                         trans.request_id
  3559.                                     ORDER BY
  3560.                                         trans.transaction_start_time DESC
  3561.                                 ) AS r
  3562.                             FROM
  3563.                             (
  3564.                                 SELECT TOP(@i)
  3565.                                     session_tran_map.session_id,
  3566.                                     session_tran_map.request_id,
  3567.                                     s_tran.database_id,
  3568.                                     COALESCE(SUM(s_tran.database_transaction_log_record_count), 0) AS log_record_count,
  3569.                                     COALESCE(SUM(s_tran.database_transaction_log_bytes_used), 0) / 1024 AS log_kb_used,
  3570.                                     MIN(s_tran.database_transaction_begin_time) AS transaction_start_time
  3571.                                 FROM
  3572.                                 (
  3573.                                     SELECT TOP(@i)
  3574.                                         *
  3575.                                     FROM sys.dm_tran_active_transactions
  3576.                                     WHERE
  3577.                                         transaction_begin_time <= @last_collection_start
  3578.                                 ) AS a_tran
  3579.                                 INNER HASH JOIN
  3580.                                 (
  3581.                                     SELECT TOP(@i)
  3582.                                         *
  3583.                                     FROM sys.dm_tran_database_transactions
  3584.                                     WHERE
  3585.                                         database_id < 32767
  3586.                                 ) AS s_tran ON
  3587.                                     s_tran.transaction_id = a_tran.transaction_id
  3588.                                 LEFT OUTER HASH JOIN
  3589.                                 (
  3590.                                     SELECT TOP(@i)
  3591.                                         *
  3592.                                     FROM sys.dm_tran_session_transactions
  3593.                                 ) AS tst ON
  3594.                                     s_tran.transaction_id = tst.transaction_id
  3595.                                 CROSS APPLY
  3596.                                 (
  3597.                                     SELECT TOP(1)
  3598.                                         s3.session_id,
  3599.                                         s3.request_id
  3600.                                     FROM
  3601.                                     (
  3602.                                         SELECT TOP(1)
  3603.                                             s1.session_id,
  3604.                                             s1.request_id
  3605.                                         FROM #sessions AS s1
  3606.                                         WHERE
  3607.                                             s1.transaction_id = s_tran.transaction_id
  3608.                                             AND s1.recursion = 1
  3609.                                            
  3610.                                         UNION ALL
  3611.                                    
  3612.                                         SELECT TOP(1)
  3613.                                             s2.session_id,
  3614.                                             s2.request_id
  3615.                                         FROM #sessions AS s2
  3616.                                         WHERE
  3617.                                             s2.session_id = tst.session_id
  3618.                                             AND s2.recursion = 1
  3619.                                     ) AS s3
  3620.                                     ORDER BY
  3621.                                         s3.request_id
  3622.                                 ) AS session_tran_map
  3623.                                 GROUP BY
  3624.                                     session_tran_map.session_id,
  3625.                                     session_tran_map.request_id,
  3626.                                     s_tran.database_id
  3627.                             ) AS trans
  3628.                         ) AS u_trans
  3629.                         FOR XML
  3630.                             PATH('trans'),
  3631.                             TYPE
  3632.                     ) AS trans_raw (trans_xml_raw)
  3633.                 ) AS trans_final (trans_xml)
  3634.                 CROSS APPLY trans_final.trans_xml.nodes('/trans') AS trans_nodes (trans_node)
  3635.             ) AS x
  3636.             INNER HASH JOIN #sessions AS s ON
  3637.                 s.session_id = x.session_id
  3638.                 AND s.request_id = x.request_id
  3639.             OPTION (OPTIMIZE FOR (@i = 1));
  3640.         END;
  3641.  
  3642.         --Variables for text and plan collection
  3643.         DECLARE
  3644.             @session_id SMALLINT,
  3645.             @request_id INT,
  3646.             @sql_handle VARBINARY(64),
  3647.             @plan_handle VARBINARY(64),
  3648.             @statement_start_offset INT,
  3649.             @statement_end_offset INT,
  3650.             @start_time DATETIME,
  3651.             @database_name sysname;
  3652.  
  3653.         IF
  3654.             @recursion = 1
  3655.             AND @output_column_list LIKE '%|[sql_text|]%' ESCAPE '|'
  3656.         BEGIN;
  3657.             DECLARE sql_cursor
  3658.             CURSOR LOCAL FAST_FORWARD
  3659.             FOR
  3660.                 SELECT
  3661.                     session_id,
  3662.                     request_id,
  3663.                     sql_handle,
  3664.                     statement_start_offset,
  3665.                     statement_end_offset
  3666.                 FROM #sessions
  3667.                 WHERE
  3668.                     recursion = 1
  3669.                     AND sql_handle IS NOT NULL
  3670.             OPTION (KEEPFIXED PLAN);
  3671.  
  3672.             OPEN sql_cursor;
  3673.  
  3674.             FETCH NEXT FROM sql_cursor
  3675.             INTO
  3676.                 @session_id,
  3677.                 @request_id,
  3678.                 @sql_handle,
  3679.                 @statement_start_offset,
  3680.                 @statement_end_offset;
  3681.  
  3682.             --Wait up to 5 ms for the SQL text, then give up
  3683.             SET LOCK_TIMEOUT 5;
  3684.  
  3685.             WHILE @@FETCH_STATUS = 0
  3686.             BEGIN;
  3687.                 BEGIN TRY;
  3688.                     UPDATE s
  3689.                     SET
  3690.                         s.sql_text =
  3691.                         (
  3692.                             SELECT
  3693.                                 REPLACE
  3694.                                 (
  3695.                                     REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
  3696.                                     REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
  3697.                                     REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
  3698.                                         N'--' + NCHAR(13) + NCHAR(10) +
  3699.                                         CASE
  3700.                                             WHEN @get_full_inner_text = 1 THEN est.text
  3701.                                             WHEN LEN(est.text) < (@statement_end_offset / 2) + 1 THEN est.text
  3702.                                             WHEN SUBSTRING(est.text, (@statement_start_offset/2), 2) LIKE N'[a-zA-Z0-9][a-zA-Z0-9]' THEN est.text
  3703.                                             ELSE
  3704.                                                 CASE
  3705.                                                     WHEN @statement_start_offset > 0 THEN
  3706.                                                         SUBSTRING
  3707.                                                         (
  3708.                                                             est.text,
  3709.                                                             ((@statement_start_offset/2) + 1),
  3710.                                                             (
  3711.                                                                 CASE
  3712.                                                                     WHEN @statement_end_offset = -1 THEN 2147483647
  3713.                                                                     ELSE ((@statement_end_offset - @statement_start_offset)/2) + 1
  3714.                                                                 END
  3715.                                                             )
  3716.                                                         )
  3717.                                                     ELSE RTRIM(LTRIM(est.text))
  3718.                                                 END
  3719.                                         END +
  3720.                                         NCHAR(13) + NCHAR(10) + N'--' COLLATE Latin1_General_Bin2,
  3721.                                         NCHAR(31),N'?'),NCHAR(30),N'?'),NCHAR(29),N'?'),NCHAR(28),N'?'),NCHAR(27),N'?'),NCHAR(26),N'?'),NCHAR(25),N'?'),NCHAR(24),N'?'),NCHAR(23),N'?'),NCHAR(22),N'?'),
  3722.                                         NCHAR(21),N'?'),NCHAR(20),N'?'),NCHAR(19),N'?'),NCHAR(18),N'?'),NCHAR(17),N'?'),NCHAR(16),N'?'),NCHAR(15),N'?'),NCHAR(14),N'?'),NCHAR(12),N'?'),
  3723.                                         NCHAR(11),N'?'),NCHAR(8),N'?'),NCHAR(7),N'?'),NCHAR(6),N'?'),NCHAR(5),N'?'),NCHAR(4),N'?'),NCHAR(3),N'?'),NCHAR(2),N'?'),NCHAR(1),N'?'),
  3724.                                     NCHAR(0),
  3725.                                     N''
  3726.                                 ) AS [processing-instruction(query)]
  3727.                             FOR XML
  3728.                                 PATH(''),
  3729.                                 TYPE
  3730.                         ),
  3731.                         s.statement_start_offset =
  3732.                             CASE
  3733.                                 WHEN LEN(est.text) < (@statement_end_offset / 2) + 1 THEN 0
  3734.                                 WHEN SUBSTRING(CONVERT(VARCHAR(MAX), est.text), (@statement_start_offset/2), 2) LIKE '[a-zA-Z0-9][a-zA-Z0-9]' THEN 0
  3735.                                 ELSE @statement_start_offset
  3736.                             END,
  3737.                         s.statement_end_offset =
  3738.                             CASE
  3739.                                 WHEN LEN(est.text) < (@statement_end_offset / 2) + 1 THEN -1
  3740.                                 WHEN SUBSTRING(CONVERT(VARCHAR(MAX), est.text), (@statement_start_offset/2), 2) LIKE '[a-zA-Z0-9][a-zA-Z0-9]' THEN -1
  3741.                                 ELSE @statement_end_offset
  3742.                             END
  3743.                     FROM
  3744.                         #sessions AS s,
  3745.                         (
  3746.                             SELECT TOP(1)
  3747.                                 text
  3748.                             FROM
  3749.                             (
  3750.                                 SELECT
  3751.                                     text,
  3752.                                     0 AS row_num
  3753.                                 FROM sys.dm_exec_sql_text(@sql_handle)
  3754.                                
  3755.                                 UNION ALL
  3756.                                
  3757.                                 SELECT
  3758.                                     NULL,
  3759.                                     1 AS row_num
  3760.                             ) AS est0
  3761.                             ORDER BY
  3762.                                 row_num
  3763.                         ) AS est
  3764.                     WHERE
  3765.                         s.session_id = @session_id
  3766.                         AND s.request_id = @request_id
  3767.                         AND s.recursion = 1
  3768.                     OPTION (KEEPFIXED PLAN);
  3769.                 END TRY
  3770.                 BEGIN CATCH;
  3771.                     UPDATE s
  3772.                     SET
  3773.                         s.sql_text =
  3774.                             CASE ERROR_NUMBER()
  3775.                                 WHEN 1222 THEN '<timeout_exceeded />'
  3776.                                 ELSE '<error message="' + ERROR_MESSAGE() + '" />'
  3777.                             END
  3778.                     FROM #sessions AS s
  3779.                     WHERE
  3780.                         s.session_id = @session_id
  3781.                         AND s.request_id = @request_id
  3782.                         AND s.recursion = 1
  3783.                     OPTION (KEEPFIXED PLAN);
  3784.                 END CATCH;
  3785.  
  3786.                 FETCH NEXT FROM sql_cursor
  3787.                 INTO
  3788.                     @session_id,
  3789.                     @request_id,
  3790.                     @sql_handle,
  3791.                     @statement_start_offset,
  3792.                     @statement_end_offset;
  3793.             END;
  3794.  
  3795.             --Return this to the default
  3796.             SET LOCK_TIMEOUT -1;
  3797.  
  3798.             CLOSE sql_cursor;
  3799.             DEALLOCATE sql_cursor;
  3800.         END;
  3801.  
  3802.         IF
  3803.             @get_outer_command = 1
  3804.             AND @recursion = 1
  3805.             AND @output_column_list LIKE '%|[sql_command|]%' ESCAPE '|'
  3806.         BEGIN;
  3807.             DECLARE @buffer_results TABLE
  3808.             (
  3809.                 EventType VARCHAR(30),
  3810.                 Parameters INT,
  3811.                 EventInfo NVARCHAR(4000),
  3812.                 start_time DATETIME,
  3813.                 session_number INT IDENTITY(1,1) NOT NULL PRIMARY KEY
  3814.             );
  3815.  
  3816.             DECLARE buffer_cursor
  3817.             CURSOR LOCAL FAST_FORWARD
  3818.             FOR
  3819.                 SELECT
  3820.                     session_id,
  3821.                     MAX(start_time) AS start_time
  3822.                 FROM #sessions
  3823.                 WHERE
  3824.                     recursion = 1
  3825.                 GROUP BY
  3826.                     session_id
  3827.                 ORDER BY
  3828.                     session_id
  3829.                 OPTION (KEEPFIXED PLAN);
  3830.  
  3831.             OPEN buffer_cursor;
  3832.  
  3833.             FETCH NEXT FROM buffer_cursor
  3834.             INTO
  3835.                 @session_id,
  3836.                 @start_time;
  3837.  
  3838.             WHILE @@FETCH_STATUS = 0
  3839.             BEGIN;
  3840.                 BEGIN TRY;
  3841.                     --In SQL Server 2008, DBCC INPUTBUFFER will throw
  3842.                     --an exception if the session no longer exists
  3843.                     INSERT @buffer_results
  3844.                     (
  3845.                         EventType,
  3846.                         Parameters,
  3847.                         EventInfo
  3848.                     )
  3849.                     EXEC sp_executesql
  3850.                         N'DBCC INPUTBUFFER(@session_id) WITH NO_INFOMSGS;',
  3851.                         N'@session_id SMALLINT',
  3852.                         @session_id;
  3853.  
  3854.                     UPDATE br
  3855.                     SET
  3856.                         br.start_time = @start_time
  3857.                     FROM @buffer_results AS br
  3858.                     WHERE
  3859.                         br.session_number =
  3860.                         (
  3861.                             SELECT MAX(br2.session_number)
  3862.                             FROM @buffer_results br2
  3863.                         );
  3864.                 END TRY
  3865.                 BEGIN CATCH
  3866.                 END CATCH;
  3867.  
  3868.                 FETCH NEXT FROM buffer_cursor
  3869.                 INTO
  3870.                     @session_id,
  3871.                     @start_time;
  3872.             END;
  3873.  
  3874.             UPDATE s
  3875.             SET
  3876.                 sql_command =
  3877.                 (
  3878.                     SELECT
  3879.                         REPLACE
  3880.                         (
  3881.                             REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
  3882.                             REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
  3883.                             REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
  3884.                                 CONVERT
  3885.                                 (
  3886.                                     NVARCHAR(MAX),
  3887.                                     N'--' + NCHAR(13) + NCHAR(10) + br.EventInfo + NCHAR(13) + NCHAR(10) + N'--' COLLATE Latin1_General_Bin2
  3888.                                 ),
  3889.                                 NCHAR(31),N'?'),NCHAR(30),N'?'),NCHAR(29),N'?'),NCHAR(28),N'?'),NCHAR(27),N'?'),NCHAR(26),N'?'),NCHAR(25),N'?'),NCHAR(24),N'?'),NCHAR(23),N'?'),NCHAR(22),N'?'),
  3890.                                 NCHAR(21),N'?'),NCHAR(20),N'?'),NCHAR(19),N'?'),NCHAR(18),N'?'),NCHAR(17),N'?'),NCHAR(16),N'?'),NCHAR(15),N'?'),NCHAR(14),N'?'),NCHAR(12),N'?'),
  3891.                                 NCHAR(11),N'?'),NCHAR(8),N'?'),NCHAR(7),N'?'),NCHAR(6),N'?'),NCHAR(5),N'?'),NCHAR(4),N'?'),NCHAR(3),N'?'),NCHAR(2),N'?'),NCHAR(1),N'?'),
  3892.                             NCHAR(0),
  3893.                             N''
  3894.                         ) AS [processing-instruction(query)]
  3895.                     FROM @buffer_results AS br
  3896.                     WHERE
  3897.                         br.session_number = s.session_number
  3898.                         AND br.start_time = s.start_time
  3899.                         AND
  3900.                         (
  3901.                             (
  3902.                                 s.start_time = s.last_request_start_time
  3903.                                 AND EXISTS
  3904.                                 (
  3905.                                     SELECT *
  3906.                                     FROM sys.dm_exec_requests r2
  3907.                                     WHERE
  3908.                                         r2.session_id = s.session_id
  3909.                                         AND r2.request_id = s.request_id
  3910.                                         AND r2.start_time = s.start_time
  3911.                                 )
  3912.                             )
  3913.                             OR
  3914.                             (
  3915.                                 s.request_id = 0
  3916.                                 AND EXISTS
  3917.                                 (
  3918.                                     SELECT *
  3919.                                     FROM sys.dm_exec_sessions s2
  3920.                                     WHERE
  3921.                                         s2.session_id = s.session_id
  3922.                                         AND s2.last_request_start_time = s.last_request_start_time
  3923.                                 )
  3924.                             )
  3925.                         )
  3926.                     FOR XML
  3927.                         PATH(''),
  3928.                         TYPE
  3929.                 )
  3930.             FROM #sessions AS s
  3931.             WHERE
  3932.                 recursion = 1
  3933.             OPTION (KEEPFIXED PLAN);
  3934.  
  3935.             CLOSE buffer_cursor;
  3936.             DEALLOCATE buffer_cursor;
  3937.         END;
  3938.  
  3939.         IF
  3940.             @get_plans >= 1
  3941.             AND @recursion = 1
  3942.             AND @output_column_list LIKE '%|[query_plan|]%' ESCAPE '|'
  3943.         BEGIN;
  3944.             DECLARE plan_cursor
  3945.             CURSOR LOCAL FAST_FORWARD
  3946.             FOR
  3947.                 SELECT
  3948.                     session_id,
  3949.                     request_id,
  3950.                     plan_handle,
  3951.                     statement_start_offset,
  3952.                     statement_end_offset
  3953.                 FROM #sessions
  3954.                 WHERE
  3955.                     recursion = 1
  3956.                     AND plan_handle IS NOT NULL
  3957.             OPTION (KEEPFIXED PLAN);
  3958.  
  3959.             OPEN plan_cursor;
  3960.  
  3961.             FETCH NEXT FROM plan_cursor
  3962.             INTO
  3963.                 @session_id,
  3964.                 @request_id,
  3965.                 @plan_handle,
  3966.                 @statement_start_offset,
  3967.                 @statement_end_offset;
  3968.  
  3969.             --Wait up to 5 ms for a query plan, then give up
  3970.             SET LOCK_TIMEOUT 5;
  3971.  
  3972.             WHILE @@FETCH_STATUS = 0
  3973.             BEGIN;
  3974.                 BEGIN TRY;
  3975.                     UPDATE s
  3976.                     SET
  3977.                         s.query_plan =
  3978.                         (
  3979.                             SELECT
  3980.                                 CONVERT(xml, query_plan)
  3981.                             FROM sys.dm_exec_text_query_plan
  3982.                             (
  3983.                                 @plan_handle,
  3984.                                 CASE @get_plans
  3985.                                     WHEN 1 THEN
  3986.                                         @statement_start_offset
  3987.                                     ELSE
  3988.                                         0
  3989.                                 END,
  3990.                                 CASE @get_plans
  3991.                                     WHEN 1 THEN
  3992.                                         @statement_end_offset
  3993.                                     ELSE
  3994.                                         -1
  3995.                                 END
  3996.                             )
  3997.                         )
  3998.                     FROM #sessions AS s
  3999.                     WHERE
  4000.                         s.session_id = @session_id
  4001.                         AND s.request_id = @request_id
  4002.                         AND s.recursion = 1
  4003.                     OPTION (KEEPFIXED PLAN);
  4004.                 END TRY
  4005.                 BEGIN CATCH;
  4006.                     IF ERROR_NUMBER() = 6335
  4007.                     BEGIN;
  4008.                         UPDATE s
  4009.                         SET
  4010.                             s.query_plan =
  4011.                             (
  4012.                                 SELECT
  4013.                                     N'--' + NCHAR(13) + NCHAR(10) +
  4014.                                     N'-- Could not render showplan due to XML data type limitations. ' + NCHAR(13) + NCHAR(10) +
  4015.                                     N'-- To see the graphical plan save the XML below as a .SQLPLAN file and re-open in SSMS.' + NCHAR(13) + NCHAR(10) +
  4016.                                     N'--' + NCHAR(13) + NCHAR(10) +
  4017.                                         REPLACE(qp.query_plan, N'<RelOp', NCHAR(13)+NCHAR(10)+N'<RelOp') +
  4018.                                         NCHAR(13) + NCHAR(10) + N'--' COLLATE Latin1_General_Bin2 AS [processing-instruction(query_plan)]
  4019.                                 FROM sys.dm_exec_text_query_plan
  4020.                                 (
  4021.                                     @plan_handle,
  4022.                                     CASE @get_plans
  4023.                                         WHEN 1 THEN
  4024.                                             @statement_start_offset
  4025.                                         ELSE
  4026.                                             0
  4027.                                     END,
  4028.                                     CASE @get_plans
  4029.                                         WHEN 1 THEN
  4030.                                             @statement_end_offset
  4031.                                         ELSE
  4032.                                             -1
  4033.                                     END
  4034.                                 ) AS qp
  4035.                                 FOR XML
  4036.                                     PATH(''),
  4037.                                     TYPE
  4038.                             )
  4039.                         FROM #sessions AS s
  4040.                         WHERE
  4041.                             s.session_id = @session_id
  4042.                             AND s.request_id = @request_id
  4043.                             AND s.recursion = 1
  4044.                         OPTION (KEEPFIXED PLAN);
  4045.                     END;
  4046.                     ELSE
  4047.                     BEGIN;
  4048.                         UPDATE s
  4049.                         SET
  4050.                             s.query_plan =
  4051.                                 CASE ERROR_NUMBER()
  4052.                                     WHEN 1222 THEN '<timeout_exceeded />'
  4053.                                     ELSE '<error message="' + ERROR_MESSAGE() + '" />'
  4054.                                 END
  4055.                         FROM #sessions AS s
  4056.                         WHERE
  4057.                             s.session_id = @session_id
  4058.                             AND s.request_id = @request_id
  4059.                             AND s.recursion = 1
  4060.                         OPTION (KEEPFIXED PLAN);
  4061.                     END;
  4062.                 END CATCH;
  4063.  
  4064.                 FETCH NEXT FROM plan_cursor
  4065.                 INTO
  4066.                     @session_id,
  4067.                     @request_id,
  4068.                     @plan_handle,
  4069.                     @statement_start_offset,
  4070.                     @statement_end_offset;
  4071.             END;
  4072.  
  4073.             --Return this to the default
  4074.             SET LOCK_TIMEOUT -1;
  4075.  
  4076.             CLOSE plan_cursor;
  4077.             DEALLOCATE plan_cursor;
  4078.         END;
  4079.  
  4080.         IF
  4081.             @get_locks = 1
  4082.             AND @recursion = 1
  4083.             AND @output_column_list LIKE '%|[locks|]%' ESCAPE '|'
  4084.         BEGIN;
  4085.             DECLARE locks_cursor
  4086.             CURSOR LOCAL FAST_FORWARD
  4087.             FOR
  4088.                 SELECT DISTINCT
  4089.                     database_name
  4090.                 FROM #locks
  4091.                 WHERE
  4092.                     EXISTS
  4093.                     (
  4094.                         SELECT *
  4095.                         FROM #sessions AS s
  4096.                         WHERE
  4097.                             s.session_id = #locks.session_id
  4098.                             AND recursion = 1
  4099.                     )
  4100.                     AND database_name <> '(null)'
  4101.                 OPTION (KEEPFIXED PLAN);
  4102.  
  4103.             OPEN locks_cursor;
  4104.  
  4105.             FETCH NEXT FROM locks_cursor
  4106.             INTO
  4107.                 @database_name;
  4108.  
  4109.             WHILE @@FETCH_STATUS = 0
  4110.             BEGIN;
  4111.                 BEGIN TRY;
  4112.                     SET @sql_n = CONVERT(NVARCHAR(MAX), '') +
  4113.                         'UPDATE l ' +
  4114.                         'SET ' +
  4115.                             'object_name = ' +
  4116.                                 'REPLACE ' +
  4117.                                 '( ' +
  4118.                                     'REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE( ' +
  4119.                                     'REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE( ' +
  4120.                                     'REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE( ' +
  4121.                                         'o.name COLLATE Latin1_General_Bin2, ' +
  4122.                                         'NCHAR(31),N''?''),NCHAR(30),N''?''),NCHAR(29),N''?''),NCHAR(28),N''?''),NCHAR(27),N''?''),NCHAR(26),N''?''),NCHAR(25),N''?''),NCHAR(24),N''?''),NCHAR(23),N''?''),NCHAR(22),N''?''), ' +
  4123.                                         'NCHAR(21),N''?''),NCHAR(20),N''?''),NCHAR(19),N''?''),NCHAR(18),N''?''),NCHAR(17),N''?''),NCHAR(16),N''?''),NCHAR(15),N''?''),NCHAR(14),N''?''),NCHAR(12),N''?''), ' +
  4124.                                         'NCHAR(11),N''?''),NCHAR(8),N''?''),NCHAR(7),N''?''),NCHAR(6),N''?''),NCHAR(5),N''?''),NCHAR(4),N''?''),NCHAR(3),N''?''),NCHAR(2),N''?''),NCHAR(1),N''?''), ' +
  4125.                                     'NCHAR(0), ' +
  4126.                                     N''''' ' +
  4127.                                 '), ' +
  4128.                             'index_name = ' +
  4129.                                 'REPLACE ' +
  4130.                                 '( ' +
  4131.                                     'REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE( ' +
  4132.                                     'REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE( ' +
  4133.                                     'REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE( ' +
  4134.                                         'i.name COLLATE Latin1_General_Bin2, ' +
  4135.                                         'NCHAR(31),N''?''),NCHAR(30),N''?''),NCHAR(29),N''?''),NCHAR(28),N''?''),NCHAR(27),N''?''),NCHAR(26),N''?''),NCHAR(25),N''?''),NCHAR(24),N''?''),NCHAR(23),N''?''),NCHAR(22),N''?''), ' +
  4136.                                         'NCHAR(21),N''?''),NCHAR(20),N''?''),NCHAR(19),N''?''),NCHAR(18),N''?''),NCHAR(17),N''?''),NCHAR(16),N''?''),NCHAR(15),N''?''),NCHAR(14),N''?''),NCHAR(12),N''?''), ' +
  4137.                                         'NCHAR(11),N''?''),NCHAR(8),N''?''),NCHAR(7),N''?''),NCHAR(6),N''?''),NCHAR(5),N''?''),NCHAR(4),N''?''),NCHAR(3),N''?''),NCHAR(2),N''?''),NCHAR(1),N''?''), ' +
  4138.                                     'NCHAR(0), ' +
  4139.                                     N''''' ' +
  4140.                                 '), ' +
  4141.                             'schema_name = ' +
  4142.                                 'REPLACE ' +
  4143.                                 '( ' +
  4144.                                     'REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE( ' +
  4145.                                     'REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE( ' +
  4146.                                     'REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE( ' +
  4147.                                         's.name COLLATE Latin1_General_Bin2, ' +
  4148.                                         'NCHAR(31),N''?''),NCHAR(30),N''?''),NCHAR(29),N''?''),NCHAR(28),N''?''),NCHAR(27),N''?''),NCHAR(26),N''?''),NCHAR(25),N''?''),NCHAR(24),N''?''),NCHAR(23),N''?''),NCHAR(22),N''?''), ' +
  4149.                                         'NCHAR(21),N''?''),NCHAR(20),N''?''),NCHAR(19),N''?''),NCHAR(18),N''?''),NCHAR(17),N''?''),NCHAR(16),N''?''),NCHAR(15),N''?''),NCHAR(14),N''?''),NCHAR(12),N''?''), ' +
  4150.                                         'NCHAR(11),N''?''),NCHAR(8),N''?''),NCHAR(7),N''?''),NCHAR(6),N''?''),NCHAR(5),N''?''),NCHAR(4),N''?''),NCHAR(3),N''?''),NCHAR(2),N''?''),NCHAR(1),N''?''), ' +
  4151.                                     'NCHAR(0), ' +
  4152.                                     N''''' ' +
  4153.                                 '), ' +
  4154.                             'principal_name = ' +
  4155.                                 'REPLACE ' +
  4156.                                 '( ' +
  4157.                                     'REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE( ' +
  4158.                                     'REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE( ' +
  4159.                                     'REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE( ' +
  4160.                                         'dp.name COLLATE Latin1_General_Bin2, ' +
  4161.                                         'NCHAR(31),N''?''),NCHAR(30),N''?''),NCHAR(29),N''?''),NCHAR(28),N''?''),NCHAR(27),N''?''),NCHAR(26),N''?''),NCHAR(25),N''?''),NCHAR(24),N''?''),NCHAR(23),N''?''),NCHAR(22),N''?''), ' +
  4162.                                         'NCHAR(21),N''?''),NCHAR(20),N''?''),NCHAR(19),N''?''),NCHAR(18),N''?''),NCHAR(17),N''?''),NCHAR(16),N''?''),NCHAR(15),N''?''),NCHAR(14),N''?''),NCHAR(12),N''?''), ' +
  4163.                                         'NCHAR(11),N''?''),NCHAR(8),N''?''),NCHAR(7),N''?''),NCHAR(6),N''?''),NCHAR(5),N''?''),NCHAR(4),N''?''),NCHAR(3),N''?''),NCHAR(2),N''?''),NCHAR(1),N''?''), ' +
  4164.                                     'NCHAR(0), ' +
  4165.                                     N''''' ' +
  4166.                                 ') ' +
  4167.                         'FROM #locks AS l ' +
  4168.                         'LEFT OUTER JOIN ' + QUOTENAME(@database_name) + '.sys.allocation_units AS au ON ' +
  4169.                             'au.allocation_unit_id = l.allocation_unit_id ' +
  4170.                         'LEFT OUTER JOIN ' + QUOTENAME(@database_name) + '.sys.partitions AS p ON ' +
  4171.                             'p.hobt_id = ' +
  4172.                                 'COALESCE ' +
  4173.                                 '( ' +
  4174.                                     'l.hobt_id, ' +
  4175.                                     'CASE ' +
  4176.                                         'WHEN au.type IN (1, 3) THEN au.container_id ' +
  4177.                                         'ELSE NULL ' +
  4178.                                     'END ' +
  4179.                                 ') ' +
  4180.                         'LEFT OUTER JOIN ' + QUOTENAME(@database_name) + '.sys.partitions AS p1 ON ' +
  4181.                             'l.hobt_id IS NULL ' +
  4182.                             'AND au.type = 2 ' +
  4183.                             'AND p1.partition_id = au.container_id ' +
  4184.                         'LEFT OUTER JOIN ' + QUOTENAME(@database_name) + '.sys.objects AS o ON ' +
  4185.                             'o.object_id = COALESCE(l.object_id, p.object_id, p1.object_id) ' +
  4186.                         'LEFT OUTER JOIN ' + QUOTENAME(@database_name) + '.sys.indexes AS i ON ' +
  4187.                             'i.object_id = COALESCE(l.object_id, p.object_id, p1.object_id) ' +
  4188.                             'AND i.index_id = COALESCE(l.index_id, p.index_id, p1.index_id) ' +
  4189.                         'LEFT OUTER JOIN ' + QUOTENAME(@database_name) + '.sys.schemas AS s ON ' +
  4190.                             's.schema_id = COALESCE(l.schema_id, o.schema_id) ' +
  4191.                         'LEFT OUTER JOIN ' + QUOTENAME(@database_name) + '.sys.database_principals AS dp ON ' +
  4192.                             'dp.principal_id = l.principal_id ' +
  4193.                         'WHERE ' +
  4194.                             'l.database_name = @database_name ' +
  4195.                         'OPTION (KEEPFIXED PLAN); ';
  4196.                    
  4197.                     EXEC sp_executesql
  4198.                         @sql_n,
  4199.                         N'@database_name sysname',
  4200.                         @database_name;
  4201.                 END TRY
  4202.                 BEGIN CATCH;
  4203.                     UPDATE #locks
  4204.                     SET
  4205.                         query_error =
  4206.                             REPLACE
  4207.                             (
  4208.                                 REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
  4209.                                 REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
  4210.                                 REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
  4211.                                     CONVERT
  4212.                                     (
  4213.                                         NVARCHAR(MAX),
  4214.                                         ERROR_MESSAGE() COLLATE Latin1_General_Bin2
  4215.                                     ),
  4216.                                     NCHAR(31),N'?'),NCHAR(30),N'?'),NCHAR(29),N'?'),NCHAR(28),N'?'),NCHAR(27),N'?'),NCHAR(26),N'?'),NCHAR(25),N'?'),NCHAR(24),N'?'),NCHAR(23),N'?'),NCHAR(22),N'?'),
  4217.                                     NCHAR(21),N'?'),NCHAR(20),N'?'),NCHAR(19),N'?'),NCHAR(18),N'?'),NCHAR(17),N'?'),NCHAR(16),N'?'),NCHAR(15),N'?'),NCHAR(14),N'?'),NCHAR(12),N'?'),
  4218.                                     NCHAR(11),N'?'),NCHAR(8),N'?'),NCHAR(7),N'?'),NCHAR(6),N'?'),NCHAR(5),N'?'),NCHAR(4),N'?'),NCHAR(3),N'?'),NCHAR(2),N'?'),NCHAR(1),N'?'),
  4219.                                 NCHAR(0),
  4220.                                 N''
  4221.                             )
  4222.                     WHERE
  4223.                         database_name = @database_name
  4224.                     OPTION (KEEPFIXED PLAN);
  4225.                 END CATCH;
  4226.  
  4227.                 FETCH NEXT FROM locks_cursor
  4228.                 INTO
  4229.                     @database_name;
  4230.             END;
  4231.  
  4232.             CLOSE locks_cursor;
  4233.             DEALLOCATE locks_cursor;
  4234.  
  4235.             CREATE CLUSTERED INDEX IX_SRD ON #locks (session_id, request_id, database_name);
  4236.  
  4237.             UPDATE s
  4238.             SET
  4239.                 s.locks =
  4240.                 (
  4241.                     SELECT
  4242.                         REPLACE
  4243.                         (
  4244.                             REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
  4245.                             REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
  4246.                             REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
  4247.                                 CONVERT
  4248.                                 (
  4249.                                     NVARCHAR(MAX),
  4250.                                     l1.database_name COLLATE Latin1_General_Bin2
  4251.                                 ),
  4252.                                 NCHAR(31),N'?'),NCHAR(30),N'?'),NCHAR(29),N'?'),NCHAR(28),N'?'),NCHAR(27),N'?'),NCHAR(26),N'?'),NCHAR(25),N'?'),NCHAR(24),N'?'),NCHAR(23),N'?'),NCHAR(22),N'?'),
  4253.                                 NCHAR(21),N'?'),NCHAR(20),N'?'),NCHAR(19),N'?'),NCHAR(18),N'?'),NCHAR(17),N'?'),NCHAR(16),N'?'),NCHAR(15),N'?'),NCHAR(14),N'?'),NCHAR(12),N'?'),
  4254.                                 NCHAR(11),N'?'),NCHAR(8),N'?'),NCHAR(7),N'?'),NCHAR(6),N'?'),NCHAR(5),N'?'),NCHAR(4),N'?'),NCHAR(3),N'?'),NCHAR(2),N'?'),NCHAR(1),N'?'),
  4255.                             NCHAR(0),
  4256.                             N''
  4257.                         ) AS [Database/@name],
  4258.                         MIN(l1.query_error) AS [Database/@query_error],
  4259.                         (
  4260.                             SELECT
  4261.                                 l2.request_mode AS [Lock/@request_mode],
  4262.                                 l2.request_status AS [Lock/@request_status],
  4263.                                 COUNT(*) AS [Lock/@request_count]
  4264.                             FROM #locks AS l2
  4265.                             WHERE
  4266.                                 l1.session_id = l2.session_id
  4267.                                 AND l1.request_id = l2.request_id
  4268.                                 AND l2.database_name = l1.database_name
  4269.                                 AND l2.resource_type = 'DATABASE'
  4270.                             GROUP BY
  4271.                                 l2.request_mode,
  4272.                                 l2.request_status
  4273.                             FOR XML
  4274.                                 PATH(''),
  4275.                                 TYPE
  4276.                         ) AS [Database/Locks],
  4277.                         (
  4278.                             SELECT
  4279.                                 COALESCE(l3.object_name, '(null)') AS [Object/@name],
  4280.                                 l3.schema_name AS [Object/@schema_name],
  4281.                                 (
  4282.                                     SELECT
  4283.                                         l4.resource_type AS [Lock/@resource_type],
  4284.                                         l4.page_type AS [Lock/@page_type],
  4285.                                         l4.index_name AS [Lock/@index_name],
  4286.                                         CASE
  4287.                                             WHEN l4.object_name IS NULL THEN l4.schema_name
  4288.                                             ELSE NULL
  4289.                                         END AS [Lock/@schema_name],
  4290.                                         l4.principal_name AS [Lock/@principal_name],
  4291.                                         l4.resource_description AS [Lock/@resource_description],
  4292.                                         l4.request_mode AS [Lock/@request_mode],
  4293.                                         l4.request_status AS [Lock/@request_status],
  4294.                                         SUM(l4.request_count) AS [Lock/@request_count]
  4295.                                     FROM #locks AS l4
  4296.                                     WHERE
  4297.                                         l4.session_id = l3.session_id
  4298.                                         AND l4.request_id = l3.request_id
  4299.                                         AND l3.database_name = l4.database_name
  4300.                                         AND COALESCE(l3.object_name, '(null)') = COALESCE(l4.object_name, '(null)')
  4301.                                         AND COALESCE(l3.schema_name, '') = COALESCE(l4.schema_name, '')
  4302.                                         AND l4.resource_type <> 'DATABASE'
  4303.                                     GROUP BY
  4304.                                         l4.resource_type,
  4305.                                         l4.page_type,
  4306.                                         l4.index_name,
  4307.                                         CASE
  4308.                                             WHEN l4.object_name IS NULL THEN l4.schema_name
  4309.                                             ELSE NULL
  4310.                                         END,
  4311.                                         l4.principal_name,
  4312.                                         l4.resource_description,
  4313.                                         l4.request_mode,
  4314.                                         l4.request_status
  4315.                                     FOR XML
  4316.                                         PATH(''),
  4317.                                         TYPE
  4318.                                 ) AS [Object/Locks]
  4319.                             FROM #locks AS l3
  4320.                             WHERE
  4321.                                 l3.session_id = l1.session_id
  4322.                                 AND l3.request_id = l1.request_id
  4323.                                 AND l3.database_name = l1.database_name
  4324.                                 AND l3.resource_type <> 'DATABASE'
  4325.                             GROUP BY
  4326.                                 l3.session_id,
  4327.                                 l3.request_id,
  4328.                                 l3.database_name,
  4329.                                 COALESCE(l3.object_name, '(null)'),
  4330.                                 l3.schema_name
  4331.                             FOR XML
  4332.                                 PATH(''),
  4333.                                 TYPE
  4334.                         ) AS [Database/Objects]
  4335.                     FROM #locks AS l1
  4336.                     WHERE
  4337.                         l1.session_id = s.session_id
  4338.                         AND l1.request_id = s.request_id
  4339.                         AND l1.start_time IN (s.start_time, s.last_request_start_time)
  4340.                         AND s.recursion = 1
  4341.                     GROUP BY
  4342.                         l1.session_id,
  4343.                         l1.request_id,
  4344.                         l1.database_name
  4345.                     FOR XML
  4346.                         PATH(''),
  4347.                         TYPE
  4348.                 )
  4349.             FROM #sessions s
  4350.             OPTION (KEEPFIXED PLAN);
  4351.         END;
  4352.  
  4353.         IF
  4354.             @find_block_leaders = 1
  4355.             AND @recursion = 1
  4356.             AND @output_column_list LIKE '%|[blocked_session_count|]%' ESCAPE '|'
  4357.         BEGIN;
  4358.             WITH
  4359.             blockers AS
  4360.             (
  4361.                 SELECT
  4362.                     session_id,
  4363.                     session_id AS top_level_session_id
  4364.                 FROM #sessions
  4365.                 WHERE
  4366.                     recursion = 1
  4367.  
  4368.                 UNION ALL
  4369.  
  4370.                 SELECT
  4371.                     s.session_id,
  4372.                     b.top_level_session_id
  4373.                 FROM blockers AS b
  4374.                 JOIN #sessions AS s ON
  4375.                     s.blocking_session_id = b.session_id
  4376.                     AND s.recursion = 1
  4377.             )
  4378.             UPDATE s
  4379.             SET
  4380.                 s.blocked_session_count = x.blocked_session_count
  4381.             FROM #sessions AS s
  4382.             JOIN
  4383.             (
  4384.                 SELECT
  4385.                     b.top_level_session_id AS session_id,
  4386.                     COUNT(*) - 1 AS blocked_session_count
  4387.                 FROM blockers AS b
  4388.                 GROUP BY
  4389.                     b.top_level_session_id
  4390.             ) x ON
  4391.                 s.session_id = x.session_id
  4392.             WHERE
  4393.                 s.recursion = 1;
  4394.         END;
  4395.  
  4396.         IF
  4397.             @get_task_info = 2
  4398.             AND @output_column_list LIKE '%|[additional_info|]%' ESCAPE '|'
  4399.             AND @recursion = 1
  4400.         BEGIN;
  4401.             CREATE TABLE #blocked_requests
  4402.             (
  4403.                 session_id SMALLINT NOT NULL,
  4404.                 request_id INT NOT NULL,
  4405.                 database_name sysname NOT NULL,
  4406.                 object_id INT,
  4407.                 hobt_id BIGINT,
  4408.                 schema_id INT,
  4409.                 schema_name sysname NULL,
  4410.                 object_name sysname NULL,
  4411.                 query_error NVARCHAR(2048),
  4412.                 PRIMARY KEY (database_name, session_id, request_id)
  4413.             );
  4414.  
  4415.             CREATE STATISTICS s_database_name ON #blocked_requests (database_name)
  4416.             WITH SAMPLE 0 ROWS, NORECOMPUTE;
  4417.             CREATE STATISTICS s_schema_name ON #blocked_requests (schema_name)
  4418.             WITH SAMPLE 0 ROWS, NORECOMPUTE;
  4419.             CREATE STATISTICS s_object_name ON #blocked_requests (object_name)
  4420.             WITH SAMPLE 0 ROWS, NORECOMPUTE;
  4421.             CREATE STATISTICS s_query_error ON #blocked_requests (query_error)
  4422.             WITH SAMPLE 0 ROWS, NORECOMPUTE;
  4423.        
  4424.             INSERT #blocked_requests
  4425.             (
  4426.                 session_id,
  4427.                 request_id,
  4428.                 database_name,
  4429.                 object_id,
  4430.                 hobt_id,
  4431.                 schema_id
  4432.             )
  4433.             SELECT
  4434.                 session_id,
  4435.                 request_id,
  4436.                 database_name,
  4437.                 object_id,
  4438.                 hobt_id,
  4439.                 CONVERT(INT, SUBSTRING(schema_node, CHARINDEX(' = ', schema_node) + 3, LEN(schema_node))) AS schema_id
  4440.             FROM
  4441.             (
  4442.                 SELECT
  4443.                     session_id,
  4444.                     request_id,
  4445.                     agent_nodes.agent_node.value('(database_name/text())[1]', 'sysname') AS database_name,
  4446.                     agent_nodes.agent_node.value('(object_id/text())[1]', 'int') AS object_id,
  4447.                     agent_nodes.agent_node.value('(hobt_id/text())[1]', 'bigint') AS hobt_id,
  4448.                     agent_nodes.agent_node.value('(metadata_resource/text()[.="SCHEMA"]/../../metadata_class_id/text())[1]', 'varchar(100)') AS schema_node
  4449.                 FROM #sessions AS s
  4450.                 CROSS APPLY s.additional_info.nodes('//block_info') AS agent_nodes (agent_node)
  4451.                 WHERE
  4452.                     s.recursion = 1
  4453.             ) AS t
  4454.             WHERE
  4455.                 t.database_name IS NOT NULL
  4456.                 AND
  4457.                 (
  4458.                     t.object_id IS NOT NULL
  4459.                     OR t.hobt_id IS NOT NULL
  4460.                     OR t.schema_node IS NOT NULL
  4461.                 );
  4462.            
  4463.             DECLARE blocks_cursor
  4464.             CURSOR LOCAL FAST_FORWARD
  4465.             FOR
  4466.                 SELECT DISTINCT
  4467.                     database_name
  4468.                 FROM #blocked_requests;
  4469.                
  4470.             OPEN blocks_cursor;
  4471.            
  4472.             FETCH NEXT FROM blocks_cursor
  4473.             INTO
  4474.                 @database_name;
  4475.            
  4476.             WHILE @@FETCH_STATUS = 0
  4477.             BEGIN;
  4478.                 BEGIN TRY;
  4479.                     SET @sql_n =
  4480.                         CONVERT(NVARCHAR(MAX), '') +
  4481.                         'UPDATE b ' +
  4482.                         'SET ' +
  4483.                             'b.schema_name = ' +
  4484.                                 'REPLACE ' +
  4485.                                 '( ' +
  4486.                                     'REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE( ' +
  4487.                                     'REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE( ' +
  4488.                                     'REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE( ' +
  4489.                                         's.name COLLATE Latin1_General_Bin2, ' +
  4490.                                         'NCHAR(31),N''?''),NCHAR(30),N''?''),NCHAR(29),N''?''),NCHAR(28),N''?''),NCHAR(27),N''?''),NCHAR(26),N''?''),NCHAR(25),N''?''),NCHAR(24),N''?''),NCHAR(23),N''?''),NCHAR(22),N''?''), ' +
  4491.                                         'NCHAR(21),N''?''),NCHAR(20),N''?''),NCHAR(19),N''?''),NCHAR(18),N''?''),NCHAR(17),N''?''),NCHAR(16),N''?''),NCHAR(15),N''?''),NCHAR(14),N''?''),NCHAR(12),N''?''), ' +
  4492.                                         'NCHAR(11),N''?''),NCHAR(8),N''?''),NCHAR(7),N''?''),NCHAR(6),N''?''),NCHAR(5),N''?''),NCHAR(4),N''?''),NCHAR(3),N''?''),NCHAR(2),N''?''),NCHAR(1),N''?''), ' +
  4493.                                     'NCHAR(0), ' +
  4494.                                     N''''' ' +
  4495.                                 '), ' +
  4496.                             'b.object_name = ' +
  4497.                                 'REPLACE ' +
  4498.                                 '( ' +
  4499.                                     'REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE( ' +
  4500.                                     'REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE( ' +
  4501.                                     'REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE( ' +
  4502.                                         'o.name COLLATE Latin1_General_Bin2, ' +
  4503.                                         'NCHAR(31),N''?''),NCHAR(30),N''?''),NCHAR(29),N''?''),NCHAR(28),N''?''),NCHAR(27),N''?''),NCHAR(26),N''?''),NCHAR(25),N''?''),NCHAR(24),N''?''),NCHAR(23),N''?''),NCHAR(22),N''?''), ' +
  4504.                                         'NCHAR(21),N''?''),NCHAR(20),N''?''),NCHAR(19),N''?''),NCHAR(18),N''?''),NCHAR(17),N''?''),NCHAR(16),N''?''),NCHAR(15),N''?''),NCHAR(14),N''?''),NCHAR(12),N''?''), ' +
  4505.                                         'NCHAR(11),N''?''),NCHAR(8),N''?''),NCHAR(7),N''?''),NCHAR(6),N''?''),NCHAR(5),N''?''),NCHAR(4),N''?''),NCHAR(3),N''?''),NCHAR(2),N''?''),NCHAR(1),N''?''), ' +
  4506.                                     'NCHAR(0), ' +
  4507.                                     N''''' ' +
  4508.                                 ') ' +
  4509.                         'FROM #blocked_requests AS b ' +
  4510.                         'LEFT OUTER JOIN ' + QUOTENAME(@database_name) + '.sys.partitions AS p ON ' +
  4511.                             'p.hobt_id = b.hobt_id ' +
  4512.                         'LEFT OUTER JOIN ' + QUOTENAME(@database_name) + '.sys.objects AS o ON ' +
  4513.                             'o.object_id = COALESCE(p.object_id, b.object_id) ' +
  4514.                         'LEFT OUTER JOIN ' + QUOTENAME(@database_name) + '.sys.schemas AS s ON ' +
  4515.                             's.schema_id = COALESCE(o.schema_id, b.schema_id) ' +
  4516.                         'WHERE ' +
  4517.                             'b.database_name = @database_name; ';
  4518.                    
  4519.                     EXEC sp_executesql
  4520.                         @sql_n,
  4521.                         N'@database_name sysname',
  4522.                         @database_name;
  4523.                 END TRY
  4524.                 BEGIN CATCH;
  4525.                     UPDATE #blocked_requests
  4526.                     SET
  4527.                         query_error =
  4528.                             REPLACE
  4529.                             (
  4530.                                 REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
  4531.                                 REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
  4532.                                 REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
  4533.                                     CONVERT
  4534.                                     (
  4535.                                         NVARCHAR(MAX),
  4536.                                         ERROR_MESSAGE() COLLATE Latin1_General_Bin2
  4537.                                     ),
  4538.                                     NCHAR(31),N'?'),NCHAR(30),N'?'),NCHAR(29),N'?'),NCHAR(28),N'?'),NCHAR(27),N'?'),NCHAR(26),N'?'),NCHAR(25),N'?'),NCHAR(24),N'?'),NCHAR(23),N'?'),NCHAR(22),N'?'),
  4539.                                     NCHAR(21),N'?'),NCHAR(20),N'?'),NCHAR(19),N'?'),NCHAR(18),N'?'),NCHAR(17),N'?'),NCHAR(16),N'?'),NCHAR(15),N'?'),NCHAR(14),N'?'),NCHAR(12),N'?'),
  4540.                                     NCHAR(11),N'?'),NCHAR(8),N'?'),NCHAR(7),N'?'),NCHAR(6),N'?'),NCHAR(5),N'?'),NCHAR(4),N'?'),NCHAR(3),N'?'),NCHAR(2),N'?'),NCHAR(1),N'?'),
  4541.                                 NCHAR(0),
  4542.                                 N''
  4543.                             )
  4544.                     WHERE
  4545.                         database_name = @database_name;
  4546.                 END CATCH;
  4547.  
  4548.                 FETCH NEXT FROM blocks_cursor
  4549.                 INTO
  4550.                     @database_name;
  4551.             END;
  4552.            
  4553.             CLOSE blocks_cursor;
  4554.             DEALLOCATE blocks_cursor;
  4555.            
  4556.             UPDATE s
  4557.             SET
  4558.                 additional_info.modify
  4559.                 ('
  4560.                     insert <schema_name>{sql:column("b.schema_name")}</schema_name>
  4561.                     as last
  4562.                     into (/additional_info/block_info)[1]
  4563.                 ')
  4564.             FROM #sessions AS s
  4565.             INNER JOIN #blocked_requests AS b ON
  4566.                 b.session_id = s.session_id
  4567.                 AND b.request_id = s.request_id
  4568.                 AND s.recursion = 1
  4569.             WHERE
  4570.                 b.schema_name IS NOT NULL;
  4571.  
  4572.             UPDATE s
  4573.             SET
  4574.                 additional_info.modify
  4575.                 ('
  4576.                     insert <object_name>{sql:column("b.object_name")}</object_name>
  4577.                     as last
  4578.                     into (/additional_info/block_info)[1]
  4579.                 ')
  4580.             FROM #sessions AS s
  4581.             INNER JOIN #blocked_requests AS b ON
  4582.                 b.session_id = s.session_id
  4583.                 AND b.request_id = s.request_id
  4584.                 AND s.recursion = 1
  4585.             WHERE
  4586.                 b.object_name IS NOT NULL;
  4587.  
  4588.             UPDATE s
  4589.             SET
  4590.                 additional_info.modify
  4591.                 ('
  4592.                     insert <query_error>{sql:column("b.query_error")}</query_error>
  4593.                     as last
  4594.                     into (/additional_info/block_info)[1]
  4595.                 ')
  4596.             FROM #sessions AS s
  4597.             INNER JOIN #blocked_requests AS b ON
  4598.                 b.session_id = s.session_id
  4599.                 AND b.request_id = s.request_id
  4600.                 AND s.recursion = 1
  4601.             WHERE
  4602.                 b.query_error IS NOT NULL;
  4603.         END;
  4604.  
  4605.         IF
  4606.             @output_column_list LIKE '%|[program_name|]%' ESCAPE '|'
  4607.             AND @output_column_list LIKE '%|[additional_info|]%' ESCAPE '|'
  4608.             AND @recursion = 1
  4609.         BEGIN;
  4610.             DECLARE @job_id UNIQUEIDENTIFIER;
  4611.             DECLARE @step_id INT;
  4612.  
  4613.             DECLARE agent_cursor
  4614.             CURSOR LOCAL FAST_FORWARD
  4615.             FOR
  4616.                 SELECT
  4617.                     s.session_id,
  4618.                     agent_nodes.agent_node.value('(job_id/text())[1]', 'uniqueidentifier') AS job_id,
  4619.                     agent_nodes.agent_node.value('(step_id/text())[1]', 'int') AS step_id
  4620.                 FROM #sessions AS s
  4621.                 CROSS APPLY s.additional_info.nodes('//agent_job_info') AS agent_nodes (agent_node)
  4622.                 WHERE
  4623.                     s.recursion = 1
  4624.             OPTION (KEEPFIXED PLAN);
  4625.            
  4626.             OPEN agent_cursor;
  4627.  
  4628.             FETCH NEXT FROM agent_cursor
  4629.             INTO
  4630.                 @session_id,
  4631.                 @job_id,
  4632.                 @step_id;
  4633.  
  4634.             WHILE @@FETCH_STATUS = 0
  4635.             BEGIN;
  4636.                 BEGIN TRY;
  4637.                     DECLARE @job_name sysname;
  4638.                     SET @job_name = NULL;
  4639.                     DECLARE @step_name sysname;
  4640.                     SET @step_name = NULL;
  4641.                    
  4642.                     SELECT
  4643.                         @job_name =
  4644.                             REPLACE
  4645.                             (
  4646.                                 REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
  4647.                                 REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
  4648.                                 REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
  4649.                                     j.name,
  4650.                                     NCHAR(31),N'?'),NCHAR(30),N'?'),NCHAR(29),N'?'),NCHAR(28),N'?'),NCHAR(27),N'?'),NCHAR(26),N'?'),NCHAR(25),N'?'),NCHAR(24),N'?'),NCHAR(23),N'?'),NCHAR(22),N'?'),
  4651.                                     NCHAR(21),N'?'),NCHAR(20),N'?'),NCHAR(19),N'?'),NCHAR(18),N'?'),NCHAR(17),N'?'),NCHAR(16),N'?'),NCHAR(15),N'?'),NCHAR(14),N'?'),NCHAR(12),N'?'),
  4652.                                     NCHAR(11),N'?'),NCHAR(8),N'?'),NCHAR(7),N'?'),NCHAR(6),N'?'),NCHAR(5),N'?'),NCHAR(4),N'?'),NCHAR(3),N'?'),NCHAR(2),N'?'),NCHAR(1),N'?'),
  4653.                                 NCHAR(0),
  4654.                                 N'?'
  4655.                             ),
  4656.                         @step_name =
  4657.                             REPLACE
  4658.                             (
  4659.                                 REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
  4660.                                 REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
  4661.                                 REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
  4662.                                     s.step_name,
  4663.                                     NCHAR(31),N'?'),NCHAR(30),N'?'),NCHAR(29),N'?'),NCHAR(28),N'?'),NCHAR(27),N'?'),NCHAR(26),N'?'),NCHAR(25),N'?'),NCHAR(24),N'?'),NCHAR(23),N'?'),NCHAR(22),N'?'),
  4664.                                     NCHAR(21),N'?'),NCHAR(20),N'?'),NCHAR(19),N'?'),NCHAR(18),N'?'),NCHAR(17),N'?'),NCHAR(16),N'?'),NCHAR(15),N'?'),NCHAR(14),N'?'),NCHAR(12),N'?'),
  4665.                                     NCHAR(11),N'?'),NCHAR(8),N'?'),NCHAR(7),N'?'),NCHAR(6),N'?'),NCHAR(5),N'?'),NCHAR(4),N'?'),NCHAR(3),N'?'),NCHAR(2),N'?'),NCHAR(1),N'?'),
  4666.                                 NCHAR(0),
  4667.                                 N'?'
  4668.                             )
  4669.                     FROM msdb.dbo.sysjobs AS j
  4670.                     INNER JOIN msdb..sysjobsteps AS s ON
  4671.                         j.job_id = s.job_id
  4672.                     WHERE
  4673.                         j.job_id = @job_id
  4674.                         AND s.step_id = @step_id;
  4675.  
  4676.                     IF @job_name IS NOT NULL
  4677.                     BEGIN;
  4678.                         UPDATE s
  4679.                         SET
  4680.                             additional_info.modify
  4681.                             ('
  4682.                                 insert text{sql:variable("@job_name")}
  4683.                                 into (/additional_info/agent_job_info/job_name)[1]
  4684.                             ')
  4685.                         FROM #sessions AS s
  4686.                         WHERE
  4687.                             s.session_id = @session_id
  4688.                         OPTION (KEEPFIXED PLAN);
  4689.                        
  4690.                         UPDATE s
  4691.                         SET
  4692.                             additional_info.modify
  4693.                             ('
  4694.                                 insert text{sql:variable("@step_name")}
  4695.                                 into (/additional_info/agent_job_info/step_name)[1]
  4696.                             ')
  4697.                         FROM #sessions AS s
  4698.                         WHERE
  4699.                             s.session_id = @session_id
  4700.                         OPTION (KEEPFIXED PLAN);
  4701.                     END;
  4702.                 END TRY
  4703.                 BEGIN CATCH;
  4704.                     DECLARE @msdb_error_message NVARCHAR(256);
  4705.                     SET @msdb_error_message = ERROR_MESSAGE();
  4706.                
  4707.                     UPDATE s
  4708.                     SET
  4709.                         additional_info.modify
  4710.                         ('
  4711.                             insert <msdb_query_error>{sql:variable("@msdb_error_message")}</msdb_query_error>
  4712.                             as last
  4713.                             into (/additional_info/agent_job_info)[1]
  4714.                         ')
  4715.                     FROM #sessions AS s
  4716.                     WHERE
  4717.                         s.session_id = @session_id
  4718.                         AND s.recursion = 1
  4719.                     OPTION (KEEPFIXED PLAN);
  4720.                 END CATCH;
  4721.  
  4722.                 FETCH NEXT FROM agent_cursor
  4723.                 INTO
  4724.                     @session_id,
  4725.                     @job_id,
  4726.                     @step_id;
  4727.             END;
  4728.  
  4729.             CLOSE agent_cursor;
  4730.             DEALLOCATE agent_cursor;
  4731.         END;
  4732.        
  4733.         IF
  4734.             @delta_interval > 0
  4735.             AND @recursion <> 1
  4736.         BEGIN;
  4737.             SET @recursion = 1;
  4738.  
  4739.             DECLARE @delay_time CHAR(12);
  4740.             SET @delay_time = CONVERT(VARCHAR, DATEADD(second, @delta_interval, 0), 114);
  4741.             WAITFOR DELAY @delay_time;
  4742.  
  4743.             GOTO REDO;
  4744.         END;
  4745.     END;
  4746.  
  4747.     SET @sql =
  4748.         --Outer column list
  4749.         CONVERT
  4750.         (
  4751.             VARCHAR(MAX),
  4752.             CASE
  4753.                 WHEN
  4754.                     @destination_table <> ''
  4755.                     AND @return_schema = 0
  4756.                         THEN 'INSERT ' + @destination_table + ' '
  4757.                 ELSE ''
  4758.             END +
  4759.             'SELECT ' +
  4760.                 @output_column_list + ' ' +
  4761.             CASE @return_schema
  4762.                 WHEN 1 THEN 'INTO #session_schema '
  4763.                 ELSE ''
  4764.             END
  4765.         --End outer column list
  4766.         ) +
  4767.         --Inner column list
  4768.         CONVERT
  4769.         (
  4770.             VARCHAR(MAX),
  4771.             'FROM ' +
  4772.             '( ' +
  4773.                 'SELECT ' +
  4774.                     'session_id, ' +
  4775.                     --[dd hh:mm:ss.mss]
  4776.                     CASE
  4777.                         WHEN @format_output IN (1, 2) THEN
  4778.                             'CASE ' +
  4779.                                 'WHEN elapsed_time < 0 THEN ' +
  4780.                                     'RIGHT ' +
  4781.                                     '( ' +
  4782.                                         'REPLICATE(''0'', max_elapsed_length) + CONVERT(VARCHAR, (-1 * elapsed_time) / 86400), ' +
  4783.                                         'max_elapsed_length ' +
  4784.                                     ') + ' +
  4785.                                         'RIGHT ' +
  4786.                                         '( ' +
  4787.                                             'CONVERT(VARCHAR, DATEADD(second, (-1 * elapsed_time), 0), 120), ' +
  4788.                                             '9 ' +
  4789.                                         ') + ' +
  4790.                                         '''.000'' ' +
  4791.                                 'ELSE ' +
  4792.                                     'RIGHT ' +
  4793.                                     '( ' +
  4794.                                         'REPLICATE(''0'', max_elapsed_length) + CONVERT(VARCHAR, elapsed_time / 86400000), ' +
  4795.                                         'max_elapsed_length ' +
  4796.                                     ') + ' +
  4797.                                         'RIGHT ' +
  4798.                                         '( ' +
  4799.                                             'CONVERT(VARCHAR, DATEADD(second, elapsed_time / 1000, 0), 120), ' +
  4800.                                             '9 ' +
  4801.                                         ') + ' +
  4802.                                         '''.'' + ' +
  4803.                                         'RIGHT(''000'' + CONVERT(VARCHAR, elapsed_time % 1000), 3) ' +
  4804.                             'END AS [dd hh:mm:ss.mss], '
  4805.                         ELSE
  4806.                             ''
  4807.                     END +
  4808.                     --[dd hh:mm:ss.mss (avg)] / avg_elapsed_time
  4809.                     CASE
  4810.                         WHEN  @format_output IN (1, 2) THEN
  4811.                             'RIGHT ' +
  4812.                             '( ' +
  4813.                                 '''00'' + CONVERT(VARCHAR, avg_elapsed_time / 86400000), ' +
  4814.                                 '2 ' +
  4815.                             ') + ' +
  4816.                                 'RIGHT ' +
  4817.                                 '( ' +
  4818.                                     'CONVERT(VARCHAR, DATEADD(second, avg_elapsed_time / 1000, 0), 120), ' +
  4819.                                     '9 ' +
  4820.                                 ') + ' +
  4821.                                 '''.'' + ' +
  4822.                                 'RIGHT(''000'' + CONVERT(VARCHAR, avg_elapsed_time % 1000), 3) AS [dd hh:mm:ss.mss (avg)], '
  4823.                         ELSE
  4824.                             'avg_elapsed_time, '
  4825.                     END +
  4826.                     --physical_io
  4827.                     CASE @format_output
  4828.                         WHEN 1 THEN 'CONVERT(VARCHAR, SPACE(MAX(LEN(CONVERT(VARCHAR, physical_io))) OVER() - LEN(CONVERT(VARCHAR, physical_io))) + LEFT(CONVERT(CHAR(22), CONVERT(MONEY, physical_io), 1), 19)) AS '
  4829.                         WHEN 2 THEN 'CONVERT(VARCHAR, LEFT(CONVERT(CHAR(22), CONVERT(MONEY, physical_io), 1), 19)) AS '
  4830.                         ELSE ''
  4831.                     END + 'physical_io, ' +
  4832.                     --reads
  4833.                     CASE @format_output
  4834.                         WHEN 1 THEN 'CONVERT(VARCHAR, SPACE(MAX(LEN(CONVERT(VARCHAR, reads))) OVER() - LEN(CONVERT(VARCHAR, reads))) + LEFT(CONVERT(CHAR(22), CONVERT(MONEY, reads), 1), 19)) AS '
  4835.                         WHEN 2 THEN 'CONVERT(VARCHAR, LEFT(CONVERT(CHAR(22), CONVERT(MONEY, reads), 1), 19)) AS '
  4836.                         ELSE ''
  4837.                     END + 'reads, ' +
  4838.                     --physical_reads
  4839.                     CASE @format_output
  4840.                         WHEN 1 THEN 'CONVERT(VARCHAR, SPACE(MAX(LEN(CONVERT(VARCHAR, physical_reads))) OVER() - LEN(CONVERT(VARCHAR, physical_reads))) + LEFT(CONVERT(CHAR(22), CONVERT(MONEY, physical_reads), 1), 19)) AS '
  4841.                         WHEN 2 THEN 'CONVERT(VARCHAR, LEFT(CONVERT(CHAR(22), CONVERT(MONEY, physical_reads), 1), 19)) AS '
  4842.                         ELSE ''
  4843.                     END + 'physical_reads, ' +
  4844.                     --writes
  4845.                     CASE @format_output
  4846.                         WHEN 1 THEN 'CONVERT(VARCHAR, SPACE(MAX(LEN(CONVERT(VARCHAR, writes))) OVER() - LEN(CONVERT(VARCHAR, writes))) + LEFT(CONVERT(CHAR(22), CONVERT(MONEY, writes), 1), 19)) AS '
  4847.                         WHEN 2 THEN 'CONVERT(VARCHAR, LEFT(CONVERT(CHAR(22), CONVERT(MONEY, writes), 1), 19)) AS '
  4848.                         ELSE ''
  4849.                     END + 'writes, ' +
  4850.                     --tempdb_allocations
  4851.                     CASE @format_output
  4852.                         WHEN 1 THEN 'CONVERT(VARCHAR, SPACE(MAX(LEN(CONVERT(VARCHAR, tempdb_allocations))) OVER() - LEN(CONVERT(VARCHAR, tempdb_allocations))) + LEFT(CONVERT(CHAR(22), CONVERT(MONEY, tempdb_allocations), 1), 19)) AS '
  4853.                         WHEN 2 THEN 'CONVERT(VARCHAR, LEFT(CONVERT(CHAR(22), CONVERT(MONEY, tempdb_allocations), 1), 19)) AS '
  4854.                         ELSE ''
  4855.                     END + 'tempdb_allocations, ' +
  4856.                     --tempdb_current
  4857.                     CASE @format_output
  4858.                         WHEN 1 THEN 'CONVERT(VARCHAR, SPACE(MAX(LEN(CONVERT(VARCHAR, tempdb_current))) OVER() - LEN(CONVERT(VARCHAR, tempdb_current))) + LEFT(CONVERT(CHAR(22), CONVERT(MONEY, tempdb_current), 1), 19)) AS '
  4859.                         WHEN 2 THEN 'CONVERT(VARCHAR, LEFT(CONVERT(CHAR(22), CONVERT(MONEY, tempdb_current), 1), 19)) AS '
  4860.                         ELSE ''
  4861.                     END + 'tempdb_current, ' +
  4862.                     --CPU
  4863.                     CASE @format_output
  4864.                         WHEN 1 THEN 'CONVERT(VARCHAR, SPACE(MAX(LEN(CONVERT(VARCHAR, CPU))) OVER() - LEN(CONVERT(VARCHAR, CPU))) + LEFT(CONVERT(CHAR(22), CONVERT(MONEY, CPU), 1), 19)) AS '
  4865.                         WHEN 2 THEN 'CONVERT(VARCHAR, LEFT(CONVERT(CHAR(22), CONVERT(MONEY, CPU), 1), 19)) AS '
  4866.                         ELSE ''
  4867.                     END + 'CPU, ' +
  4868.                     --context_switches
  4869.                     CASE @format_output
  4870.                         WHEN 1 THEN 'CONVERT(VARCHAR, SPACE(MAX(LEN(CONVERT(VARCHAR, context_switches))) OVER() - LEN(CONVERT(VARCHAR, context_switches))) + LEFT(CONVERT(CHAR(22), CONVERT(MONEY, context_switches), 1), 19)) AS '
  4871.                         WHEN 2 THEN 'CONVERT(VARCHAR, LEFT(CONVERT(CHAR(22), CONVERT(MONEY, context_switches), 1), 19)) AS '
  4872.                         ELSE ''
  4873.                     END + 'context_switches, ' +
  4874.                     --used_memory
  4875.                     CASE @format_output
  4876.                         WHEN 1 THEN 'CONVERT(VARCHAR, SPACE(MAX(LEN(CONVERT(VARCHAR, used_memory))) OVER() - LEN(CONVERT(VARCHAR, used_memory))) + LEFT(CONVERT(CHAR(22), CONVERT(MONEY, used_memory), 1), 19)) AS '
  4877.                         WHEN 2 THEN 'CONVERT(VARCHAR, LEFT(CONVERT(CHAR(22), CONVERT(MONEY, used_memory), 1), 19)) AS '
  4878.                         ELSE ''
  4879.                     END + 'used_memory, ' +
  4880.                     CASE
  4881.                         WHEN @output_column_list LIKE '%|_delta|]%' ESCAPE '|' THEN
  4882.                             --physical_io_delta        
  4883.                             'CASE ' +
  4884.                                 'WHEN ' +
  4885.                                     'first_request_start_time = last_request_start_time ' +
  4886.                                     'AND num_events = 2 ' +
  4887.                                     'AND physical_io_delta >= 0 ' +
  4888.                                         'THEN ' +
  4889.                                         CASE @format_output
  4890.                                             WHEN 1 THEN 'CONVERT(VARCHAR, SPACE(MAX(LEN(CONVERT(VARCHAR, physical_io_delta))) OVER() - LEN(CONVERT(VARCHAR, physical_io_delta))) + LEFT(CONVERT(CHAR(22), CONVERT(MONEY, physical_io_delta), 1), 19)) '
  4891.                                             WHEN 2 THEN 'CONVERT(VARCHAR, LEFT(CONVERT(CHAR(22), CONVERT(MONEY, physical_io_delta), 1), 19)) '
  4892.                                             ELSE 'physical_io_delta '
  4893.                                         END +
  4894.                                 'ELSE NULL ' +
  4895.                             'END AS physical_io_delta, ' +
  4896.                             --reads_delta
  4897.                             'CASE ' +
  4898.                                 'WHEN ' +
  4899.                                     'first_request_start_time = last_request_start_time ' +
  4900.                                     'AND num_events = 2 ' +
  4901.                                     'AND reads_delta >= 0 ' +
  4902.                                         'THEN ' +
  4903.                                         CASE @format_output
  4904.                                             WHEN 1 THEN 'CONVERT(VARCHAR, SPACE(MAX(LEN(CONVERT(VARCHAR, reads_delta))) OVER() - LEN(CONVERT(VARCHAR, reads_delta))) + LEFT(CONVERT(CHAR(22), CONVERT(MONEY, reads_delta), 1), 19)) '
  4905.                                             WHEN 2 THEN 'CONVERT(VARCHAR, LEFT(CONVERT(CHAR(22), CONVERT(MONEY, reads_delta), 1), 19)) '
  4906.                                             ELSE 'reads_delta '
  4907.                                         END +
  4908.                                 'ELSE NULL ' +
  4909.                             'END AS reads_delta, ' +
  4910.                             --physical_reads_delta
  4911.                             'CASE ' +
  4912.                                 'WHEN ' +
  4913.                                     'first_request_start_time = last_request_start_time ' +
  4914.                                     'AND num_events = 2 ' +
  4915.                                     'AND physical_reads_delta >= 0 ' +
  4916.                                         'THEN ' +
  4917.                                         CASE @format_output
  4918.                                             WHEN 1 THEN 'CONVERT(VARCHAR, SPACE(MAX(LEN(CONVERT(VARCHAR, physical_reads_delta))) OVER() - LEN(CONVERT(VARCHAR, physical_reads_delta))) + LEFT(CONVERT(CHAR(22), CONVERT(MONEY, physical_reads_delta), 1), 19)) '
  4919.                                             WHEN 2 THEN 'CONVERT(VARCHAR, LEFT(CONVERT(CHAR(22), CONVERT(MONEY, physical_reads_delta), 1), 19)) '
  4920.                                             ELSE 'physical_reads_delta '
  4921.                                         END +
  4922.                                 'ELSE NULL ' +
  4923.                             'END AS physical_reads_delta, ' +
  4924.                             --writes_delta
  4925.                             'CASE ' +
  4926.                                 'WHEN ' +
  4927.                                     'first_request_start_time = last_request_start_time ' +
  4928.                                     'AND num_events = 2 ' +
  4929.                                     'AND writes_delta >= 0 ' +
  4930.                                         'THEN ' +
  4931.                                         CASE @format_output
  4932.                                             WHEN 1 THEN 'CONVERT(VARCHAR, SPACE(MAX(LEN(CONVERT(VARCHAR, writes_delta))) OVER() - LEN(CONVERT(VARCHAR, writes_delta))) + LEFT(CONVERT(CHAR(22), CONVERT(MONEY, writes_delta), 1), 19)) '
  4933.                                             WHEN 2 THEN 'CONVERT(VARCHAR, LEFT(CONVERT(CHAR(22), CONVERT(MONEY, writes_delta), 1), 19)) '
  4934.                                             ELSE 'writes_delta '
  4935.                                         END +
  4936.                                 'ELSE NULL ' +
  4937.                             'END AS writes_delta, ' +
  4938.                             --tempdb_allocations_delta
  4939.                             'CASE ' +
  4940.                                 'WHEN ' +
  4941.                                     'first_request_start_time = last_request_start_time ' +
  4942.                                     'AND num_events = 2 ' +
  4943.                                     'AND tempdb_allocations_delta >= 0 ' +
  4944.                                         'THEN ' +
  4945.                                         CASE @format_output
  4946.                                             WHEN 1 THEN 'CONVERT(VARCHAR, SPACE(MAX(LEN(CONVERT(VARCHAR, tempdb_allocations_delta))) OVER() - LEN(CONVERT(VARCHAR, tempdb_allocations_delta))) + LEFT(CONVERT(CHAR(22), CONVERT(MONEY, tempdb_allocations_delta), 1), 19)) '
  4947.                                             WHEN 2 THEN 'CONVERT(VARCHAR, LEFT(CONVERT(CHAR(22), CONVERT(MONEY, tempdb_allocations_delta), 1), 19)) '
  4948.                                             ELSE 'tempdb_allocations_delta '
  4949.                                         END +
  4950.                                 'ELSE NULL ' +
  4951.                             'END AS tempdb_allocations_delta, ' +
  4952.                             --tempdb_current_delta
  4953.                             --this is the only one that can (legitimately) go negative
  4954.                             'CASE ' +
  4955.                                 'WHEN ' +
  4956.                                     'first_request_start_time = last_request_start_time ' +
  4957.                                     'AND num_events = 2 ' +
  4958.                                         'THEN ' +
  4959.                                         CASE @format_output
  4960.                                             WHEN 1 THEN 'CONVERT(VARCHAR, SPACE(MAX(LEN(CONVERT(VARCHAR, tempdb_current_delta))) OVER() - LEN(CONVERT(VARCHAR, tempdb_current_delta))) + LEFT(CONVERT(CHAR(22), CONVERT(MONEY, tempdb_current_delta), 1), 19)) '
  4961.                                             WHEN 2 THEN 'CONVERT(VARCHAR, LEFT(CONVERT(CHAR(22), CONVERT(MONEY, tempdb_current_delta), 1), 19)) '
  4962.                                             ELSE 'tempdb_current_delta '
  4963.                                         END +
  4964.                                 'ELSE NULL ' +
  4965.                             'END AS tempdb_current_delta, ' +
  4966.                             --CPU_delta
  4967.                             'CASE ' +
  4968.                                 'WHEN ' +
  4969.                                     'first_request_start_time = last_request_start_time ' +
  4970.                                     'AND num_events = 2 ' +
  4971.                                         'THEN ' +
  4972.                                             'CASE ' +
  4973.                                                 'WHEN ' +
  4974.                                                     'thread_CPU_delta > CPU_delta ' +
  4975.                                                     'AND thread_CPU_delta > 0 ' +
  4976.                                                         'THEN ' +
  4977.                                                             CASE @format_output
  4978.                                                                 WHEN 1 THEN 'CONVERT(VARCHAR, SPACE(MAX(LEN(CONVERT(VARCHAR, thread_CPU_delta + CPU_delta))) OVER() - LEN(CONVERT(VARCHAR, thread_CPU_delta))) + LEFT(CONVERT(CHAR(22), CONVERT(MONEY, thread_CPU_delta), 1), 19)) '
  4979.                                                                 WHEN 2 THEN 'CONVERT(VARCHAR, LEFT(CONVERT(CHAR(22), CONVERT(MONEY, thread_CPU_delta), 1), 19)) '
  4980.                                                                 ELSE 'thread_CPU_delta '
  4981.                                                             END +
  4982.                                                 'WHEN CPU_delta >= 0 THEN ' +
  4983.                                                     CASE @format_output
  4984.                                                         WHEN 1 THEN 'CONVERT(VARCHAR, SPACE(MAX(LEN(CONVERT(VARCHAR, thread_CPU_delta + CPU_delta))) OVER() - LEN(CONVERT(VARCHAR, CPU_delta))) + LEFT(CONVERT(CHAR(22), CONVERT(MONEY, CPU_delta), 1), 19)) '
  4985.                                                         WHEN 2 THEN 'CONVERT(VARCHAR, LEFT(CONVERT(CHAR(22), CONVERT(MONEY, CPU_delta), 1), 19)) '
  4986.                                                         ELSE 'CPU_delta '
  4987.                                                     END +
  4988.                                                 'ELSE NULL ' +
  4989.                                             'END ' +
  4990.                                 'ELSE ' +
  4991.                                     'NULL ' +
  4992.                             'END AS CPU_delta, ' +
  4993.                             --context_switches_delta
  4994.                             'CASE ' +
  4995.                                 'WHEN ' +
  4996.                                     'first_request_start_time = last_request_start_time ' +
  4997.                                     'AND num_events = 2 ' +
  4998.                                     'AND context_switches_delta >= 0 ' +
  4999.                                         'THEN ' +
  5000.                                         CASE @format_output
  5001.                                             WHEN 1 THEN 'CONVERT(VARCHAR, SPACE(MAX(LEN(CONVERT(VARCHAR, context_switches_delta))) OVER() - LEN(CONVERT(VARCHAR, context_switches_delta))) + LEFT(CONVERT(CHAR(22), CONVERT(MONEY, context_switches_delta), 1), 19)) '
  5002.                                             WHEN 2 THEN 'CONVERT(VARCHAR, LEFT(CONVERT(CHAR(22), CONVERT(MONEY, context_switches_delta), 1), 19)) '
  5003.                                             ELSE 'context_switches_delta '
  5004.                                         END +
  5005.                                 'ELSE NULL ' +
  5006.                             'END AS context_switches_delta, ' +
  5007.                             --used_memory_delta
  5008.                             'CASE ' +
  5009.                                 'WHEN ' +
  5010.                                     'first_request_start_time = last_request_start_time ' +
  5011.                                     'AND num_events = 2 ' +
  5012.                                     'AND used_memory_delta >= 0 ' +
  5013.                                         'THEN ' +
  5014.                                         CASE @format_output
  5015.                                             WHEN 1 THEN 'CONVERT(VARCHAR, SPACE(MAX(LEN(CONVERT(VARCHAR, used_memory_delta))) OVER() - LEN(CONVERT(VARCHAR, used_memory_delta))) + LEFT(CONVERT(CHAR(22), CONVERT(MONEY, used_memory_delta), 1), 19)) '
  5016.                                             WHEN 2 THEN 'CONVERT(VARCHAR, LEFT(CONVERT(CHAR(22), CONVERT(MONEY, used_memory_delta), 1), 19)) '
  5017.                                             ELSE 'used_memory_delta '
  5018.                                         END +
  5019.                                 'ELSE NULL ' +
  5020.                             'END AS used_memory_delta, '
  5021.                         ELSE ''
  5022.                     END +
  5023.                     --tasks
  5024.                     CASE @format_output
  5025.                         WHEN 1 THEN 'CONVERT(VARCHAR, SPACE(MAX(LEN(CONVERT(VARCHAR, tasks))) OVER() - LEN(CONVERT(VARCHAR, tasks))) + LEFT(CONVERT(CHAR(22), CONVERT(MONEY, tasks), 1), 19)) AS '
  5026.                         WHEN 2 THEN 'CONVERT(VARCHAR, LEFT(CONVERT(CHAR(22), CONVERT(MONEY, tasks), 1), 19)) '
  5027.                         ELSE ''
  5028.                     END + 'tasks, ' +
  5029.                     'status, ' +
  5030.                     'wait_info, ' +
  5031.                     'locks, ' +
  5032.                     'tran_start_time, ' +
  5033.                     'LEFT(tran_log_writes, LEN(tran_log_writes) - 1) AS tran_log_writes, ' +
  5034.                     --open_tran_count
  5035.                     CASE @format_output
  5036.                         WHEN 1 THEN 'CONVERT(VARCHAR, SPACE(MAX(LEN(CONVERT(VARCHAR, open_tran_count))) OVER() - LEN(CONVERT(VARCHAR, open_tran_count))) + LEFT(CONVERT(CHAR(22), CONVERT(MONEY, open_tran_count), 1), 19)) AS '
  5037.                         WHEN 2 THEN 'CONVERT(VARCHAR, LEFT(CONVERT(CHAR(22), CONVERT(MONEY, open_tran_count), 1), 19)) AS '
  5038.                         ELSE ''
  5039.                     END + 'open_tran_count, ' +
  5040.                     --sql_command
  5041.                     CASE @format_output
  5042.                         WHEN 0 THEN 'REPLACE(REPLACE(CONVERT(NVARCHAR(MAX), sql_command), ''<?query --''+CHAR(13)+CHAR(10), ''''), CHAR(13)+CHAR(10)+''--?>'', '''') AS '
  5043.                         ELSE ''
  5044.                     END + 'sql_command, ' +
  5045.                     --sql_text
  5046.                     CASE @format_output
  5047.                         WHEN 0 THEN 'REPLACE(REPLACE(CONVERT(NVARCHAR(MAX), sql_text), ''<?query --''+CHAR(13)+CHAR(10), ''''), CHAR(13)+CHAR(10)+''--?>'', '''') AS '
  5048.                         ELSE ''
  5049.                     END + 'sql_text, ' +
  5050.                     'query_plan, ' +
  5051.                     'blocking_session_id, ' +
  5052.                     --blocked_session_count
  5053.                     CASE @format_output
  5054.                         WHEN 1 THEN 'CONVERT(VARCHAR, SPACE(MAX(LEN(CONVERT(VARCHAR, blocked_session_count))) OVER() - LEN(CONVERT(VARCHAR, blocked_session_count))) + LEFT(CONVERT(CHAR(22), CONVERT(MONEY, blocked_session_count), 1), 19)) AS '
  5055.                         WHEN 2 THEN 'CONVERT(VARCHAR, LEFT(CONVERT(CHAR(22), CONVERT(MONEY, blocked_session_count), 1), 19)) AS '
  5056.                         ELSE ''
  5057.                     END + 'blocked_session_count, ' +
  5058.                     --percent_complete
  5059.                     CASE @format_output
  5060.                         WHEN 1 THEN 'CONVERT(VARCHAR, SPACE(MAX(LEN(CONVERT(VARCHAR, CONVERT(MONEY, percent_complete), 2))) OVER() - LEN(CONVERT(VARCHAR, CONVERT(MONEY, percent_complete), 2))) + CONVERT(CHAR(22), CONVERT(MONEY, percent_complete), 2)) AS '
  5061.                         WHEN 2 THEN 'CONVERT(VARCHAR, CONVERT(CHAR(22), CONVERT(MONEY, blocked_session_count), 1)) AS '
  5062.                         ELSE ''
  5063.                     END + 'percent_complete, ' +
  5064.                     'host_name, ' +
  5065.                     'login_name, ' +
  5066.                     'database_name, ' +
  5067.                     'program_name, ' +
  5068.                     'additional_info, ' +
  5069.                     'start_time, ' +
  5070.                     'login_time, ' +
  5071.                     'CASE ' +
  5072.                         'WHEN status = N''sleeping'' THEN NULL ' +
  5073.                         'ELSE request_id ' +
  5074.                     'END AS request_id, ' +
  5075.                     'GETDATE() AS collection_time '
  5076.         --End inner column list
  5077.         ) +
  5078.         --Derived table and INSERT specification
  5079.         CONVERT
  5080.         (
  5081.             VARCHAR(MAX),
  5082.                 'FROM ' +
  5083.                 '( ' +
  5084.                     'SELECT TOP(2147483647) ' +
  5085.                         '*, ' +
  5086.                         'CASE ' +
  5087.                             'MAX ' +
  5088.                             '( ' +
  5089.                                 'LEN ' +
  5090.                                 '( ' +
  5091.                                     'CONVERT ' +
  5092.                                     '( ' +
  5093.                                         'VARCHAR, ' +
  5094.                                         'CASE ' +
  5095.                                             'WHEN elapsed_time < 0 THEN ' +
  5096.                                                 '(-1 * elapsed_time) / 86400 ' +
  5097.                                             'ELSE ' +
  5098.                                                 'elapsed_time / 86400000 ' +
  5099.                                         'END ' +
  5100.                                     ') ' +
  5101.                                 ') ' +
  5102.                             ') OVER () ' +
  5103.                                 'WHEN 1 THEN 2 ' +
  5104.                                 'ELSE ' +
  5105.                                     'MAX ' +
  5106.                                     '( ' +
  5107.                                         'LEN ' +
  5108.                                         '( ' +
  5109.                                             'CONVERT ' +
  5110.                                             '( ' +
  5111.                                                 'VARCHAR, ' +
  5112.                                                 'CASE ' +
  5113.                                                     'WHEN elapsed_time < 0 THEN ' +
  5114.                                                         '(-1 * elapsed_time) / 86400 ' +
  5115.                                                     'ELSE ' +
  5116.                                                         'elapsed_time / 86400000 ' +
  5117.                                                 'END ' +
  5118.                                             ') ' +
  5119.                                         ') ' +
  5120.                                     ') OVER () ' +
  5121.                         'END AS max_elapsed_length, ' +
  5122.                         CASE
  5123.                             WHEN @output_column_list LIKE '%|_delta|]%' ESCAPE '|' THEN
  5124.                                 'MAX(physical_io * recursion) OVER (PARTITION BY session_id, request_id) + ' +
  5125.                                     'MIN(physical_io * recursion) OVER (PARTITION BY session_id, request_id) AS physical_io_delta, ' +
  5126.                                 'MAX(reads * recursion) OVER (PARTITION BY session_id, request_id) + ' +
  5127.                                     'MIN(reads * recursion) OVER (PARTITION BY session_id, request_id) AS reads_delta, ' +
  5128.                                 'MAX(physical_reads * recursion) OVER (PARTITION BY session_id, request_id) + ' +
  5129.                                     'MIN(physical_reads * recursion) OVER (PARTITION BY session_id, request_id) AS physical_reads_delta, ' +
  5130.                                 'MAX(writes * recursion) OVER (PARTITION BY session_id, request_id) + ' +
  5131.                                     'MIN(writes * recursion) OVER (PARTITION BY session_id, request_id) AS writes_delta, ' +
  5132.                                 'MAX(tempdb_allocations * recursion) OVER (PARTITION BY session_id, request_id) + ' +
  5133.                                     'MIN(tempdb_allocations * recursion) OVER (PARTITION BY session_id, request_id) AS tempdb_allocations_delta, ' +
  5134.                                 'MAX(tempdb_current * recursion) OVER (PARTITION BY session_id, request_id) + ' +
  5135.                                     'MIN(tempdb_current * recursion) OVER (PARTITION BY session_id, request_id) AS tempdb_current_delta, ' +
  5136.                                 'MAX(CPU * recursion) OVER (PARTITION BY session_id, request_id) + ' +
  5137.                                     'MIN(CPU * recursion) OVER (PARTITION BY session_id, request_id) AS CPU_delta, ' +
  5138.                                 'MAX(thread_CPU_snapshot * recursion) OVER (PARTITION BY session_id, request_id) + ' +
  5139.                                     'MIN(thread_CPU_snapshot * recursion) OVER (PARTITION BY session_id, request_id) AS thread_CPU_delta, ' +
  5140.                                 'MAX(context_switches * recursion) OVER (PARTITION BY session_id, request_id) + ' +
  5141.                                     'MIN(context_switches * recursion) OVER (PARTITION BY session_id, request_id) AS context_switches_delta, ' +
  5142.                                 'MAX(used_memory * recursion) OVER (PARTITION BY session_id, request_id) + ' +
  5143.                                     'MIN(used_memory * recursion) OVER (PARTITION BY session_id, request_id) AS used_memory_delta, ' +
  5144.                                 'MIN(last_request_start_time) OVER (PARTITION BY session_id, request_id) AS first_request_start_time, '
  5145.                             ELSE ''
  5146.                         END +
  5147.                         'COUNT(*) OVER (PARTITION BY session_id, request_id) AS num_events ' +
  5148.                     'FROM #sessions AS s1 ' +
  5149.                     CASE
  5150.                         WHEN @sort_order = '' THEN ''
  5151.                         ELSE
  5152.                             'ORDER BY ' +
  5153.                                 @sort_order
  5154.                     END +
  5155.                 ') AS s ' +
  5156.                 'WHERE ' +
  5157.                     's.recursion = 1 ' +
  5158.             ') x ' +
  5159.             'OPTION (KEEPFIXED PLAN); ' +
  5160.             '' +
  5161.             CASE @return_schema
  5162.                 WHEN 1 THEN
  5163.                     'SET @schema = ' +
  5164.                         '''CREATE TABLE <table_name> ( '' + ' +
  5165.                             'STUFF ' +
  5166.                             '( ' +
  5167.                                 '( ' +
  5168.                                     'SELECT ' +
  5169.                                         ''','' + ' +
  5170.                                         'QUOTENAME(COLUMN_NAME) + '' '' + ' +
  5171.                                         'DATA_TYPE + ' +
  5172.                                         'CASE ' +
  5173.                                             'WHEN DATA_TYPE LIKE ''%char'' THEN ''('' + COALESCE(NULLIF(CONVERT(VARCHAR, CHARACTER_MAXIMUM_LENGTH), ''-1''), ''max'') + '') '' ' +
  5174.                                             'ELSE '' '' ' +
  5175.                                         'END + ' +
  5176.                                         'CASE IS_NULLABLE ' +
  5177.                                             'WHEN ''NO'' THEN ''NOT '' ' +
  5178.                                             'ELSE '''' ' +
  5179.                                         'END + ''NULL'' AS [text()] ' +
  5180.                                     'FROM tempdb.INFORMATION_SCHEMA.COLUMNS ' +
  5181.                                     'WHERE ' +
  5182.                                         'TABLE_NAME = (SELECT name FROM tempdb.sys.objects WHERE object_id = OBJECT_ID(''tempdb..#session_schema'')) ' +
  5183.                                         'ORDER BY ' +
  5184.                                             'ORDINAL_POSITION ' +
  5185.                                     'FOR XML ' +
  5186.                                         'PATH('''') ' +
  5187.                                 '), + ' +
  5188.                                 '1, ' +
  5189.                                 '1, ' +
  5190.                                 ''''' ' +
  5191.                             ') + ' +
  5192.                         ''')''; '
  5193.                 ELSE ''
  5194.             END
  5195.         --End derived table and INSERT specification
  5196.         );
  5197.  
  5198.     SET @sql_n = CONVERT(NVARCHAR(MAX), @sql);
  5199.  
  5200.     EXEC sp_executesql
  5201.         @sql_n,
  5202.         N'@schema VARCHAR(MAX) OUTPUT',
  5203.         @schema OUTPUT;
  5204. END;
  5205. GO
Advertisement
Add Comment
Please, Sign In to add comment