sql server - vérifier pour voir si le casting est possible
J'ai le code suivant pour lancer nvarchar en entier:
cast(@value as int)
Cependant je n'ai aucun contrôle du paramètre @valeur, d'où le code peut échouer. Est-il de toute façon à vérifier si une fonte est possible avant de faire un casting?
Bien, dans SQL Server 2012, vous pouvez utiliser le nouveau TRY_CAST(), mais avec SQL Server 2008, vous devriez être en mesure d'utiliser ISNUMERIC(), et de l'inclure à la manipulation de valeurs qui ne passe pas ce test.
J'ai récemment répondu à une question à ce sujet et à l'aide de ISNUMERIC à CAST à un INT ne fonctionne pas par lui-même. Raison d'être, ISNUMERIC retourne true pour les non des nombres entiers (1.5) par exemple.
Envisager d'ajouter un supplémentaire de vérifier à l'aide de CHARINDEX avec ISNUMERIC, ou ce que je préfère, utiliser une Expression Régulière pour valider les données.
Et voici une Violon montrant le problème avec l'aide de ISNUMERIC sur son propre. Et le Violon à l'aide d'une expression régulière à la place qui fonctionne.
DECLARE@Test nvarchar(10)SET@Test ='1.5'--WorksSELECTCASEWHEN@Test NOTLIKE'%[^0-9]%'THEN CAST(@Test as int)ELSE0END-- Produces ErrorSELECTCASEWHEN ISNUMERIC(@Test)=1THEN CAST(@Test as int)ELSE0END
Bonne chance.
+1 . . . Le premier est à droite. Votre réponse devrait être un peu plus clair que le deuxième est faux (j'ai à faire défiler pour voir le "Produit d'Erreur"). Vous devriez également en garde contre les débordements (et éventuellement permis de nombres entiers négatifs): stackoverflow.com/a/24250511/1149773
select(casewhen isnumeric(val)=1and val notlike'%e%'and val notlike'%.%'then cast(val as int)end)
La fonction isnumeric() retourne 1 pour tout ce qui ressemble à un flotteur, de sorte que vous devez être prudent.
Vous pouvez également utiliser ce que je considère être une particularité de SQL Server. Vous pouvez lancer la valeur flottante de 1,23 à un int, mais vous ne pouvez pas convertir la chaîne de valeur. Ainsi, à la suite aussi des oeuvres
select(casewhen isnumeric(val)=1then cast(cast(val as float)as int)end)
Non, c'est faux. isnumeric('+') == 1. isnumeric('-') == 1. isnumeric est horrible de mise en œuvre, et leur réponse vous laisse ouvert à de multiples cas où un cast à int échouera en dépit de votre chèque. Avez-vous remarqué que les OP accepté essentiellement cette réponse. En outre, la conversion de la float de nombreuses corrections de ces problèmes (mais pas avec trop-plein). La accepté de répondre obtient le TRY_CAST partie droite pour SQL 2012+. Pour utiliser ISNUMERIC, vous avez à faire beaucoup de gymnastique pour gérer les cas de bord. Par exemple, plug '+' ou '-' en tant que valeurs de "val". Le casting de float vont bombarder de façon spectaculaire. (^^ pas mon downvote BTW - je préfère les commentaires de rep dommages). Cette réponse donne un moyen de les utiliser ISNUMERIC qui gère en fait des cas limites et garantit que vous aurez un bon TRY_CAST alternative: stackoverflow.com/questions/4522056/...
Utiliser une procédure avec un bloc TRY CATCH pour supprimer les erreurs
c'est à dire
CREATEPROCEDURE p_try_cast
@type nvarchar(MAX),@value nvarchar(MAX)ASBEGINBEGIN TRY
DECLARE@sql varchar(MAX)DECLARE@out_table TABLE(value varchar(MAX))SET@sql ='SELECT CONVERT(varchar(max), CAST('''+@value +''' AS '+@type +'))'INSERT@out_table
EXECUTE(@sql)IFEXISTS(SELECT1FROM@out_table WHERE value =@value)RETURN1RETURN0END TRY
BEGIN CATCH
RETURN0END CATCH
END
GO
Maintenant, vous pouvez appeler qu'avec la chaîne et le type désiré et le proc retourne 1 pour le succès et 0 pour non -
DECLARE@ret int
-- This returns 0 - FailEXEC@ret = p_try_cast 'integer','1.5'-- This returns 1 - SuccessEXEC@ret = p_try_cast 'integer','1.5'-- This returns 0 - FailEXEC@ret = p_try_cast 'char(4)','HELLO'-- This returns 1 - SuccessEXEC@ret = p_try_cast 'char(4)','HELL'
Bien, dans SQL Server 2012, vous pouvez utiliser le nouveau TRY_CAST(), mais avec SQL Server 2008, vous devriez être en mesure d'utiliser ISNUMERIC(), et de l'inclure à la manipulation de valeurs qui ne passe pas ce test.
ISNumeric('a1a') retourne 1, mais vous ne pouvez jamais cast('a1a' en tant que float)
Je crois que vous vouliez dire, SQL Server 2014: msdn.microsoft.com/en-us/library/hh974669.aspx
Il existait dans les deux. Il y a un menu pour changer de version - msdn.microsoft.com/en-us/library/hh974669(v=sql.110).aspx
OriginalL'auteur Matt
J'ai récemment répondu à une question à ce sujet et à l'aide de
ISNUMERIC
àCAST
à unINT
ne fonctionne pas par lui-même. Raison d'être,ISNUMERIC
retourne true pour les non des nombres entiers (1.5) par exemple.Ici a récemment eu une réponse sur le sujet:
https://stackoverflow.com/a/14692165/1073631
Envisager d'ajouter un supplémentaire de vérifier à l'aide de CHARINDEX avec ISNUMERIC, ou ce que je préfère, utiliser une Expression Régulière pour valider les données.
Et voici une Violon montrant le problème avec l'aide de ISNUMERIC sur son propre. Et le Violon à l'aide d'une expression régulière à la place qui fonctionne.
Bonne chance.
Vous devriez également en garde contre les débordements (et éventuellement permis de nombres entiers négatifs): stackoverflow.com/a/24250511/1149773
OriginalL'auteur sgeddes
J'utilise généralement la suivante, ce qui semble couvrir toutes les situations.
Il profite du fait que "ISNUMERIC" ne permet pas de deux périodes. Le "TRY_CAST" dans SQL Server 2012+ est une bien meilleure solution.
OriginalL'auteur Michael Erickson
Peut-être que nous pouvons faire quelque chose comme ceci:
OriginalL'auteur Anoop Verma
Le bon test est:
La fonction
isnumeric()
retourne 1 pour tout ce qui ressemble à un flotteur, de sorte que vous devez être prudent.Vous pouvez également utiliser ce que je considère être une particularité de SQL Server. Vous pouvez lancer la valeur flottante de 1,23 à un int, mais vous ne pouvez pas convertir la chaîne de valeur. Ainsi, à la suite aussi des oeuvres
isnumeric('+') == 1
.isnumeric('-') == 1
.isnumeric
est horrible de mise en œuvre, et leur réponse vous laisse ouvert à de multiples cas où uncast
àint
échouera en dépit de votre chèque.Avez-vous remarqué que les OP accepté essentiellement cette réponse. En outre, la conversion de la
float
de nombreuses corrections de ces problèmes (mais pas avec trop-plein).La accepté de répondre obtient le TRY_CAST partie droite pour SQL 2012+. Pour utiliser ISNUMERIC, vous avez à faire beaucoup de gymnastique pour gérer les cas de bord. Par exemple, plug '+' ou '-' en tant que valeurs de "val". Le casting de
float
vont bombarder de façon spectaculaire. (^^ pas mon downvote BTW - je préfère les commentaires de rep dommages). Cette réponse donne un moyen de les utiliserISNUMERIC
qui gère en fait des cas limites et garantit que vous aurez un bonTRY_CAST
alternative: stackoverflow.com/questions/4522056/...OriginalL'auteur Gordon Linoff
Utiliser une procédure avec un bloc TRY CATCH pour supprimer les erreurs
c'est à dire
Maintenant, vous pouvez appeler qu'avec la chaîne et le type désiré et le proc retourne 1 pour le succès et 0 pour non -
OriginalL'auteur cmdr_putin