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?

Est l'aide de SQLCLR une option ? Si oui, écrire votre propre fonction SQLCLR serait de travailler.
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