Apakah ada cara untuk menulis perintah T-SQL untuk membuatnya hanya tidur untuk jangka waktu tertentu? Saya menulis layanan web secara tidak sinkron dan saya ingin dapat menjalankan beberapa tes untuk melihat apakah pola asinkron benar-benar membuatnya lebih skalabel. Untuk "mengejek" layanan eksternal yang lambat, saya ingin dapat memanggil server SQL dengan skrip yang berjalan lambat, tetapi sebenarnya tidak memproses banyak hal.
364
Jawaban:
Lihatlah perintah WAITFOR .
Misalnya
Perintah ini memungkinkan Anda memiliki tingkat presisi yang tinggi tetapi hanya akurat dalam 10ms - 16ms pada mesin biasa karena bergantung pada GetTickCount . Jadi, misalnya, panggilan
WAITFOR DELAY '00:00:00:001'
itu kemungkinan akan menghasilkan tidak menunggu sama sekali.sumber
CREATE FUNCTION [dbo].[ForcedTimeout](@seconds int) returns int as BEGIN DECLARE @endTime datetime2(0) = DATEADD(SECOND, @seconds, GETDATE()); WHILE (GETDATE() < @endTime ) BEGIN SET @endTime = @endTime; -- do nothing, but SQL requires a statement. END
Saya percaya waktu maksimum yang bisa ditunggu ini adalah 23 jam, 59 menit dan 59 detik.
Berikut adalah fungsi yang dihargai Scalar untuk menunjukkan penggunaannya; fungsi di bawah ini akan mengambil parameter integer detik, yang kemudian diterjemahkan menjadi HH: MM: SS dan mengeksekusinya menggunakan
EXEC sp_executesql @sqlcode
perintah untuk kueri. Fungsi di bawah ini hanya untuk demonstrasi, saya tahu itu tidak cocok untuk tujuan benar-benar sebagai fungsi yang dihargai skalar! :-)JIKA Anda ingin menunda lebih lama dari 24 jam, saya sarankan Anda menggunakan parameter @Days untuk beberapa hari dan membungkus fungsi yang dapat dieksekusi di dalam sebuah loop ... mis.
sumber
Only functions and some extended stored procedures can be executed from within a function.
MS Docs ini memberikan contoh menggunakan Stored Procs - sepertinya pendekatan ini tidak validAnda juga dapat "MENUNGGU" a "WAKTU":
sumber
PRINT
bukanRAISERROR
?Ini adalah bagian yang sangat sederhana dari kode C # untuk menguji CommandTimeout. Ini menciptakan perintah baru yang akan menunggu selama 2 detik. Atur CommandTimeout ke 1 detik dan Anda akan melihat pengecualian saat menjalankannya. Mengatur CommandTimeout ke 0 atau sesuatu yang lebih tinggi dari 2 akan berjalan dengan baik. Omong-omong, CommandTimeout default adalah 30 detik.
sumber