2013-12-06 5 views
3

Я в основном пытаюсь использовать команды sql и время ожидания для CPU, и я просто хочу запустить цикл while в течение 60 секунд и вставить все данные в таблицу temp. Я не очень хорош, когда курсоры, или как это сделать в sql.SQL While Loop 60 секунд?

 
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' 

     -- begin loop here 
     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    -- filter out background tasks 
           AND a.session_id @@spid -- filter out this query session 
     ORDER BY a.cpu_time DESC; 

     WAITFOR DELAY '00:00:01' 

     FETCH NEXT FROM x INTO @id 
    END 

    CLOSE x 

    DEALLOCATE x 

    -- end loop here 
    SELECT * FROM #DiagTable; 

    DROP TABLE #DiagTable; 
END 

не уверен, если выбрать 60 является то, что я хочу ...

+0

Что значит «цикл while в течение 60 секунд»? Вы хотите, чтобы вы захотели захватить эти данные раз в секунду на 60 секунд (чтобы вы получили 60 наборов запросов)? Или вы хотите записывать эти данные каждые 60 секунд, n раз? –

+1

Вы можете использовать цикл while с WAITFOR http://technet.microsoft.com/en-us/library/ms187331.aspx – EricZ

+0

@AaronBertrand См. Мое редактирование, в основном каждую секунду в течение 1 минуты. Я хочу запустить команду выбора, которая вставляет в таблицу temp –

ответ

11

Чтобы выполнить скрипт вам каждую секунду в течение одной минуты вы могли так что-то вроде этого

DECLARE @i INT = 1; 

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

     /*Your Script*/ 

SET @i = @i + 1; 
END 

Я хотел бы добавить еще один столбец в таблице temp #DiagTable Session INT и добавьте значение @i в этом столбце, чтобы отслеживать записи, вставленные каждым loop.

3
-- Your code here -- 

waitfor delay '00:00:01' 
GO 60 
+0

Отлично работает, но почему ??? : D –

+2

'GO' - это оператор партии. 'GO 60' говорит, что работает выше 60 раз. –