Megosztás:


VÁRJ (Transact-SQL)

A következőkre vonatkozik:SQL ServerAzure SQL DatabaseFelügyelt Azure SQL-példánySQL-adatbázis a Microsoft Fabricben

Letiltja egy köteg, tárolt eljárás vagy tranzakció végrehajtását, amíg egy megadott idő vagy időintervallum el nem telik, vagy egy megadott utasítás módosít vagy visszaad legalább egy sort.

Transact-SQL szintaxis konvenciók

Syntax

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

Arguments

KÉSÉS

A megadott időtartam, amely egy köteg, tárolt eljárás vagy tranzakció folytatása előtt legfeljebb 24 óráig tart.

'time_to_pass'

A várakozási idő. time_to_passmegadható dátum/idő adatformátumban vagy helyi változóként. A dátumok nem adhatók meg, ezért a dátum/idő érték dátumrésze nem engedélyezett. time_to_pass formátuma : hh:mm[[:ss].fff].

TIME

A köteg, a tárolt eljárás vagy a tranzakció futásának megadott időpontja.

'time_to_execute'

A WAITFOR utasítás befejezésének időpontja. time_to_executemegadható datetime adatformátumban, vagy helyi változóként is megadható. A dátumok nem adhatók meg, ezért a dátum/idő érték dátumrésze nem engedélyezett. time_to_execute formátuma hh:mm[[:ss].fff] a következő, és opcionálisan a dátumot is tartalmazhatja 1900-01-01.

receive_statement

Csak a szolgáltatásközvetítői üzenetekre vonatkozik. További információ: FOGADÁS.

Érvényes RECEIVE utasítás.

get_conversation_group_statement

Csak a szolgáltatásközvetítői üzenetekre vonatkozik. További információ: GET CONVERSATION GROUP.

Érvényes GET CONVERSATION GROUP utasítás.

IDŐKÉRÉS

Csak a szolgáltatásközvetítői üzenetekre vonatkozik. További információ: FOGADÁS ÉS BESZÉLGETÉSI CSOPORT LEKÉRÉSE.

Ezredmásodpercben megadja, hogy mennyi ideig várjon egy üzenet az üzenetsorra.

Remarks

WAITFOR Az utasítás végrehajtása közben a tranzakció fut, és más kérések nem futtathatók ugyanabban a tranzakcióban.

A tényleges idő késleltetése eltérhet a time_to_pass, time_to_execute vagy időtúllépésben megadott időtől, és a kiszolgáló tevékenységi szintjétől függ. Az időszámláló az utasításszál ütemezésekor WAITFOR kezdődik. Ha a kiszolgáló foglalt, előfordulhat, hogy a szál nem lesz azonnal ütemezve, így az idő késleltetése hosszabb lehet a megadott időnél.

WAITFOR nem módosítja a lekérdezés szemantikáját. Ha egy lekérdezés nem tud sorokat visszaadni, WAITFOR akkor a megadott esetben örökké vár, vagy amíg el nem TIMEOUT éri a lekérdezést.

A kurzorok nem nyithatóak meg utasításokon WAITFOR .

A nézetek nem határozhatók meg utasításokon WAITFOR .

Ha a lekérdezés túllépi a lekérdezés várakozási lehetőségét, az WAITFOR utasítás argumentum futtatása nélkül is befejeződhet. A konfigurációs beállításról további információt a Kiszolgáló konfigurációja: lekérdezési várakozás című témakörben talál. Az aktív és várakozási folyamatok megtekintéséhez használja a sp_who.

Minden WAITFOR utasításhoz tartozik egy szál. Ha sok WAITFOR utasítás van megadva ugyanazon a kiszolgálón, számos szál köthető össze, és várhatja, hogy ezek az utasítások fussanak. Az SQL Server figyeli az utasításszálak számát WAITFOR , és véletlenszerűen kiválaszt néhány szálat a kilépéshez, ha a kiszolgáló elkezdi tapasztalni a szál éhezést.

Holtpontot úgy hozhat létre, ha egy olyan lekérdezést futtat egy tranzakción WAITFOR belül, amely zárolásokat is tartalmaz, megakadályozva az utasítás által WAITFOR elért sorhalmaz módosításait. Az SQL Server azonosítja ezeket a forgatókönyveket, és üres eredményhalmazt ad vissza, ha fennáll az ilyen holtpont esélye.

Caution

Az WAITFOR SQL Server-folyamat befejeződésének lassítása időtúllépési üzenetet eredményezhet az alkalmazásban. Szükség esetén módosítsa a kapcsolat időtúllépési beállítását az alkalmazás szintjén.

Examples

A. A WAITFOR TIME használata

Az alábbi példa a tárolt eljárást sp_update_job 10:20-kor (10:20-kor)msdb hajtja végre az 22:20 adatbázisban.

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. A WAITFOR DELAY használata

Az alábbi példa két órás késés után hajtja végre a tárolt eljárást.

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

C. A WAITFOR DELAY használata helyi változóval

Az alábbi példa bemutatja, hogyan használható egy helyi változó a WAITFOR DELAY beállítással. Ez a tárolt eljárás változó ideig várakozik, majd adatokat ad vissza a felhasználónak az eltelt órák, percek és másodpercek számaként.

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

Itt van az eredmények összessége.

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