Udostępnij za pośrednictwem


WAITFOR (Transact-SQL)

Blokuje wykonanie partia, procedura składowanalub transakcji, aż do osiągnięcia określonego czas lub interwał czas lub modyfikuje określonych instrukcja lub zwraca wartość co najmniej jeden wiersz.

Ikona łącza do tematuJęzyka Transact-SQL składni konwencje

Składnia

WAITFOR 
{
    DELAY 'time_to_pass' 
  | TIME 'time_to_execute' 
  | [ ( receive_statement ) | ( get_conversation_group_statement ) ] 
    [ , TIMEOUT timeout ]
}

Argumenty

  • OPÓŹNIENIE
    Jest określony okres czas musi upłynąć, maksymalnie do maksymalnie 24 godziny przed wykonaniem partia procedura składowanalub przechodzą transakcji.

  • 'time_to_pass'
    Jest to okres czas oczekiwania.time_to_passmożna określić w jednym z formatów akceptowalne dla datetime danych, lub może być określona jako zmiennej lokalnej.Nie można określić daty; Dlatego też data części datetime wartość nie jest dozwolona.

  • CZAS
    Jest określony czas po uruchomieniu partia, procedura składowanalub transakcji.

  • 'time_to_execute'
    Jest to czas zakończy się WAITFOR instrukcja .time_to_executemożna określić w jednym z formatów akceptowalne dla datetime danych, lub może być określona jako zmiennej lokalnej.Nie można określić daty; Dlatego też data części datetime wartość nie jest dozwolona.

  • receive_statement
    Jest ważne ODBIERZ instrukcja.

    Ważna informacjaWażne:

    WAITFOR z receive_statement ma zastosowanie tylko do Service Broker wiadomości.Aby uzyskać więcej informacji, zobacz ODBIERANIE (Transact-SQL).

  • get_conversation_group_statement
    Jest prawidłowy uzyskać grupy KONWERSACJI instrukcja.

    Ważna informacjaWażne:

    WAITFOR z get_conversation_group_statement ma zastosowanie tylko do Service Broker wiadomości.Aby uzyskać więcej informacji, zobacz Pobierz KONWERSACJĘ grupy (Transact-SQL).

  • LIMIT CZASUtimeout
    Określa okres czasw milisekundach czekać na wiadomości przychodzące do kolejki.

    Ważna informacjaWażne:

    Określanie WAITFOR limitu czasu ma zastosowanie tylko do Service Broker wiadomości.Aby uzyskać więcej informacji, zobacz ODBIERANIE (Transact-SQL) i Pobierz KONWERSACJĘ grupy (Transact-SQL).

Uwagi

Podczas wykonywania WAITFOR instrukcja, transakcja jest uruchomiony i inne żądania mogą być uruchamiane tej samej transakcji.

Rzeczywisty czas opóźnienia mogą się różnić od czas określonego w time_to_pass, time_to_execute, lub timeout i zależy od poziom aktywności serwera.Licznik czas uruchamia podczas planowania wątek skojarzonych z WAITFOR instrukcja .Jeśli serwer jest zajęty, wątek mogą nie być natychmiast zaplanowane; w związku z tym czas może być dłuższy niż określony czas.

WAITFOR nie zmienia semantyka kwerendy.Kwerenda nie może zwrócić wszystkie wiersze, WAITFOR będzie czekać nieskończoność lub dopóki nie osiągnie limitu czasu, jeśli określony.

Nie można otworzyć kursory w deklaracjach WAITFOR.

Widoki nie mogą być definiowane w deklaracjach WAITFOR.

Gdy kwerenda przekracza query wait , opcja argumencie instrukcja WAITFOR można wykonać bez uruchamiania.Aby uzyskać więcej informacji na temat opcji konfiguracja , zobacz Kwerenda oczekiwania opcji.Aby wyświetlić aktywne i oczekiwania procesów, sp_who.

Każda WAITFOR instrukcja ma wątek skojarzony z nim.Jeżeli podano wiele instrukcji WAITFOR na tym samym serwerze, wiele wątków może powiązane oczekiwania na tych instrukcji do uruchomienia.SQL Servermonitoruje liczba wątków skojarzonych z instrukcji WAITFOR i losowo wybiera niektóre z tych wątków, aby zakończyć, jeśli serwer uruchamia się wystąpić wyzwolony wątek .

Uruchamiając kwerendę WAITFOR w obrębie transakcji, przechowujący blokad zapobieganie zmianom zestaw wierszy WAITFOR instrukcja próbuje uzyskać dostęp, można utworzyć zakleszczenie .SQL Serveridentyfikuje te scenariusze i zwraca pusty zestaw wyników , jeżeli istnieje ryzyko takiego zakleszczenie .

Przykłady

A.Za pomocą WAITFOR czasu

Poniższy przykład wykonuje procedura składowana sp_update_job godzinie 10: 20(22:20).

USE msdb;
EXECUTE sp_add_job @job_name = 'TestJob';
BEGIN
    WAITFOR TIME '22:20';
    EXECUTE sp_update_job @job_name = 'TestJob',
        @new_name = 'UpdatedJob';
END;
GO

B.Za pomocą opóźnienie WAITFOR

Poniższy przykład wykonuje procedura składowana opóźnieniem dwóch godzin.

BEGIN
    WAITFOR DELAY '02:00';
    EXECUTE sp_helpdb;
END;
GO

C.WAITFOR opóźnienia przy użyciu zmiennej lokalnej

W poniższym przykładzie pokazano, jak zmienna lokalna może być używany z WAITFOR DELAY opcji.procedura składowana tworzone czas oczekiwania i zwraca informacje o użytkownikowi liczbę godzin, minut i sekund, które upłynęły.

USE AdventureWorks2008R2;
GO
IF OBJECT_ID('dbo.TimeDelay_hh_mm_ss','P') IS NOT NULL
    DROP PROCEDURE dbo.TimeDelay_hh_mm_ss;
GO
CREATE PROCEDURE dbo.TimeDelay_hh_mm_ss 
    (
    @DelayLength char(8)= '00:00:00'
    )
AS
DECLARE @ReturnInfo varchar(255)
IF ISDATE('2000-01-01 ' + @DelayLength + '.000') = 0
    BEGIN
        SELECT @ReturnInfo = 'Invalid time ' + @DelayLength 
        + ',hh:mm:ss, submitted.';
        -- This PRINT statement is for testing, not use in production.
        PRINT @ReturnInfo 
        RETURN(1)
    END
BEGIN
    WAITFOR DELAY @DelayLength
    SELECT @ReturnInfo = 'A total time of ' + @DelayLength + ', 
        hh:mm:ss, has elapsed! Your time is up.'
    -- This PRINT statement is for testing, not use in production.
    PRINT @ReturnInfo;
END;
GO
/* This statement executes the dbo.TimeDelay_hh_mm_ss procedure. */
EXEC TimeDelay_hh_mm_ss '00:00:10';
GO

Oto zestaw wyników.

A total time of 00:00:10, in hh:mm:ss, has elapsed. Your time is up.