Try-Catch en Fonction Définie par l'Utilisateur?
Je suis en train d'écrire une fonction pour convertir une chaîne de caractères qui est soit un guid ou d'un projet de code associé à ce guid dans le guid:
CREATE FUNCTION fn_user_GetProjectID
(
@Project nvarchar(50)
)
RETURNS uniqueidentifier
AS
BEGIN
declare @ProjectID uniqueidentifier
BEGIN TRY
set @ProjectID = cast(@Project as uniqueidentifier)
END TRY
BEGIN CATCH
set @ProjectID = null
END CATCH
if(@ProjectID is null)
BEGIN
select @ProjectID = ProjectID from Project where projectcode = @Project
END
return @ProjectID
END
Cela fonctionne bien si le code ci-dessus est incorporé dans mes Procédures Stockées, mais je voudrais faire une fonction en dehors de ça alors que je suis à SEC.
Lorsque j'essaie de créer la Fonction, j'obtiens une erreur comme ceci:
Msg 443, Level 16, State 14, Procedure fn_user_GetProjectID, Line 16
Invalid use of side-effecting or time-dependent operator in 'BEGIN TRY' within a function.
Quelqu'un a une idée de comment je peux contourner cette erreur?
Edit: je sais que je ne peux pas utiliser Try-Catch dans une Fonction, je suppose que des questions simples, est-il un moyen de faire un casting qui va juste retourner la valeur NULL si la conversion échoue, au lieu d'une erreur?
SQLCLR est certainement pas une option. Serait tellement plus facile, oui. J'ai fini par utiliser une combinaison de ma solution et 8 ko.
OriginalL'auteur Moose | 2010-07-08
Vous devez vous connecter pour publier un commentaire.
De MSDN:
Vous pouvez utiliser le pattern matching pour vérifier la chaîne. Notez que cela ne fonctionne pas pour un codage spécifique qui réduit la taille de l'GUID:
Bon...je ne pensais pas à l'extérieur de SQL Server.
Modifié le code pour gérer les accolades et des tirets manquants...
Vous n'êtes pas obligé de mettre les tirets avant de faire le casting soit, mais vous avez une nouvelle approche avec le motif.. c'est beaucoup plus propre que ma boucle. Je vais vous donner celui-ci.
OriginalL'auteur 8kb
Apparemment, vous ne pouvez pas utiliser TRY-CATCH dans un fichier UDF.
Selon cette de rapport de bug page pour SQL Server:
Mais ils étaient en train de donner de l'espoir pour l'avenir en 2006:
OriginalL'auteur DOK
Est pas sûr, mais pourquoi ne pas retourner... au premier coup d'œil je simplifierait les choses comme ceci:
Si ce n'est pas de fournir suffisamment d'erreur de manipulation, je suis sûr qu'il ya une meilleure façon de pré-vérifier que les acteurs peuvent travailler sans l'aide de try/catch...
Comme je l'ai dit, je suis sûr qu'il ya une meilleure façon de valider que le casting sera fonction. Il doit être entièrement numérique, droit? Aussi, est la requête vraiment lent?...
ouais, j'ai plusieurs endroits où je suis en train de faire cela, on est avec plusieurs millions de lignes. le projet sera probablement seulement une couple de cent.
OriginalL'auteur Fosco
Ma force brute de la méthode était de créer mon propre ToGuid() fonction qui vérifie qu'il peut être converti à un GUID premiers, sinon, elle renvoie la valeur null. Il peut ne pas être très rapide, mais il fait le travail, et c'est probablement plus rapide pour convertir le guid si c'en est un que d'essayer de le chercher dans la table. EDIT: je voulais donner du crédit à ce blog, où j'ai obtenu mon code de cette fonction: http://jesschadwick.blogspot.com/2007/11/safe-handling-of-uniqueidentifier-in.html
Je suis toujours très intéressé si il y a une meilleure réponse que celle-là.
OriginalL'auteur Moose
Vérifier si @de Projet est un nombre à l'aide de la fonction ISNUMERIC.
votre code devrait ressembler à cela:
OriginalL'auteur Fernando Meneses Gomes