Beim Ausführen einer Modulo-Funktion innerhalb einer case-Anweisung wird oft ein Wert außerhalb des erwarteten Bereichs zurückgegeben.SQL Server-Modulo-Funktion scheint Werte außerhalb des erwarteten Bereichs zurückzugeben
SELECT CASE WHEN ABS(CheckSUM(NewId())) % 5 IN (0,1,2,3,4) then NULL
ELSE 'What Happened?' END
Wenn Sie dieses Skript ein paar Mal ausführen, werden Sie sehen, es gibt Zeiten, dass das Ergebnis außerhalb des Bereichs von 0,1,2,3,4 zu sein scheint. Ich denke, dass dies irgendwie nicht ganzzahlige Werte während der case-Anweisung zurückgibt, was dazu führt, dass Modulo eine unwirksame Methode zum Sortieren nach Groß- und Kleinschreibung ist.
Kann jemand erklären, was in diesen Fällen passiert, damit ich das in Zukunft bekämpfen kann?
HINWEIS: Wenn ich die Code-Modulo-Funktion selbst (außerhalb der case-Anweisung) ausführen und die Ergebnisse zurückgeben, liegen alle Werte erwartungsgemäß im Bereich von 0,1,2,3,4.
Wie oft sind viele? Ich frage nur, ob das 1/5 mal oder 1/5000 mal duplizierbar ist? –
@lrb Ich habe gerade auf meiner SQL Server 2012-Instanz alle 3-7 Mal getestet. Manchmal nach dem anderen, scheint zufällig. –
Dieser tut es immer richtig: 'SELECT ABS (CheckSUM (NewId())), CASE wenn ABS (CheckSUM (NewId()))% 5> = 0 und ABS (CheckSUM (NewId()))% 5 <5 THEN NULL ELSE 'Was ist passiert?'ENDE' –