Dela via


WAITFOR (Transact-SQL)

Gäller för:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceSQL-databas i Förhandsversion av Microsoft Fabric

Blockerar körningen av en batch, lagrad procedur eller transaktion tills antingen ett angivet tids- eller tidsintervall förflutit eller en angiven instruktion ändrar eller returnerar minst en rad.

Transact-SQL syntaxkonventioner

Syntax

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

Arguments

DELAY

Den angivna tidsperiod som måste passera upp till högst 24 timmar innan en batch, en lagrad procedur eller en transaktion fortsätter.

'time_to_pass'

Väntetiden. time_to_pass kan anges antingen i ett datetime-dataformat eller som en lokal variabel. Det går inte att ange datum, så datumdelen av datetime-värdet tillåts inte. time_to_pass formateras som hh:mm[[:ss].fff].

TIME

Den angivna tiden när batchen, den lagrade proceduren eller transaktionen körs.

'time_to_execute'

Tidpunkten då WAITFOR-instruktionen avslutas. time_to_execute kan anges i ett datetime-dataformat eller anges som en lokal variabel. Det går inte att ange datum, så datumdelen av datetime-värdet tillåts inte. time_to_execute formateras som hh:mm[[:ss].fff] och kan eventuellt innehålla datumet 1900-01-01för .

receive_statement

Gäller endast för: Service Broker-meddelanden. Mer information finns i TA EMOT.

Ett giltigt RECEIVE uttryck.

get_conversation_group_statement

Gäller endast för: Service Broker-meddelanden. Mer information finns i GET CONVERSATION GROUP (HÄMTA KONVERSATIONSGRUPP).

Ett giltigt GET CONVERSATION GROUP uttryck.

TIMEOUT timeout

Gäller endast för: Service Broker-meddelanden. Mer information finns i TA EMOT och FÅ KONVERSATIONSGRUPP.

Anger tidsperioden i millisekunder för att vänta tills ett meddelande tas emot i kön.

Remarks

Medan -instruktionen WAITFOR körs körs transaktionen och inga andra begäranden kan köras under samma transaktion.

Den faktiska tidsfördröjningen kan variera från den tid som anges i time_to_pass, time_to_execute eller tidsgräns och beror på serverns aktivitetsnivå. Tidsräknaren startar när instruktionstråden WAITFOR schemaläggs. Om servern är upptagen kanske tråden inte schemaläggs omedelbart, så tidsfördröjningen kan vara längre än den angivna tiden.

WAITFOR ändrar inte semantiken för en fråga. Om en fråga inte kan returnera några rader WAITFOR väntar du för alltid eller tills den har nåtts TIMEOUT , om den anges.

Det går inte att öppna markörer för WAITFOR instruktioner.

Det går inte att definiera vyer för WAITFOR instruktioner.

När frågan överskrider frågeväntealternativet kan instruktionsargumentet WAITFOR slutföras utan att köras. Mer information om konfigurationsalternativet finns i Serverkonfiguration: frågevänte. Om du vill se aktiva processer och väntande processer använder du sp_who.

Varje WAITFOR instruktion har en tråd som är associerad med den. Om många WAITFOR instruktioner anges på samma server kan många trådar vara bundna i väntan på att dessa instruktioner ska köras. SQL Server övervakar antalet WAITFOR instruktionstrådar och väljer slumpmässigt några av dessa trådar för att avsluta om servern börjar uppleva trådsvältning.

Du kan skapa ett dödläge genom att köra en fråga med WAITFOR i en transaktion som också innehåller lås som förhindrar ändringar i den raduppsättning som används av -instruktionen WAITFOR . SQL Server identifierar dessa scenarier och returnerar en tom resultatuppsättning om risken för ett sådant dödläge finns.

Caution

Att inkludera WAITFOR fördröjer slutförandet av SQL Server-processen och kan resultera i ett timeout-meddelande i programmet. Justera vid behov tidsgränsinställningen för anslutningen på programnivå.

Examples

A. Använda WAITFOR TIME

I följande exempel körs den lagrade proceduren sp_update_jobmsdb i databasen kl. 22: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. Använd WAITFOR DELAY

I följande exempel körs den lagrade proceduren efter en fördröjning på två timmar.

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

C. Använda WAITFOR DELAY med en lokal variabel

I följande exempel visas hur en lokal variabel kan användas med alternativet WAITFOR DELAY . Den här lagrade proceduren väntar under en variabel tidsperiod och returnerar sedan information till användaren när det förflutna antalet timmar, minuter och sekunder.

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

Här är resultatet.

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