获取将varchar转换为float的错误.
有一个表(不是我的制作)与列result,具有varchar数据.我想转换为float来获取所有值> 180.0.
SELECT result FROM table WHERE result > 180.0
Run Code Online (Sandbox Code Playgroud)
产生错误.有趣的是,尽管如此:
WITH temp AS (
CASE
WHEN ISNUMERIC(result)=1 THEN CAST(result as FLOAT)
ELSE CAST(-1.0 AS FLOAT)
END AS result
)
Run Code Online (Sandbox Code Playgroud)
这很好.当我配对时:
SELECT temp.result FROM temp WHERE temp.result > 180.0
Run Code Online (Sandbox Code Playgroud)
我再次收到错误.思考?
更新:完整代码请求...
WITH temp AS (
SELECT
CASE
WHEN ISNUMERIC(result)=1 THEN CAST(result as FLOAT)
ELSE CAST(-1.0 AS FLOAT)
END AS result
FROM table)
SELECT temp.result FROM temp WHERE temp.result > 180.0
Run Code Online (Sandbox Code Playgroud)
使用SQL-SERVER 2008 RC2.
这意味着表中至少有一行无法转换为float.这样做CASE是安全的,但是在编写T-SQL时,结合CTE和添加WHERE子句属于程序员的常见谬误:声明顺序意味着执行顺序.程序员习惯于C语言的命令式程序风格,并且无法理解SQL的基于声明集的本质.我之前写过关于这个问题的文章,并在谬误导致错误时举例说明:
一旦发布完整的代码,我们就可以看到你在哪种情况下确实在你的情况下犯了谬误并假定了一定的执行顺序.
更新后
好的,所以我必须管理你的情况下代码在执行顺序是正确的,result无法预测列,无需先评估CASE.如果CASE在WHERE子句中,那么事情会有所不同.
你的问题不同:ISNUMERIC.这个函数非常慷慨地理解了什么NUMERIC意思,并且之前已经咬过许多开发人员.即,它接受CAST和CONVERT拒绝的值.就像包含逗号的那些:
declare @n varchar(8000) = '1,000';
select isnumeric(@n);
select cast(@n as float);
select case when isnumeric(@n)=1 then cast(@n as float) else null end;
Run Code Online (Sandbox Code Playgroud)
所以你有值通过ISNUMERIC测试但无法转换.只是一个抬头,你越是深入研究这种方法,你会发现越多的门.只是没有安全的方法来进行服务器端所需的转换.理想情况下,修复数据模型(如果存储浮点数,则使该字段为浮点数).简短的说,分流的数据,并删除不正确的浮点所有值,并解决前端/应用程序不再引进新的,然后添加一个约束,如果新的坏值出现将触发错误.您将无法在查询中解决此问题,因为这条道路上充斥着各种物体.
使用下一版本的SQL Server,您将拥有一个新功能,TRY_CONVERT可以解决您的问题.
| 归档时间: |
|
| 查看次数: |
34335 次 |
| 最近记录: |