Advertisement
cbossie

WhoIsActive No Sproc

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