首页 > 解决方案 > SQL Server Management Studio 错误转换不存在的字符串

问题描述

我有一个表,其中有一varchar列具有任何类型的值。我只想过滤数值,而不是将它们与其他数字进行比较。但我总是得到:

将 varchar 值 "!=")" 转换为 int-datatyp 时出错

但是 !=") 甚至不存在于那里

起初我以为它可能在那里,即使数字检查已经失败,也只是检查每个要求。所以我把它放在一个子查询中。但错误仍然发生。

这是我的查询:

SELECT CAST(data AS float) 
FROM
    (SELECT DISTINCT Data 
     FROM [dbo].[log] 
     WHERE [Time]>='2021-08-04 00:00:00.000' 
       AND ISNUMERIC(data) = 1 
       AND Data NOT LIKE '%[^(0-9\-\.)]%'
    ) AS t
WHERE 
    data > 50

有任何想法吗?

标签: sqlsql-servertsqltype-conversionnumeric

解决方案


您可以使用TRY_CAST来获取NULL无效的输入数据 - 而不是异常。ISNUMERIC众所周知,在判断列值是否真的是数字方面很糟糕 - 或者不是......

SELECT 
    NumericData
FROM
    (SELECT DISTINCT 
         Data,
         NumericData = TRY_CAST(data AS float) 
     FROM 
         [dbo].[log] 
     WHERE 
         [Time]>='2021-08-04 00:00:00.000' 
         AND Data NOT LIKE '%[^(0-9\-\.)]%') AS t
WHERE 
    t.NumericData > 50

您可以使用以下方法找到有问题的数据:

SELECT 
    data,
    NumericData = TRY_CAST(data AS float) 
FROM
    (SELECT DISTINCT Data 
     FROM [dbo].[log] 
     WHERE [Time]>='2021-08-04 00:00:00.000' 
       AND Data NOT LIKE '%[^(0-9\-\.)]%') AS t
WHERE 
    TRY_CAST(data AS float) IS NULL

推荐阅读