Korzystam RAISERROR()
z niektórych podstawowych funkcji testowania jednostek (jak tutaj ), ale denerwuje mnie brak możliwości użycia FLOATs
w komunikacie o błędzie. Wiem, że mogę rzutować zmiennoprzecinkowe na ciąg, ale używam RAISERROR
w każdym teście jednostkowym, nie chcę dodawać kolejnej linii kodu dla każdego testu. (Moje testy jednostkowe są już wystarczająco pracochłonne!) Czy istnieje sposób wykonania wbudowanego rzutowania / konwersji na RAISERROR
liście parametrów? Czy jest jakiś sposób na obejście tego niedoboru?
Aktualizacja: Tak więc ostatecznie chciałbym to zrobić:
RAISERROR('Unit Test FAILED! %f', 11, 0, @floatParm)
Niestety, RAISERROR
nie obsługuje% f lub ogólnie jest zmiennoprzecinkowy. Zamiast tego muszę to zrobić:
DECLARE @str VARCHAR(40) = CAST(@floatParm AS VARCHAR(40))
RAISERROR('Unit Test FAILED! %s', 11, 0, @str)
... który po prostu wygląda na bałagan, gdy jest rozproszony przez dziesiątki testów jednostkowych. Chciałbym sprowadzić to do czegoś takiego:
RAISERROR('Unit Test FAILED! %s', 11, 0, CAST(@floatParm AS VARCHAR(40))
Ale to daje mi Incorrect syntax near 'CAST'
wiadomość. Nie rozumiem, dlaczego to nielegalne, ale tak jest. Czy może być tutaj inny „jeden liniowiec”?
źródło
Odpowiedzi:
Niestety, z jakiegokolwiek powodu, nie można wykonać bezpośredniej konwersji w tym kontekście i ponownie
RAISERROR
nie obsługuje bezpośredniofloat
, z jakiegokolwiek powodu.Aby uzyskać kompletność tej odpowiedzi, oto odpowiedni fragment z MSDN , który na pewno już widziałeś (uwaga: to ten sam tekst we wszystkich wersjach dokumentacji od 2005 do 2012 roku):
Jedynym rozsądnym rozwiązaniem, jakie mogę wymyślić, byłoby napisanie procedury składowanej, aby zakończyć
RAISERROR
połączenie. Oto punkt wyjścia:Niestety, nie ma łatwego sposobu na skalowanie tego dla dowolnej liczby parametrów ... Prawdopodobnie można to zrobić za pomocą zawiniętego zagnieżdżonego dynamicznego SQL, co byłoby przyjemne w debugowaniu. Zostawię to jako ćwiczenie dla czytelnika.
Kiedyś
sql_variant
na założeniu, że ze względu na kod jednorodności, ta sama procedura będzie używane wszędzie, nawet dla typów wartości, które są obsługiwane bezpośrednioRAISERROR
. Można to również utworzyć jako tymczasową procedurę składowaną, jeśli jest to właściwe.Oto jak wyglądałaby ta procedura:
Wynik:
Tak więc wynik netto jest taki, że nie masz możliwości formatowania dla liczb zmiennoprzecinkowych (rzuć własne), ale zyskujesz zdolność do ich wyprowadzania (również dziesiętne / numeryczne!), Zachowując jednocześnie zdolność formatowania dla innych typów.
źródło
sql_variant
, więc utknąłem na liście argumentów i założyłem, że to niemożliwe. Nauczyłeś mnie dziś czegoś bardzo przydatnego. Dziękuję Ci bardzo!