J'utilise RAISERROR()
pour fournir des fonctionnalités de test unitaire de base (comme ici ), mais je suis frustré par l'impossibilité d'utiliser FLOATs
dans le message d'erreur. Je sais que je peux convertir le flotteur en une chaîne, mais j'utilise RAISERROR
dans chaque test unitaire, je ne veux pas ajouter une autre ligne de code pour chaque test. (Mes tests unitaires sont déjà assez verbeux!) Est - il possible d'effectuer une ligne CAST / convert au sein de la RAISERROR
liste des paramètres? Ou existe-t-il un autre moyen de contourner cette carence?
Mise à jour: Donc, finalement, ce que j'aimerais pouvoir faire, c'est ceci:
RAISERROR('Unit Test FAILED! %f', 11, 0, @floatParm)
Malheureusement, RAISERROR
ne gère pas% f ou ne flotte pas en général. Je dois donc faire ceci à la place:
DECLARE @str VARCHAR(40) = CAST(@floatParm AS VARCHAR(40))
RAISERROR('Unit Test FAILED! %s', 11, 0, @str)
... qui ressemble à un gâchis quand il est dispersé à travers des dizaines de tests unitaires. Je voudrais donc le résumer à quelque chose comme ceci:
RAISERROR('Unit Test FAILED! %s', 11, 0, CAST(@floatParm AS VARCHAR(40))
Mais cela me fait Incorrect syntax near 'CAST'
passer un message. Je ne comprends pas pourquoi c'est illégal, mais ça l'est. Y a-t-il un autre "one liner" que je pourrais utiliser ici à la place?
la source
Réponses:
Malheureusement, pour quelque raison que ce soit, vous ne pouvez pas effectuer de conversion en ligne dans ce contexte et
RAISERROR
ne prend pas directement en chargefloat
, encore une fois, pour quelque raison que ce soit.Pour l'exhaustivité de cette réponse, voici l'extrait pertinent de MSDN , que je suis sûr que vous avez déjà vu (remarque: c'est le même texte dans toutes les versions de la documentation de 2005 à 2012):
La seule solution raisonnable à laquelle je peux penser serait d'écrire une procédure stockée pour encapsuler l'
RAISERROR
appel. Voici un point de départ:Malheureusement, il n'y a pas de moyen facile de mettre à l'échelle cela pour un nombre arbitraire de paramètres ... Cela pourrait probablement être fait en utilisant du SQL dynamique imbriqué alambiqué, ce qui serait amusant à déboguer. Je vais laisser cela comme un exercice pour le lecteur.
J'ai utilisé
sql_variant
l'hypothèse que pour des raisons d'uniformité du code, la même procédure serait utilisée partout, même pour les types de valeurs qui sont directement pris en charge parRAISERROR
. En outre, cela peut être créé en tant que procédure stockée temporaire si cela est approprié.Voici à quoi ressemblerait cette procédure:
Production:
Ainsi, le résultat net est que vous n'obtenez pas de capacité de formatage pour les flottants (lancez le vôtre), mais vous gagnez la possibilité de les sortir (décimal / numérique, aussi!) Tout en conservant la capacité de formatage pour les autres types.
la source
sql_variant
je n'étais pas au courant , donc j'étais coincé sur la liste des arguments et j'ai supposé que ce n'était pas possible. Vous m'avez appris quelque chose de très utile aujourd'hui. Merci beaucoup!