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()
会为您完成。
我有一个 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()
会为您完成。