Ich verwende RAISERROR()
einige grundlegende Unit-Testing-Funktionen (wie hier ), bin jedoch frustriert über die Unfähigkeit, sie FLOATs
in der Fehlermeldung zu verwenden. Ich weiß, dass ich den Float in einen String RAISERROR
umwandeln kann, aber ich verwende ihn in jedem einzelnen Komponententest. Ich möchte nicht für jeden Test eine weitere Codezeile hinzufügen. (Meine Unit-Tests sind bereits wortreich genug!) Gibt es eine Möglichkeit, eine Inline- Umwandlung / Konvertierung innerhalb der RAISERROR
Parameterliste durchzuführen ? Oder gibt es einen anderen Weg, um diesen Mangel zu umgehen?
Update: Letztendlich wünschte ich mir also, ich könnte Folgendes tun:
RAISERROR('Unit Test FAILED! %f', 11, 0, @floatParm)
Behandelt RAISERROR
% f leider nicht oder schwebt im Allgemeinen. Also muss ich das stattdessen machen:
DECLARE @str VARCHAR(40) = CAST(@floatParm AS VARCHAR(40))
RAISERROR('Unit Test FAILED! %s', 11, 0, @str)
... was nur wie ein Durcheinander aussieht, wenn es über Dutzende von Unit-Tests verstreut ist. Also möchte ich es auf so etwas reduzieren:
RAISERROR('Unit Test FAILED! %s', 11, 0, CAST(@floatParm AS VARCHAR(40))
Aber das bringt mir eine Incorrect syntax near 'CAST'
Nachricht. Ich verstehe nicht, warum das illegal ist, aber es ist. Gibt es einen anderen "One Liner", den ich stattdessen hier verwenden könnte?
quelle
Antworten:
Leider können Sie aus irgendeinem Grund in diesem Kontext keine Inline-Konvertierung durchführen und
RAISERROR
unterstützenfloat
sie aus irgendeinem Grund nicht direkt .Der Vollständigkeit halber ist hier der relevante Ausschnitt aus MSDN , den Sie sicher bereits gesehen haben (Hinweis: Es ist der gleiche Text in allen Versionen der Dokumentation von 2005 bis 2012):
Die einzig vernünftige Lösung, die ich mir vorstellen kann, wäre, eine gespeicherte Prozedur zu schreiben, um den
RAISERROR
Aufruf zu beenden . Hier ist ein Ausgangspunkt:Leider gibt es keine einfache Möglichkeit, dies für eine beliebige Anzahl von Parametern zu skalieren ... Dies könnte wahrscheinlich mit verschlungenem verschachteltem dynamischem SQL geschehen, dessen Debuggen Spaß machen würde. Ich werde das als Übung für den Leser belassen.
Ich habe
sql_variant
auf der Annahme , dass für die Code - Uniformität Gründe das gleiche Verfahren überall dort eingesetzt werden würde, auch für Werttypen , die sich direkt unterstütztRAISERROR
. Dies kann auch als temporär gespeicherte Prozedur erstellt werden, wenn dies angemessen ist.So würde die Verwendung dieses Verfahrens aussehen:
Ausgabe:
Das Nettoergebnis ist also, dass Sie keine Formatierungsfähigkeit für Floats erhalten (rollen Sie Ihre eigenen), aber Sie erhalten die Möglichkeit, diese auszugeben (auch dezimal / numerisch!), Während Sie die Formatierungsfähigkeit für die anderen Typen beibehalten.
quelle
sql_variant
mir aber nicht bewusst , also blieb ich bei der Argumentationsliste und nahm an, dass dies nicht möglich war. Sie haben mir heute etwas sehr Nützliches beigebracht. Vielen Dank!