Sql server 2008 在SQL Server 2008中使用isnumeric将varchar转换为十进制,而不引发异常
我有一个varchar字段,当应用过滤器时,它应该始终包含一个数字(十进制)值。但当我像这样运行sql时,会出现“将数据类型varchar转换为数值时出错”:Sql server 2008 在SQL Server 2008中使用isnumeric将varchar转换为十进制,而不引发异常,sql-server-2008,casting,decimal,varchar,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测试
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
不将数字存储为字符串是我的首选解决方案,但您可以始终检查
D
或E
,然后首先转换为float
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
)不将数字存储为字符串是我的首选解决方案,但您可以始终检查D
或E
,然后首先转换为float
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
)实际上,出于我的目的(查找小于5的值),我可以将它们全部转换为float。在将来的某个时候,我将在“Answer”表中创建一个十进制字段,用于存储十进制答案,然后使用此技术从varchar字段填充它。对于像我这样需要更好地理解浮点数、小数和数字的人,这里有一个链接——实际上,为了我的目的(找到小于5的值),我可以将它们全部转换为浮点数。在将来的某个时候,我将在“Answer”表中创建一个十进制字段,用于存储十进制答案,然后使用此技术从varchar字段填充它。对于像我这样需要更好地理解浮点数、小数和数字的人,这里有一个链接-