Bagikan melalui


TUNGGU (Transact-SQL)

Berlaku untuk:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceDatabase SQL di Microsoft Fabric

Memblokir eksekusi batch, prosedur tersimpan, atau transaksi hingga interval waktu atau waktu tertentu berlalu, atau pernyataan tertentu memodifikasi atau mengembalikan setidaknya satu baris.

Konvensi sintaks transact-SQL

Syntax

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

Arguments

DELAY

Periode waktu yang ditentukan yang harus diteruskan, hingga maksimum 24 jam, sebelum eksekusi batch, prosedur tersimpan, atau transaksi berlangsung.

'time_to_pass'

Periode waktu untuk menunggu. time_to_pass dapat ditentukan baik dalam format data tanggalwaktu , atau sebagai variabel lokal. Tanggal tidak dapat ditentukan, sehingga bagian tanggal dari nilai tanggalwaktu tidak diizinkan. time_to_pass diformat sebagai hh:mm[[:ss].fff].

TIME

Waktu yang ditentukan ketika batch, prosedur tersimpan, atau transaksi berjalan.

'time_to_execute'

Waktu di mana pernyataan WAITFOR selesai. time_to_execute dapat ditentukan dalam format data tanggalwaktu , atau dapat ditentukan sebagai variabel lokal. Tanggal tidak dapat ditentukan, sehingga bagian tanggal dari nilai tanggalwaktu tidak diizinkan. time_to_execute diformat sebagai hh:mm[[:ss].fff] dan dapat secara opsional menyertakan tanggal 1900-01-01.

receive_statement

Berlaku untuk: Pesan Service Broker saja. Untuk informasi selengkapnya, lihat RECEIVE.

Pernyataan yang valid RECEIVE .

get_conversation_group_statement

Berlaku untuk: Pesan Service Broker saja. Untuk informasi selengkapnya, lihat GET CONVERSATION GROUP.

Pernyataan yang valid GET CONVERSATION GROUP .

Batas waktu BATAS waktu

Berlaku untuk: Pesan Service Broker saja. Untuk informasi selengkapnya, lihat MENERIMA dan MENDAPATKAN GRUP PERCAKAPAN.

Menentukan periode waktu, dalam milidetik, untuk menunggu pesan tiba pada antrean.

Remarks

WAITFOR Saat pernyataan dijalankan, transaksi berjalan dan tidak ada permintaan lain yang dapat berjalan di bawah transaksi yang sama.

Penundaan waktu aktual mungkin bervariasi dari waktu yang ditentukan dalam time_to_pass, time_to_execute, atau batas waktu, dan tergantung pada tingkat aktivitas server. Penghitung waktu dimulai ketika utas pernyataan dijadwalkan WAITFOR . Jika server sibuk, utas mungkin tidak segera dijadwalkan, sehingga penundaan waktu mungkin lebih lama dari waktu yang ditentukan.

WAITFOR tidak mengubah semantik kueri. Jika kueri tidak dapat mengembalikan baris apa pun, WAITFOR tunggu selamanya atau hingga TIMEOUT tercapai, jika ditentukan.

Kursor tidak dapat dibuka pada WAITFOR pernyataan.

Tampilan tidak dapat ditentukan pada WAITFOR pernyataan.

Saat kueri melebihi opsi tunggu kueri, WAITFOR argumen pernyataan bisa selesai tanpa berjalan. Untuk informasi selengkapnya tentang opsi konfigurasi, lihat Konfigurasi server: kueri tunggu. Untuk melihat proses aktif dan menunggu, gunakan sp_who.

Setiap WAITFOR pernyataan memiliki utas yang terkait dengannya. Jika banyak WAITFOR pernyataan ditentukan pada server yang sama, banyak utas dapat diikat menunggu pernyataan ini berjalan. SQL Server memantau jumlah WAITFOR utas pernyataan, dan secara acak memilih beberapa utas ini untuk keluar jika server mulai mengalami kelaparan utas.

Anda dapat membuat kebuntuan dengan menjalankan kueri dengan WAITFOR dalam transaksi yang juga menyimpan kunci yang mencegah perubahan pada set baris yang diakses oleh WAITFOR pernyataan. SQL Server mengidentifikasi skenario ini dan mengembalikan hasil kosong yang ditetapkan jika kemungkinan kebuntuan tersebut ada.

Caution

Termasuk WAITFOR memperlambat penyelesaian proses SQL Server dan dapat mengakibatkan pesan batas waktu dalam aplikasi. Jika perlu, sesuaikan pengaturan batas waktu untuk koneksi di tingkat aplikasi.

Examples

A. Gunakan WAITFOR TIME

Contoh berikut menjalankan prosedur sp_update_job tersimpan dalam database pada msdb pukul 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. Gunakan WAITFOR DELAY

Contoh berikut menjalankan prosedur tersimpan setelah penundaan dua jam.

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

C. Menggunakan WAITFOR DELAY dengan variabel lokal

Contoh berikut menunjukkan bagaimana variabel lokal dapat digunakan dengan WAITFOR DELAY opsi . Prosedur tersimpan ini menunggu periode waktu variabel lalu mengembalikan informasi kepada pengguna sebagai jumlah jam, menit, dan detik yang berlalu.

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

Berikut set hasilnya.

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