首页 > 解决方案 > 将 varchar 值转换为数据类型 int 时转换失败。[SQLSTATE 22018](错误 245)

问题描述

我有失败的 sql 作业,它会产生上述错误。该作业运行存储过程,所以我尝试运行该过程,以便我可以查明问题.. SP 出人意料地没有失败,但同时没有做这项工作(SP 应该将数据插入到另一个没有做的表中)。我已经彻底查看了 SP,我认为下面的行可能是问题??

我试图在最后添加 cast as varchar 但没有用。下面的行应该计算客户年龄并将其插入“年龄”列数据类型数字(18,6)..

列类型:

d.DateofBirth  Date
c.dob DateTime
c.datedeath varchar(50)
c.DateofAttendance DateTime

有人可以帮忙吗,拜托???

CAST(DATEDIFF(DAY, ISNULL(d.DateofBirth, c.dob),ISNULL(CAST(CASE WHEN 
c.datedeath = '00000000' THEN NULL ELSE c.DateDeath END AS DATE),                                                                                                                                                                            
ISNULL(c.DateofAttendance,GETDATE()))) / 365.25 AS INT) AS age

标签: sqltsqlstored-procedures

解决方案


试试这个,这是一种更清洁的方法,并且根据您的数据类型可能会有不同的行为。

DATEDIFF(
  YEAR,
  ISNULL(d.DateofBirth, c.dob),
  COALESCE(
    CAST(NULLIF(c.datedeath, '00000000') AS DATE),
    c.DateofAttendance,
    GETDATE()
  )
)

如果这没有帮助,请确认您在此表达式中引用的列的确切数据类型。

如果这没有帮助,分一杯羹征服你的 SP。正如@JeroenMostert 所说;依次执行 SP 的每个部分,直到您严格确定它的哪个部分实际产生了错误。

例如,在上面的表达式中,如果它产生错误,您可以尝试 Just the COALESCE()part,看看它是否有效......

  COALESCE(
    CAST(NULLIF(c.datedeath, '00000000') AS DATE),
    c.DateofAttendance,
    GETDATE()
  )


最后,出于对所有美好事物的热爱,请考虑修改您的数据结构,以便将日期实际保存为 DATE 而不是 VARCHAR 或 INT。


推荐阅读