MS SQL服务器强制转换无异常

And*_*ewG 32 t-sql sql-server exception-handling

MS SQL服务器中是否有任何"转换"功能允许安全地转换类型(不抛出异常).我需要在C#lang中使用类似"tryParse"的东西,但需要SQL语句.

更详细的,我需要以下语句返回零或任何其他但抛出异常.

select convert(float,'fjsdhf')

提前致谢.

ric*_*ent 34

这将默认非数字为0,不需要另一个语句:

 SELECT CASE 
    WHEN ISNUMERIC(myvarcharcolumn)=1 THEN 
       CONVERT(float, REPLACE(LTRIM(RTRIM(myvarcharcolumn)), ',', '.')) 
    ELSE 0 END AS myfloatcolumn
Run Code Online (Sandbox Code Playgroud)

REPLACE()函数调用用于将逗号更改为句点.逗号在某些文化中用作小数分隔符(例如,"1,25"而不是"1.25"),但除非您的服务器设置为其中一个作为默认文化,否则ISNUMERIC()将返回1但CONVERT( )会抛出错误.这确实意味着您的字符串不应使用逗号作为千位分隔符,但在大多数情况下,小数占位符的逗号更可能是小数占位符.

LTRIM(RTRIM())调用是因为ISNUMERIC()将为带有前导或尾随空格的字符串返回1,但CONVERT()无法处理它们.所以,你必须修剪你的弦.

唯一剩下的潜在问题是,如果数字可以表示为int,currency,decimal或float,则ISNUMERIC()将返回1,但您只是转换为浮点数.实际上,一个float可以存储你抛出的任何东西,但如果你试图转换为int,ISNUMERIC()将返回1表示类似"2.5"的值,但CONVERT(int,'2.5')将仍然抛出错误.

  • 在SQL Server 2008 R2中,`IsNumeric`返回0或1而不是布尔值.所以你需要`WHEN ISNUMERIC(myvarcharcolumn)= 1` (10认同)

Dev*_*ner 12

在SQL SERVER 2012中,有一些新功能可以解决这个问题

try_cast try_convert try_parse

  • 对于那些懒惰去谷歌的人,这里是这个答案的链接:https://learn.microsoft.com/en-us/sql/t-sql/functions/try-cast-transact-sql?view=sql- server-ver15 :) 如果失败,它会返回 NULL,您可以使用 ISNULL、COALESCE 等轻松处理它 (2认同)

Ed *_*ess 8

您可以使用TSQL函数ISNUMERIC()测试值是否为数值

http://msdn.microsoft.com/en-us/library/ms186272.aspx

而且,如果你还没有意识到它,TSQL现在有一个TRY CATCH结构.

http://msdn.microsoft.com/en-us/library/ms179296.aspx