sql server - 检查是否可以进行强制转换

Bru*_*uce 23 sql t-sql sql-server sql-server-2008

我有以下代码将nvarchar转换为整数:

     cast(@value as int)
Run Code Online (Sandbox Code Playgroud)

但是我无法控制参数@value,因此代码可能会失败.无论如何,在进行演员表演之前是否可以检查演员表是否可行?

Mat*_*att 27

好吧,在SQL Server 2012中,您可以使用新的TRY_CAST(),但是对于SQL Server 2008,您应该能够使用ISNUMERIC(),然后包含对未通过该测试的值的处理.

  • -1:选择isnumeric('1.'); select cast('1.'作为int); (7认同)
  • ISNumeric('a1a') 返回 1,但是您永远不能将 ('a1a' as float) (2认同)

sge*_*des 11

我最近回答了一个关于这个问题的问题,并且使用ISNUMERICto CASTto a INTwill本身不起作用.原因是,例如,ISNUMERIC对于非整数(1.5),返回true.

这是最近关于这个主题的答案:

/sf/answers/1028451581/

考虑使用CHARINDEX和ISNUMERIC添加额外的检查,或者我更喜欢,使用正则表达式来验证数据.

这里有一个小提琴演示了自己使用ISNUMERIC的问题.并且小提琴使用正则表达式而不是有效.

DECLARE @Test nvarchar(10)
SET @Test = '1.5'
--Works
SELECT CASE WHEN @Test NOT LIKE '%[^0-9]%' THEN CAST(@Test as int) ELSE 0 END 
-- Produces Error
SELECT CASE WHEN ISNUMERIC(@Test) = 1 THEN CAST(@Test as int) ELSE 0 END 
Run Code Online (Sandbox Code Playgroud)

祝好运.


Mic*_*son 7

我一般使用以下内容,似乎涵盖了所有情况.

SELECT CASE WHEN 1 = ISNUMERIC(@value + '.0') THEN CAST(@value as int) ELSE 0 END
Run Code Online (Sandbox Code Playgroud)

它利用了"ISNUMERIC"不允许两个时期的事实.SQL Server 2012+中的"TRY_CAST"是一个更好的解决方案.