9

Je souhaite écrire une fonction non CLR définie par l'utilisateur dans SQL Server 2005. Cette fonction prend une chaîne d'entrée et renvoie une chaîne de sortie. Si la chaîne d'entrée n'est pas valide, je veux indiquer une erreur à l'appelant.Traitement des erreurs dans les fonctions définies par l'utilisateur

Ma première pensée a été d'utiliser RAISERROR pour déclencher une exception. Toutefois, SQL Server n'autorise pas cela dans un fichier UDF (bien que vous puissiez générer des exceptions dans les fichiers UDF basés sur CLR, allez figure). Mon dernier recours consisterait à renvoyer une valeur NULL (ou une autre valeur d'indicateur d'erreur) de la fonction si la valeur d'entrée est erronée. Cependant, je n'aime pas cette option, comme:

  1. ne fournit aucune information utile à l'appelant
  2. ne me permet pas de revenir un NULL en réponse à l'entrée valide (car il est utilisé comme un code d'erreur).

Existe-t-il un moyen convivial d'arrêter une fonction sur une erreur dans SQL Server?

Répondre

7

Il semble que SQL Server UDF sont un peu limités de cette façon (et bien d'autres).

Vous ne pouvez vraiment pas faire grand chose à ce sujet - c'est (pour l'instant) juste comme ça. Soit vous pouvez définir votre UDF de sorte que vous pouvez signaler une condition d'erreur à l'aide de sa valeur de retour (par exemple retourner NULL en cas d'erreur), ou alors vous devrez presque recourir à l'écriture d'une procédure stockée, qui peut avoir beaucoup plus de gestion des erreurs et permet RAISERROR et ainsi de suite. Donc, soit concevoir votre UDF pour ne pas exiger de signalisation spécifique des conditions d'erreur, ou alors vous devez réorganiser votre approche pour utiliser les procédures stockées (qui peuvent avoir plusieurs paramètres OUTPUT et peuvent donc retourner le code d'erreur avec vos données charge utile, si vous en avez besoin), ou du code CLR géré pour vos UDF.

Désolé je n'ai pas une meilleure idée - pour l'instant, j'ai peur, ce sont vos options - faites votre choix.

Marc

+0

Je m'y attendais autant, mais je pensais que je demanderais. Merci. –

+1

Le problème avec les sprocs est que vous ne pouvez pas les appeler en ligne avec les fonctions. –

+0

Je suis d'accord avec @MikeK. La raison pour laquelle j'utilise le fichier UDF et non une procédure stockée complète est pour l'utilisation en ligne. La réponse à cette question a-t-elle changé dans les versions plus récentes de SQL Server? (par exemple 2016) – ColinMac

1

Il y a une solution donnée dans une réponse à une question en double here, basée sur cette idée:

return cast('Error message here.' as int); 

qui jette quelque chose comme ceci:

Msg 245, Level 16, State 1, Line 1 
Conversion failed when converting the varchar value 'Error message here.' to data type int. 

Il fonctionne OK pour les fonctions définies par l'utilisateur scalaire, mais pas pour les fonctions de table.

+0

Je suppose qu'il serait possible de retourner le texte d'erreur dans le formulaire de la table attendue, oui? – ColinMac

Questions connexes