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.
OriginalL'auteur Chad Harrison | 2010-05-27
Vous devez vous connecter pour publier un commentaire.
Vérifier si vous pouvez convertir en int première, découvrez le IsInteger fonction ici: IsNumeric, IsInt, IsNumber Il va travailler sur 2000 et jusqu'à
OriginalL'auteur SQLMenace
Et, pour répondre en général: Non, vous ne pouvez pas utiliser try-catch logique dans une fonction. Je peux voir pourquoi - ou, au moins, il est clairement préférable de l'éviter, compte tenu de l'énorme performance peine de venir avec elle.
Cependant, je pense que c'est bizarre que l'on ne peut pas AUGMENTER d'une erreur dans une fonction... c'est quelque chose de construit-dans les fonctions déjà faites. Je suppose que l'on a à s'en retourner NULL.
OriginalL'auteur The Dag
La construction TRY...CATCH ne peut pas être utilisé dans une fonction définie par l'utilisateur dans SQL 2012!
Voir ceci:
http://msdn.microsoft.com/en-us/library/ms175976.aspx
Lorsque j'essaie d'utiliser ce script:
Je suis d'erreur:
OriginalL'auteur akela