使用isnumeric将varchar转换为十进制,而不会在SQL Server 2008中引发异常

时间:2013-01-23 10:17:24

标签: sql-server-2008 casting decimal varchar

我有一个varchar字段,在应用过滤器时应始终包含数字(十进制)值。但是当我像这样运行sql时,我得到“将数据类型varchar转换为数字时出错”:

SELECT CAST(A.text AS numeric(38,16)) 
FROM Answers A
INNER JOIN Questions Q ON Q.ID = A.QuestionID
WHERE Q.Text = 'Rating'
AND isnumeric(A.text) = 1

只有一个值通过了isnumeric测试但未通过强制转换:

DECLARE @text varchar(100)
SET @text = '2.83417869359255E-02'
SELECT CASE WHEN ISNUMERIC(@text) = 1 THEN CAST(@text AS NUMERIC(38,16)) ELSE NULL END

我应该如何确保处理这样的值?在一天结束时,我想计算所有小于5的值,所以像'2.83417869359255E-02'这样的数字可以舍入为零。我还运行了一个查询来检查表中的值以及varchar的长度以及这些结果:

MaxValue             MinValue             LenVarChar
-------------------- -------------------- -----------
0                    0                    1
10                   10                   2
2.2                  9.2                  3
3.55                 6.32                 4
5.453125             5.453125             8
2.79989361763        9.47216796875        13
2.089115858078       9.132080078125       14
1.1529632806778      9.8538990020752      15
0.64174896478653     9.83681106567383     16
0.111961431801319    0.991760730743408    17
2.83417869359255E-02 2.83417869359255E-02 20

1 个答案:

答案 0 :(得分:1)

不将数字存储为字符串将是我的首选解决方案,但您可以随时检查DE然后再转换为浮动。

DECLARE @text VARCHAR(100)

SET @text = '2.83417869359255E-02'

SELECT
    CASE
    WHEN ISNUMERIC(@text) = 1
    THEN      CASE 
              WHEN @text LIKE '%[DE]%' 
              THEN CAST(CAST(@text AS FLOAT) AS NUMERIC(38, 16))
              ELSE @text
              END 
    END 

仍然存在可能存在问题的输入,例如$(通过ISNUMERIC测试,但需要转换为money