SQL查询实现Time列逐行递增1秒(不使用临时表)方法咨询
修改后可直接使用的SQL脚本
无需临时表、无需游标,单条查询即可满足Time列逐行递增1秒的要求,适配Zabbix采集场景:
SELECT DATEADD(SECOND, ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) - 1, GETDATE()) AS Time, r.session_id, r.cpu_time, p.physical_io, t.text, SUBSTRING(t.text, r.statement_start_offset/2 + 1, CASE WHEN r.statement_end_offset = -1 THEN LEN(t.text) ELSE (r.statement_end_offset - r.statement_start_offset)/2 END ) AS text_running, p.blocked, DB_NAME(p.dbid) AS dbname, r.status AS request_status, r.command, r.start_time, r.wait_type AS request_wait_type, p.waitresource, p.status AS process_status, p.open_tran, p.loginame, p.hostname, p.program_name, r.percent_complete, r.last_wait_type, p.waittime FROM sys.dm_exec_requests r CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) t INNER JOIN sys.sysprocesses p ON p.spid = r.session_id
关键调整说明
- 移除原脚本中完全无效的游标逻辑:原脚本游标仅循环执行fetch操作,未定义变量接收fetch结果、也未做任何结果输出,执行后不会返回任何数据集,根本无法满足Zabbix采集要求
- Time列实现逻辑:通过
ROW_NUMBER() OVER(ORDER BY (SELECT NULL))为结果集生成从1开始的连续行号,用DATEADD函数基于查询触发时的基准时间逐行累加1秒,第一行Time为查询执行的当前时间,后续每行依次+1秒,完全匹配需求 - 修正原查询的列问题:删除了重复选取的
r.wait_type列,给来自sys.dm_exec_requests和sys.sysprocesses的重名status、wait_type列加了明确别名,避免Zabbix采集、Grafana可视化时出现列名冲突 - 行号生成用
ORDER BY (SELECT NULL)写法,跳过不必要的排序开销,不会对系统DMV查询造成额外性能影响
内容的提问来源于stack exchange,提问作者Tonn12
相关产品推荐
相关产品推荐

