Gestion des erreurs en T-SQL Fonction Scalaire

Cette question pourrait facilement prendre plusieurs chemins d'accès, donc je vais frapper le plus spécifique de la voie d'abord. Tout en travaillant avec SQL Server 2005, je suis en train de créer une fonction scalaire qui agit comme un "TryCast" de type varchar int. Lorsque je rencontre un problème, c'est quand j'ajoute un bloc TRY dans la fonction;

CREATE FUNCTION u_TryCastInt
(
   @Value as VARCHAR(MAX)
)
RETURNS Int
AS
BEGIN
   DECLARE @Output AS Int

   BEGIN TRY
      SET @Output = CONVERT(Int, @Value)
   END TRY
   BEGIN CATCH
      SET @Output = 0
   END CATCH

   RETURN @Output
END

S'avère theres toutes sortes de choses de mal avec cette déclaration, y compris les "non Valide utilisation de côte-d'effectuer ou dépendant du temps de l'opérateur dans 'COMMENCER' à l'intérieur d'une fonction" et "utilisation Invalide de côte-d'effectuer ou dépendant du temps de l'opérateur dans "la FIN d'essai' à l'intérieur d'une fonction". Je n'arrive pas à trouver des exemples de l'utilisation de try à l'intérieur d'une fonction scalaire, ce qui m'a fait penser, est la gestion des erreurs dans une fonction est-elle possible?

L'objectif ici est de faire une version robuste de les Convertir ou de Fonte des fonctions pour permettre une instruction SELECT pour mener à depsite des erreurs de conversion. Par exemple, prendre la suivante;

    CREATE TABLE tblTest
    (
        f1 VARCHAR(50)
    )
    GO

    INSERT INTO tblTest(f1) VALUES('1')
    INSERT INTO tblTest(f1) VALUES('2')
    INSERT INTO tblTest(f1) VALUES('3')
    INSERT INTO tblTest(f1) VALUES('f')
    INSERT INTO tblTest(f1) VALUES('5')
    INSERT INTO tblTest(f1) VALUES('1.1')

    SELECT CONVERT(int,f1) AS f1_num FROM tblTest

    DROP TABLE tblTest

Il n'atteint jamais le point de tomber de la table parce que l'exécution est accrochée à essayer de convertir de 'f' à un nombre entier. Je veux être en mesure de faire quelque chose comme cela;

SELECT u_TryCastInt(f1) AS f1_num FROM tblTest

fi_num
__________
1
2
3
0
5
0

Des idées sur ce point? Est-il rien de ce qui existe qui gère cela? Aussi, je voudrais essayer d'élargir la conversation est à la charge de SQL Server 2000 depuis les blocs Try ne sont pas une option dans ce scénario.

Pour votre cas d'utilisation particulier, cela pourrait aider. tek-tips.com/faqs.cfm?fid=6423

OriginalL'auteur Chad Harrison | 2010-05-27