SQL While循环需要多长时间?

12

我基本上想捕获SQL命令及其CPU等待时间,并且我只想运行一个while循环60秒,并将所有数据插入临时表中。 我不太擅长游标,也不知道如何在SQL中完成这个任务。

BEGIN
   CREATE TABLE #DiagTable
   (
      sessionID          NVARCHAR (MAX),
      dbname             NVARCHAR (MAX),
      starttime          NVARCHAR (MAX),
      cmd                NVARCHAR (MAX),
      stat               NVARCHAR (MAX),
      cputime            NVARCHAR (MAX),
      totalelapsedtime   NVARCHAR (MAX),
      reads              NVARCHAR (MAX),
      writes             NVARCHAR (MAX),
      [query]            NVARCHAR (MAX)
   )
DECLARE @id INT
DECLARE x CURSOR FOR SELECT 60
OPEN x
FETCH NEXT FROM x INTO @id
WHILE @@FETCH_STATUS = 0 BEGIN WAITFOR DELAY '000:00:01'
-- 在此处开始循环 INSERT INTO #DiagTable SELECT a.session_id, db_name (a.database_id) AS db_name, a.start_time, a.command, a.status, a.cpu_time, a.total_elapsed_time, a.reads, a.writes, b.text AS query FROM sys.dm_exec_requests a OUTER APPLY sys.dm_exec_sql_text (a.sql_handle) b WHERE a.session_id > 50 -- 过滤掉后台任务 AND a.session_id <> @@spid -- 过滤掉当前查询会话 ORDER BY a.cpu_time DESC;
WAITFOR DELAY '00:00:01'
FETCH NEXT FROM x INTO @id END
CLOSE x
DEALLOCATE x
-- 在此处结束循环 SELECT * FROM #DiagTable;
DROP TABLE #DiagTable; END

不确定选择60是否是我想要的...


你说的“60秒while循环”是什么意思?是指你想要每秒捕获一次数据,持续60秒(这样你就会得到60组查询结果)吗?还是想每隔60秒捕获一次数据,重复n次呢? - Aaron Bertrand
1
您可以使用带有 WAITFOR 的 while 循环。 http://technet.microsoft.com/zh-cn/library/ms187331.aspx - EricZ
@AaronBertrand 请看我的编辑,基本上每隔一秒钟,我都想运行一个 select 命令,将其插入到一个临时表中。 - user222427
@EricZ,“WAITFOR”就像是一个睡眠命令,它只是暂停了那么长时间。不认为这是OP想要的。 - Andrew
@Andrew 如果我的光标暂停了60次,那么就是这样了。 - user222427
2个回答

29

要每秒钟执行您的脚本一分钟,您可以像这样做:

DECLARE @i INT = 1;

WHILE (@i <= 60)
 BEGIN
  WAITFOR DELAY '00:00:01'

       /*Your Script*/

 SET  @i = @i + 1;
END 

我会在临时表 #DiagTable 中添加另一列 Session INT,并将 @i 的值添加到该列中,以跟踪每个loop插入的记录。


10
-- Your code here --

waitfor delay '00:00:01'
GO 60

6
GO 是一种批处理语句。GO 60 表示运行以上内容60次。 - sam yi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接