Gibt es eine Möglichkeit, einen T-SQL-Befehl zu schreiben, um ihn nur für einen bestimmten Zeitraum in den Ruhezustand zu versetzen? Ich schreibe einen Webdienst asynchron und möchte einige Tests ausführen können, um festzustellen, ob das asynchrone Muster ihn wirklich skalierbarer macht. Um einen langsamen externen Dienst zu "verspotten", möchte ich in der Lage sein, einen SQL Server mit einem Skript aufzurufen, das langsam ausgeführt wird, aber nicht wirklich eine Menge Dinge verarbeitet.
364
Antworten:
Schauen Sie sich den Befehl WAITFOR an .
Z.B
Dieser Befehl ermöglicht Ihnen ein hohes Maß an Präzision, ist jedoch auf einem typischen Computer nur innerhalb von 10 ms - 16 ms genau, da er auf GetTickCount basiert . So führt der Anruf
WAITFOR DELAY '00:00:00:001'
beispielsweise wahrscheinlich zu keiner Wartezeit.quelle
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
Ich glaube, die maximale Wartezeit beträgt 23 Stunden, 59 Minuten und 59 Sekunden.
Hier ist eine skalarwertige Funktion, um ihre Verwendung zu zeigen. Die folgende Funktion benötigt einen ganzzahligen Parameter von Sekunden, der dann in HH: MM: SS übersetzt und mit dem
EXEC sp_executesql @sqlcode
Befehl zum Abfragen ausgeführt wird. Die folgende Funktion dient nur zu Demonstrationszwecken. Ich weiß, dass sie nicht wirklich als skalarwertige Funktion geeignet ist. :-)Wenn Sie länger als 24 Stunden verzögern möchten, empfehlen wir Ihnen, einen @ Day-Parameter zu verwenden, um einige Tage lang die ausführbare Funktion in eine Schleife zu packen ... z.
quelle
Only functions and some extended stored procedures can be executed from within a function.
MS Docs bieten ein Beispiel für die Verwendung von gespeicherten Prozessen - anscheinend ist dieser Ansatz ungültigSie können auch eine "ZEIT" "WARTEN":
quelle
PRINT
statt verwendenRAISERROR
?Hier ist ein sehr einfacher Teil des C # -Codes zum Testen des CommandTimeout. Es wird ein neuer Befehl erstellt, der 2 Sekunden wartet. Wenn Sie CommandTimeout auf 1 Sekunde einstellen, wird beim Ausführen eine Ausnahme angezeigt. Wenn Sie CommandTimeout auf 0 oder höher als 2 setzen, funktioniert dies einwandfrei. Das Standard-CommandTimeout beträgt übrigens 30 Sekunden.
quelle