WAITFOR (T-SQL)
Berlaku untuk: SQL ServerAzure SQL Database Azure 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.
Sintaks
WAITFOR
{
DELAY 'time_to_pass'
| TIME 'time_to_execute'
| [ ( receive_statement ) | ( get_conversation_group_statement ) ]
[ , TIMEOUT timeout ]
}
Argumen
MENUNDA
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 set hasilnya.
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)