首页 > 解决方案 > 如何记录存储过程执行运行时间

问题描述

只是在 SQL Server 中寻找存储过程的一些帮助。我经常遇到以下代码:

DECLARE @StartTime datetime
DECLARE @EndTime datetime
SELECT @StartTime=GETDATE() 

 -- Write Your Query


SELECT @EndTime=GETDATE()

--This will return execution time of your query
SELECT DATEDIFF(MS,@StartTime,@EndTime) AS [Duration in millisecs] 

这只会将数据保存在输出面板(消息)中。我想知道是否可以将每次脚本的运行时间结果保存到表中。例如,可能看起来像这样的表:

CREATE TABLE Job_Batch(
    JobID NVARCHAR(MAX),
    JobDate NVARCHAR(MAX),
    JobTime NVARCHAR(MAX),
    JobDuration NVARCHAR(MAX),
    JobStatus NVARCHAR(MAX)
)

该脚本还应该能够在每次运行时生成自己的 JobID。

标签: sql-server

解决方案


我把你的桌子改了一点,只是为了更好地捕捉到一些东西:

declare @job_batch table (
    JobId int identity(1,1),
    JobName varchar(255),
    JobDate datetime,
    JobElapsedMs int,
    JobStatus nvarchar(4000)
);

让我做一个样本和临时程序来测试这个概念:

create or alter procedure #dummyProc as
begin
    declare @i int = 0;
    while @i < 100000 
    begin
        set @i += 1;
    end
end

下面的代码演示了将所需信息放入日志记录表中:

declare 
    @StartTime datetime = getdate(),
    @JobStatus nvarchar(4000);

begin try
    exec #dummyProc
    set @JobStatus = 'Success';
end try
begin catch
    set @JobStatus = error_message();
end catch

insert  @job_batch (JobName, JobDate, JobElapsedMs, JobStatus)
values  ('#dummyProc', @StartTime, datediff(ms,@StartTime,getdate()), @JobStatus);

当您查询 @job_batch 表时:

select * from @job_batch;

你得到这个:

+-------+------------+-------------------------+--------------+------------+
| JobId |   JobName  |          JobDate        | JobElapsedMs | Job Status |
+-------+------------+-------------------------+--------------+------------+
|   1   | #dummyProc | 2021-01-28 00:22:57.370 |     60       |  Success   |
+-------+------------+-------------------------+--------------+------------+

推荐阅读