Udostępnij za pomocą


CZEKAJ (Transact-SQL)

Dotyczy:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceBaza danych SQL w usłudze Microsoft Fabric

Blokuje wykonywanie partii, procedury składowanej lub transakcji, dopóki nie upłynął określony czas lub interwał czasu albo określona instrukcja modyfikuje lub zwraca co najmniej jeden wiersz.

Transact-SQL konwencje składni

Syntax

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

Arguments

ZWŁOKA

Określony okres, który musi upłynąć do maksymalnie 24 godzin, przed wykonaniem partii, procedury składowanej lub transakcji.

'time_to_pass'

Czas oczekiwania. time_to_pass można określić w formacie danych daty/godziny lub jako zmienną lokalną. Nie można określić dat, więc część daty wartości daty/godziny nie jest dozwolona. time_to_pass jest sformatowany jako hh:mm[[:ss].fff].

TIME

Określony czas uruchomienia partii, procedury składowanej lub transakcji.

'time_to_execute'

Godzina zakończenia instrukcji WAITFOR. time_to_execute można określić w formacie danych daty/godziny lub można go określić jako zmienną lokalną. Nie można określić dat, więc część daty wartości daty/godziny nie jest dozwolona. time_to_execute jest sformatowany jako hh:mm[[:ss].fff] i opcjonalnie może zawierać datę .1900-01-01

receive_statement

Dotyczy: tylko komunikaty usługi Service Broker. Aby uzyskać więcej informacji, zobacz RECEIVE.

Prawidłowa RECEIVE instrukcja.

get_conversation_group_statement

Dotyczy: tylko komunikaty usługi Service Broker. Aby uzyskać więcej informacji, zobacz GET CONVERSATION GROUP (POBIERZ GRUPĘ KONWERSACJI).

Prawidłowa GET CONVERSATION GROUP instrukcja.

TIMEOUT

Dotyczy: tylko komunikaty usługi Service Broker. Aby uzyskać więcej informacji, zobacz RECEIVE and GET CONVERSATION GROUP ( ODBIERANIE i POBIERANIE GRUPY KONWERSACJI).

Określa okres czasu (w milisekundach) oczekiwania na nadejście komunikatu do kolejki.

Remarks

WAITFOR Podczas wykonywania instrukcji transakcja jest uruchomiona i żadne inne żądania nie mogą być uruchamiane w ramach tej samej transakcji.

Rzeczywiste opóźnienie czasu może się różnić od czasu określonego w time_to_pass, time_to_execute lub przekroczeniu limitu czasu i zależy od poziomu działania serwera. Licznik czasu rozpoczyna się po zaplanowaniu wątku WAITFOR instrukcji. Jeśli serwer jest zajęty, wątek może nie być natychmiast zaplanowany, więc opóźnienie czasu może być dłuższe niż określony czas.

WAITFOR nie zmienia semantyki zapytania. Jeśli zapytanie nie może zwrócić żadnych wierszy, WAITFOR czeka na zawsze lub do momentu TIMEOUT osiągnięcia, jeśli zostanie określony.

Nie można otwierać kursorów na WAITFOR instrukcjach.

Widoków nie można zdefiniować w instrukcjach WAITFOR .

Gdy zapytanie przekroczy opcję oczekiwania zapytania, WAITFOR argument instrukcji może zakończyć się bez uruchamiania. Aby uzyskać więcej informacji na temat opcji konfiguracji, zobacz Konfiguracja serwera: oczekiwanie na zapytanie. Aby wyświetlić aktywne i oczekujące procesy, użyj sp_who.

Każda WAITFOR instrukcja ma skojarzony wątek. Jeśli na tym samym serwerze określono wiele WAITFOR instrukcji, wiele wątków można powiązać czekając na uruchomienie tych instrukcji. Program SQL Server monitoruje liczbę WAITFOR wątków instrukcji i losowo wybiera niektóre z tych wątków, aby zakończyć działanie, jeśli serwer zacznie doświadczać głodu wątku.

Zakleszczenie można utworzyć, uruchamiając zapytanie w WAITFOR ramach transakcji, która zawiera również blokady uniemożliwiające wprowadzenie zmian w zestawie wierszy, do którego uzyskuje dostęp instrukcja WAITFOR . Program SQL Server identyfikuje te scenariusze i zwraca pusty zestaw wyników, jeśli istnieje prawdopodobieństwo takiego zakleszczenia.

Caution

Uwzględnianie WAITFOR spowalnia ukończenie procesu programu SQL Server i może spowodować przekroczenie limitu czasu w aplikacji. W razie potrzeby dostosuj ustawienie limitu czasu dla połączenia na poziomie aplikacji.

Examples

A. Użyj FUNKCJI WAITFOR TIME

Poniższy przykład wykonuje procedurę sp_update_job składowaną w msdb bazie danych o godzinie 10:20 (22:20).

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. Użyj FUNKCJI WAITFOR DELAY

Poniższy przykład wykonuje procedurę składowaną po dwugodzinnym opóźnieniu.

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

C. Używanie funkcji WAITFOR DELAY z zmienną lokalną

W poniższym przykładzie pokazano, jak można użyć zmiennej lokalnej z opcją WAITFOR DELAY . Ta procedura składowana czeka na zmienny okres czasu, a następnie zwraca informacje do użytkownika jako liczbę upłynięcia godzin, minut i sekund.

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.