Sdílet prostřednictvím


ČEKEJ (Transact-SQL)

platí pro:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceSQL databáze v Microsoft Fabric

Blokuje provádění dávky, uložené procedury nebo transakce, dokud se nepředpokládá zadaný čas nebo časový interval, nebo zadaný příkaz upraví nebo vrátí alespoň jeden řádek.

Transact-SQL konvence syntaxe

Syntax

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

Arguments

ZPOŽDĚNÍ

Zadané časové období, které musí proběhnout až do maximálního počtu 24 hodin před provedením dávky, uložené procedury nebo transakce.

'time_to_pass'

Doba čekání. time_to_pass lze zadat buď ve formátu dat datetime , nebo jako místní proměnnou. Kalendářní data nelze zadat, takže část data hodnoty datetime není povolená. time_to_pass je formátován jako hh:mm[[:ss].fff].

TIME

Zadaný čas spuštění dávky, uložené procedury nebo transakce.

'time_to_execute'

Čas dokončení příkazu WAITFOR. time_to_execute lze zadat ve formátu dat datetime nebo je lze zadat jako místní proměnnou. Kalendářní data nelze zadat, takže část data hodnoty datetime není povolená. time_to_execute je formátován tak, jak hh:mm[[:ss].fff] může volitelně obsahovat datum 1900-01-01.

receive_statement

Platí pouze pro: Zprávy service brokeru. Další informace naleznete v tématu RECEIVE.

Platný RECEIVE příkaz.

get_conversation_group_statement

Platí pouze pro: Zprávy service brokeru. Další informace naleznete v tématu ZÍSKAT SKUPINU KONVERZACÍ.

Platný GET CONVERSATION GROUP příkaz.

TIMEOUT

Platí pouze pro: Zprávy service brokeru. Další informace naleznete v tématu PŘÍJEM a ZÍSKÁNÍ SKUPINY KONVERZACÍ.

Určuje časové období v milisekundách, které čekají na doručení zprávy do fronty.

Remarks

Zatímco příkaz WAITFOR se spustí, transakce je spuštěna a žádné jiné požadavky nelze spustit pod stejnou transakcí.

Skutečné časové zpoždění se může lišit od času zadaného v time_to_pass, time_to_execute nebo vypršení časového limitu a závisí na úrovni aktivity serveru. Časový čítač se spustí, když WAITFOR je naplánováno vlákno příkazu. Pokud je server zaneprázdněn, vlákno nemusí být okamžitě naplánováno, takže časové zpoždění může být delší než zadaný čas.

WAITFOR nemění sémantiku dotazu. Pokud dotaz nemůže vrátit žádné řádky, WAITFOR počká natrvalo nebo dokud TIMEOUT se nedosáhne, pokud je zadaný.

Kurzory nelze otevřít u WAITFOR příkazů.

Zobrazení nelze definovat u WAITFOR příkazů.

Pokud dotaz překročí možnost čekání dotazu, WAITFOR může se argument příkazu dokončit bez spuštění. Další informace o možnosti konfigurace naleznete v tématu Konfigurace serveru: čekání dotazu. Pokud chcete zobrazit aktivní a čekající procesy, použijte sp_who.

Každý WAITFOR příkaz má přidružené vlákno. Pokud je na stejném serveru zadáno mnoho WAITFOR příkazů, může být mnoho vláken svázané, než se tyto příkazy spustí. SQL Server monitoruje počet WAITFOR vláken příkazů a náhodně vybere některá z těchto vláken, která se mají ukončit, pokud server začne používat hladové vlákno.

Zablokování můžete vytvořit spuštěním dotazu v WAITFOR rámci transakce, která také obsahuje zámky bránící změnám sady řádků, ke kterým příkaz WAITFOR přistupuje. SQL Server identifikuje tyto scénáře a vrátí prázdnou sadu výsledků, pokud existuje pravděpodobnost takového zablokování.

Caution

Zahrnutí WAITFOR zpomalí dokončení procesu SQL Serveru a může vést k vypršení časového limitu v aplikaci. V případě potřeby upravte nastavení časového limitu pro připojení na úrovni aplikace.

Examples

A. Použití FUNKCE WAITFOR TIME

Následující příklad spustí uloženou proceduru sp_update_jobmsdb v databázi v 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. Použití WAITFOR DELAY

Následující příklad spustí uloženou proceduru po dvouhodinovém zpoždění.

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

C. Použití WAITFOR DELAY s místní proměnnou

Následující příklad ukazuje, jak lze s možností použít místní proměnnou WAITFOR DELAY . Tato uložená procedura počká na proměnlivou dobu a pak uživateli vrátí informace jako uplynulý počet hodin, minut a 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

Tady je soubor výsledků.

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