WAITFOR (T-SQL)

Berlaku untuk:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

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

Sintaksis

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

Catatan

Untuk melihat sintaks Transact-SQL untuk SQL Server 2014 (12.x) dan versi yang lebih lama, lihat Dokumentasi versi sebelumnya.

Argumen

PENUNDAAN
Adalah periode waktu yang ditentukan yang harus diteruskan, hingga maksimum 24 jam, sebelum eksekusi batch, prosedur tersimpan, atau transaksi berlanjut.

'time_to_pass'
Adalah 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].mss].

TIME
Adalah waktu yang ditentukan ketika batch, prosedur tersimpan, atau transaksi berjalan.

'time_to_execute'
Adalah 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].mss] dan dapat secara opsional menyertakan tanggal 1900-01-01.

receive_statement
Adalah pernyataan RECEIVE yang valid.

Penting

WAITFOR dengan receive_statement hanya berlaku untuk pesan Service Broker. Untuk informasi selengkapnya, lihat RECEIVE (Transact-SQL).

get_conversation_group_statement
Adalah pernyataan GET CONVERSATION GROUP yang valid.

Penting

WAITFOR dengan get_conversation_group_statement hanya berlaku untuk pesan Service Broker. Untuk informasi selengkapnya, lihat GET CONVERSATION GROUP (Transact-SQL).

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

Penting

Menentukan WAITFOR dengan TIMEOUT hanya berlaku untuk pesan Service Broker. Untuk informasi selengkapnya, lihat RECEIVE (Transact-SQL) dan GET CONVERSATION GROUP (Transact-SQL).

Keterangan

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

Penundaan waktu aktual dapat bervariasi dari waktu yang ditentukan dalam time_to_pass, time_to_execute, atau waktu habis, dan tergantung pada tingkat aktivitas server. Penghitung waktu dimulai ketika utas pernyataan WAITFOR dijadwalkan. 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 akan menunggu selamanya atau sampai TIMEOUT tercapai, jika ditentukan.

Kursor tidak dapat dibuka pada pernyataan WAITFOR.

Tampilan tidak dapat ditentukan pada pernyataan WAITFOR.

Saat kueri melebihi opsi tunggu kueri, argumen pernyataan WAITFOR dapat diselesaikan tanpa menjalankan. Untuk informasi selengkapnya tentang opsi konfigurasi, lihat Mengonfigurasi opsi Konfigurasi Server tunggu kueri. Untuk melihat proses aktif dan menunggu, gunakan sp_who.

Setiap pernyataan WAITFOR memiliki utas yang terkait dengannya. Jika banyak pernyataan WAITFOR ditentukan pada server yang sama, banyak utas dapat diikat menunggu pernyataan ini dijalankan. SQL Server memantau jumlah utas pernyataan WAITFOR, 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 pernyataan WAITFOR. SQL Server mengidentifikasi skenario ini dan mengembalikan hasil kosong yang ditetapkan jika kemungkinan kebuntuan tersebut ada.

Perhatian

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

Contoh

J. Menggunakan WAITFOR TIME

Contoh berikut menjalankan prosedur sp_update_job tersimpan dalam database msdb pada 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. Menggunakan 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 adalah hasil yang ditetapkan.

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

Lihat Juga

Bahasa Kontrol Aliran (Transact-SQL)
datetime (Transact-SQL)
sp_who (T-SQL)