将nvarchar转换为int时转换失败

时间:2010-11-10 14:32:52

标签: sql-server tsql

我有一个varchar字段,包含数字和日期作为字符串。我想更新此字段中大于720的所有数字。我首先尝试进行选择但是我收到此错误:

Conversion failed when converting the nvarchar value '16:00' to data type int.

这是我的疑问:

select id, case(isnumeric([other08])) when 1 then [other08] else 0 end
from CER where sourcecode like 'ANE%' --and other08 > 720

当我取消注释最后一部分时失败。

我试图让所有数字大于720,但我无法做到这一点。它在铸造和转换时也会失败。

感谢大家的帮助

2 个答案:

答案 0 :(得分:7)

您还需要在WHERE子句中执行检查和转换:

SELECT 
       id, 
       CASE WHEN isnumeric([other08]) = 1 THEN CAST([other08] AS INT) ELSE 0 END
FROM   CER 
WHERE  sourcecode LIKE 'ANE%' 
AND CASE WHEN isnumeric([other08]) = 1 THEN CAST([other08] AS INT) ELSE 0 END > 720

答案 1 :(得分:2)

您需要在where子句中使用IsNumeric,以避免尝试将字符串与数字720进行比较。例如:

select id, case(isnumeric([other08])) when 1 then [other08] else 0 end
from CER 
where sourcecode like 'ANE%' and ISNUMERIC(other08) = 1 and other08 > 720

修改

正如@Abs所指出的,上述方法不起作用。我们可以使用CTE来计算要过滤的可靠字段,但是:

WITH Data AS (
  select id
    , case WHEN isnumeric([other08]) THEN CAST([other08] AS int) else 0 end AS FilteredOther08
    , CER.* 
  from CER 
  where sourcecode like 'ANE%'
)
SELECT *
FROM Data
WHERE [FilteredOther08] > 720