Delen via


WAITFOR (Transact-SQL)

Van toepassing op:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceSQL-database in Microsoft Fabric Preview

Hiermee blokkeert u de uitvoering van een batch, opgeslagen procedure of transactie totdat een opgegeven tijd- of tijdsinterval is verstreken, of een opgegeven instructie ten minste één rij wijzigt of retourneert.

Transact-SQL syntaxis-conventies

Syntax

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

Arguments

DELAY

De opgegeven periode die moet worden verstreken, maximaal 24 uur, voordat een batch, opgeslagen procedure of transactie wordt uitgevoerd.

'time_to_pass'

De tijdsperiode die moet worden gewacht. time_to_pass kan worden opgegeven in een datum/tijd-gegevensindeling of als een lokale variabele. Datums kunnen niet worden opgegeven, dus het datumgedeelte van de datum/tijd-waarde is niet toegestaan. time_to_pass is opgemaakt als hh:mm[[:ss].fff].

TIME

De opgegeven tijd waarop de batch, opgeslagen procedure of transactie wordt uitgevoerd.

'time_to_execute'

Het tijdstip waarop de WAITFOR-instructie is voltooid. time_to_execute kan worden opgegeven in een datum/tijd-gegevensindeling , of kan worden opgegeven als een lokale variabele. Datums kunnen niet worden opgegeven, dus het datumgedeelte van de datum/tijd-waarde is niet toegestaan. time_to_execute is opgemaakt als hh:mm[[:ss].fff] en kan eventueel de datum van 1900-01-01.

receive_statement

Van toepassing op: Alleen Service Broker-berichten. Zie RECEIVE voor meer informatie.

Een geldige RECEIVE instructie.

get_conversation_group_statement

Van toepassing op: Alleen Service Broker-berichten. Zie GESPREKSGROEP OPHALEN voor meer informatie.

Een geldige GET CONVERSATION GROUP instructie.

TIMEOUT timeout

Van toepassing op: Alleen Service Broker-berichten. Zie RECEIVE and GET CONVERSATION GROUP (ONTVANGEN en OPHALEN) voor meer informatie.

Hiermee geeft u de periode in milliseconden op om te wachten tot een bericht in de wachtrij aankomt.

Remarks

Terwijl de WAITFOR instructie wordt uitgevoerd, wordt de transactie uitgevoerd en kunnen er geen andere aanvragen worden uitgevoerd onder dezelfde transactie.

De werkelijke tijdsvertraging kan variëren van de tijd die is opgegeven in time_to_pass, time_to_execute of time-out, en is afhankelijk van het activiteitsniveau van de server. De tijdteller begint wanneer de WAITFOR instructiethread is gepland. Als de server bezet is, wordt de thread mogelijk niet onmiddellijk gepland, zodat de tijdsvertraging langer kan zijn dan de opgegeven tijd.

WAITFOR wijzigt de semantiek van een query niet. Als een query geen rijen kan retourneren, WAITFOR wacht u voor altijd of totdat TIMEOUT deze is bereikt, indien opgegeven.

Cursors kunnen niet worden geopend voor WAITFOR instructies.

Weergaven kunnen niet worden gedefinieerd voor WAITFOR instructies.

Wanneer de query de wachtoptie voor query's overschrijdt, kan het WAITFOR instructieargument worden voltooid zonder uit te voeren. Zie Serverconfiguratie: wachten op query's voor meer informatie over de configuratieoptie. Gebruik sp_who om de actieve en wachtende processen te bekijken.

Aan elke WAITFOR instructie is een thread gekoppeld. Als er veel WAITFOR instructies op dezelfde server zijn opgegeven, kunnen veel threads worden gekoppeld totdat deze instructies worden uitgevoerd. SQL Server bewaakt het aantal WAITFOR instructiethreads en selecteert willekeurig enkele van deze threads om af te sluiten als de server thread-starvatie ervaart.

U kunt een impasse maken door een query uit te voeren met WAITFOR binnen een transactie die ook vergrendelingen bevat die voorkomen dat wijzigingen in de rijenset worden geopend door de WAITFOR instructie. SQL Server identificeert deze scenario's en retourneert een lege resultatenset als de kans op een dergelijke impasse bestaat.

Caution

Het opnemen WAITFOR van de voltooiing van het SQL Server-proces vertraagt en kan resulteren in een time-outbericht in de toepassing. Pas indien nodig de time-outinstelling voor de verbinding op toepassingsniveau aan.

Examples

A. WACHTTIJD GEBRUIKEN

In het volgende voorbeeld wordt de opgeslagen procedure sp_update_job uitgevoerd in de msdb database om 10:20 uur (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. WAITFOR DELAY gebruiken

In het volgende voorbeeld wordt de opgeslagen procedure uitgevoerd na een vertraging van twee uur.

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

C. WAITFOR DELAY gebruiken met een lokale variabele

In het volgende voorbeeld ziet u hoe een lokale variabele kan worden gebruikt met de WAITFOR DELAY optie. Deze opgeslagen procedure wacht op een variabele periode en retourneert vervolgens informatie naar de gebruiker als het verstreken aantal uren, minuten en seconden.

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

Hier is het resultatenoverzicht.

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