AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 301631
Accepted
xhr489
xhr489
Asked: 2021-10-26 04:55:12 +0800 CST2021-10-26 04:55:12 +0800 CST 2021-10-26 04:55:12 +0800 CST

从 sys.dm_exec_sessions 中的 PROGRAM_NAME 中查找代理作业名称

  • 772

我想查找代理工作的名称,但例如

Select login_name,
       program_name,
       host_name,
       nt_domain,
       nt_user_name 
From sys.dm_exec_sessions

不显示名称,但显示:SQLAgent - TSQL JobStep (Job 0x"Some hexadecimal number" : Step 1)

我怎样才能找到这个代理工作的名称?

sql-server sql-server-agent
  • 2 2 个回答
  • 376 Views

2 个回答

  • Voted
  1. Best Answer
    Hannah Vernon
    2021-10-26T09:12:14+08:002021-10-26T09:12:14+08:00

    我使用以下脚本来显示有关当前运行的 SQL Server 代理作业的详细信息。

    /*
        Shows the progress of running SQL Agent jobs
        Hannah Vernon
    */
    
    SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
    
    DECLARE @Actions TABLE
    (
            [ActionID] int
          , [ActionText] varchar(50)
    );
    INSERT INTO @Actions ([ActionID], [ActionText])
    VALUES 
          (1, 'Quit with success')
        , (2, 'Quit with failure')
        , (3, 'Go to next step')
        , (4, 'Go to step on_success_step_id');
    
    SELECT 
            [Job Name]              = sj.[name]
          , [Step Name]             = sjs.[step_name]
          , [SQLStatement]          = SUBSTRING(t.[text], ISNULL(r.[statement_start_offset] / 2 + 1,0)
                                        , CASE
                                            WHEN ISNULL(r.[statement_end_offset], 0) = -1 THEN LEN(t.[text])
                                            ELSE ISNULL(r.[statement_end_offset] / 2, 0)
                                          END - ISNULL(r.[statement_start_offset] / 2, 0)
                                        )
          , [On Success Action]     = ASuccess.[ActionText]
          , [On Fail Action]        = AFail.[ActionText]
          , r.[session_id]
          , r.[blocking_session_id]
          , [Estimated Completion]  = CASE
                                        WHEN r.[estimated_completion_time] = 0 THEN 'UNKNOWN'
                                        ELSE CONVERT(varchar(50), DATEADD(MILLISECOND, r.[estimated_completion_time], GETDATE()), 120)
                                      END
          , r.[percent_complete]
          , [Duration]              = DATEDIFF(MINUTE, r.[start_time], GETDATE())
          , r.[last_wait_type]
          , r.[start_time]
          , s.[host_name]
          , [SQLText]               = t.text
          , s.[program_name]
    FROM sys.dm_exec_sessions                               s
          LEFT JOIN sys.dm_exec_requests                    r           ON s.[session_id] = r.[session_id]
          OUTER APPLY sys.dm_exec_sql_text(r.sql_handle)    t
          LEFT JOIN msdb.dbo.sysjobsteps                    sjs         ON SUBSTRING(s.[program_name],30,34) = master.dbo.fn_varbintohexstr(sjs.[job_id])
                                                                            AND SUBSTRING(s.[program_name], 72, LEN(s.[program_name]) - 72) = sjs.[step_id]
          LEFT JOIN msdb.dbo.sysjobs                        sj          ON sjs.[job_id] = sj.[job_id]
          LEFT JOIN @Actions                                AFail       ON sjs.[on_fail_action] = AFail.[ActionID]
          LEFT JOIN @Actions                                ASuccess    ON sjs.[on_success_action] = ASuccess.[ActionID]
    WHERE s.[program_name] like 'SQLAgent - TSQL%'
    ORDER BY sj.[name];
    

    该查询通过将[program_name]列链接sys.dm_exec_sessions到msdb.dbo.sysjobs和msdb.dbo.sysjobsteps表来获取 SQL Server 代理作业的名称。

    Who Is Active在提供类似输出方面做得很好,而且更加灵活。

    • 3
  2. Thomas Franz
    2021-10-27T06:54:50+08:002021-10-27T06:54:50+08:00

    我将 Hannah Vernons 脚本中的一些附加信息与我自己的视图合并,也许它也会有所帮助:

    CREATE OR ALTER VIEW dbo.v_currently_running_sql_agent_jobs
    AS /*
       Lists all currently running jobs (similar to the Activity Monitor of the SQL Agent)
    */
        SELECT job.name                                                                   AS job_name
             , job.originating_server                                                     AS originating_server
             , ISNULL(sjs.step_id, st_curr.step_id)                                       AS current_step_id -- may be wrong, if the job execution order was changed after the job was started
             , CASE WHEN sjs.step_id IS NOT NULL
                    THEN sjs.step_name
                    WHEN activity.run_requested_source = 4 -- SOURCE_USER
                     AND activity.last_executed_step_id IS NULL -- there seems to be no way to find out, with which step the user started before job or at least the start step is done
                    THEN 'unknown; but when user started with the default start step: ' + st_curr.step_name
                    ELSE st_curr.step_name
               END                                                                        AS current_step_name
             , s.session_id                                                               AS session_id
             , s.login_name                                                               AS user_name
             , txt.text                                                                   AS sql_statement
             , activity.last_executed_step_id                                             AS last_executed_step_id
             , st_last.step_name                                                          AS last_executed_step_name
             , hist.last_step_end_time                                                    AS step_start
             , calc.duration_step                                                         AS duration_step_seconds
             , CONCAT(CAST(NULLIF(calc.duration_step / 86400, 0) AS VARCHAR(5)) + ' d ' -- whole days
                    , FORMAT(DATEADD(SECOND, calc.duration_step, '00:00'), 'HH\:mm\:ss')) AS duration_step_readable
             , job.job_id                                                                 AS job_id
             , activity.run_requested_date                                                AS job_start
             , calc.duration_job                                                          AS duration_job_seconds
             , CONCAT(CAST(NULLIF(calc.duration_job / 86400, 0) AS VARCHAR(5)) + ' d ' -- whole days
                    , FORMAT(DATEADD(SECOND, calc.duration_job, '00:00'), 'HH\:mm\:ss'))  AS duration_job_readable
             , CASE activity.run_requested_source
                    WHEN 1 THEN 'SOURCE_SCHEDULER'
                    WHEN 2 THEN 'SOURCE_ALERTER'
                    WHEN 3 THEN 'SOURCE_BOOT'
                    WHEN 4 THEN 'SOURCE_USER'
                    WHEN 6 THEN 'SOURCE_ON_IDLE_SCHEDULE'
                    ELSE 'UNKNOWN'
               END                                                                        AS run_requested_by
             , hist.last_step_start                                                       AS last_step_start_time
             , hist.last_step_end_time                                                    AS last_step_end_time
          -- there is no way to find out, WHO startet the job, until it finishes. When the job is doen, this information (starting user)
          -- will be written to msdb.dbo.sysjobhistory.message (step_id = 0))
          FROM msdb.dbo.sysjobs_view AS job
         INNER JOIN msdb.dbo.sysjobactivity                                                   AS activity
            ON job.job_id            = activity.job_id
         INNER JOIN msdb.dbo.syssessions                                                      AS sess
            ON sess.session_id       = activity.session_id
         INNER JOIN
             (SELECT MAX(agent_start_date) AS max_agent_start_date FROM msdb.dbo.syssessions) AS sess_max
            ON sess.agent_start_date = sess_max.max_agent_start_date
         LEFT JOIN msdb.dbo.sysjobsteps AS st_last
           ON st_last.step_id = activity.last_executed_step_id
          AND st_last.job_id  = activity.job_id
         LEFT JOIN msdb.dbo.sysjobsteps AS st_curr
           ON st_curr.step_id = CASE WHEN activity.last_executed_step_id IS NULL
                                     THEN job.start_step_id
                                     WHEN st_last.on_success_action = 3 -- Go to next step
                                     THEN activity.last_executed_step_id + 1
                                     WHEN st_last.on_success_action = 4 -- Go to step on_success_step_id
                                     THEN st_last.on_success_step_id
                                     ELSE NULL -- should never happen
                                END
          AND st_curr.job_id  = activity.job_id
         OUTER APPLY (SELECT TOP (1) DATEADD(SECOND, hist.run_duration, c_hist.last_step_start
                                            ) last_step_end_time
                            , c_hist.last_step_start, hist.run_date, hist.run_time
                        FROM msdb.dbo.sysjobhistory AS hist
                       CROSS APPLY (SELECT DATETIMEFROMPARTS(hist.run_date / 10000, hist.run_date / 100 % 100, hist.run_date % 100
                                                           , hist.run_time / 10000, hist.run_time / 100 % 100, hist.run_time % 100, 0) AS last_step_start
                                   ) AS c_hist
                       WHERE hist.job_id = activity.job_id
                         AND hist.step_id = activity.last_executed_step_id
                       ORDER BY hist.run_date DESC, hist.run_time DESC
                     ) AS hist
         OUTER APPLY (SELECT DATEDIFF(SECOND, activity.run_requested_date, GETDATE())                                   AS duration_job
                           , DATEDIFF(SECOND, ISNULL(hist.last_step_end_time, activity.run_requested_date), GETDATE())  AS duration_step
                     ) AS calc
          LEFT JOIN sys.dm_exec_sessions                    AS s
            ON s.program_name LIKE 'SQLAgent - TSQL%'
          LEFT JOIN sys.dm_exec_requests                    AS r
            ON s.[session_id] = r.[session_id]
         CROSS APPLY sys.dm_exec_sql_text(r.sql_handle)     AS txt
          LEFT JOIN msdb.dbo.sysjobsteps                    AS sjs
            ON SUBSTRING(s.[program_name],30,34) = master.dbo.fn_varbintohexstr(sjs.[job_id])
           AND SUBSTRING(s.[program_name], 72, LEN(s.[program_name]) - 72) = sjs.[step_id]
    
         WHERE activity.run_requested_date IS NOT NULL
           AND activity.stop_execution_date IS NULL
        ;
    
    • 0

相关问题

  • SQL Server - 使用聚集索引时如何存储数据页

  • 我需要为每种类型的查询使用单独的索引,还是一个多列索引可以工作?

  • 什么时候应该使用唯一约束而不是唯一索引?

  • 死锁的主要原因是什么,可以预防吗?

  • 如何确定是否需要或需要索引

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve