2013-08-02 3 views
0

je suit les lignes de code dans ma fonction définie par l'utilisateur:Utilisez Essayez Catch Block dans UDFs dans SQL Server

declare @annualStr varchar(30) 
declare @annual float 
    begin try 
      set @annualStr = dbo.GetXMLValues(@businessId,@id) 
      set @annual = convert(float,isnull(@annualStr,'0')) 
    end try 
    begin catch 
      set @annual = 0 
    end catch 

La valeur provient de dbo.GetXMLValues peut être une valeur varchar donc je dois utiliser bloc catch try pour convertir la valeur en float ..

Mais il jette une erreur disant .. il est incorrect d'utiliser des blocs catch try UDF

Pourquoi ?? Et ce qu'il faut faire pour convertir varchar valeur à float quand il est inconnu

+1

Le Pourquoi? N'est pas vraiment répondable sauf comme "parce qu'ils ne sont pas pris en charge par le produit" –

+1

duplication possible de [Essayez \ _Convertir pour SQL Server 2008 R2] (http://stackoverflow.com/questions/17941035/try-convert-for -sql-server-2008-r2) –

Répondre

2

Mise à jour en fonction des commentaires.

SET @annualstr = dbo.GetXMLValues(@businessId,@id); 

IF @annualstr NOT LIKE '%[^0-9.]%' AND @annualstr NOT LIKE '%.%.%' 
    BEGIN 
    SET @annual = Cast(@annualstr As float); 
    END; 

SET @annual = Coalesce(@annual, 0); 
+1

Le problème avec ISNUMERIC est que ** SELECT ISNUMERIC ('$') ** renvoie aussi 1 –

+0

Mise à jour de ma réponse pour avoir une comparaison plus robuste. Autoriser uniquement les valeurs numériques avec un maximum d'une période. – gvee

+0

Ce n'est pas tout à fait exact non plus ... "-1.-1" va valider. – gvee

1

Soit dit en passant, si vous utilisez SQL 2012+ Ensuite, vous pouvez utiliser la nouvelle fonction Try_Cast()

SET @annualStr = dbo.GetXMLValues(@businessId,@id); 
SET @annual = Coalesce(Try_Cast(@annualStr As float), 0);