SQL Server Management Studio 转换不存在的字符串时出错

SQL Server Management Studio error converting a string that does not exist

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

Error converting varchar value "!=")" to the 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

有什么想法吗?

对于无效的输入数据,您可以使用 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

TRY_CAST()(或类似的函数绝对是正确的方法。我想指出您可以简化查询:

SELECT DISTINCT TRY_CAST(data AS float)  
 FROM [dbo].[log] 
 WHERE [Time] >= '2021-08-04' AND
       TRY_CAST(data AS float) > 50;

时间比较不需要时间组件。您不需要使用 LIKE,因为 TRY_CAST() 会为您完成。