Sql server 将nvarchar转换为int时转换失败

Sql server 将nvarchar转换为int时转换失败,sql-server,tsql,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 sourcec

我有一个字段,它是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,但我做不到。铸造和转化时也会失败


感谢大家的帮助

您需要在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

您还需要在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

这依赖于短路和SQL引擎按照指定的顺序评估WHERE条件。我不确定情况是否如此-也许有人可以澄清。我认为您需要一个
=1
-但这也不起作用,因为where条件仍将测试所有字段(other08)是否大于720并失败。where子句中没有顺序。我试过这个,但它对我不起作用。@Abs,关于=1,你是对的,这就是我重新键入而不是复制,编辑以反映的结果。关于短路问题,您也是正确的,但我认为CTE应该解决这个问题+1是的,这也会很好地解决dsolimano-虽然相对复杂。查询在语法上不正确,但您的逻辑是完美的。这对我很有用@Abs——匆忙输入答案的危险。用正确的语法更新。