将varchar值转换为数据类型int时,转换失败。 [SQLSTATE 22018](错误245)

时间:2018-11-08 11:29:51

标签: sql tsql stored-procedures

我有失败的sql作业,它会产生上述错误。该作业运行存储过程,因此我尝试运行该过程,以便我可以查明问题所在。.SP意外地没有失败,但同时没有执行该作业(SP应该将数据插入到另一个未执行的表中)。我已经仔细检查了SP,并且我认为以下一行可能是问题所在

我试图在最后添加类型转换为varchar,但没有用。下一行应计算客户年龄并将其插入“年龄”列数据类型numeric(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

1 个答案:

答案 0 :(得分:-1)

尝试一下,这是一种更干净的方法,并且根据您的数据类型可能会有不同的行为。

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

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

如果那没有帮助,请分而治之。正如@JeroenMostert所说的;依次执行SP的每个部分,直到您严格确定了SP的哪一部分真正产生了错误为止。

例如,在上面的表达式中,如果它生成错误,则可以尝试仅使用COALESCE()部分,然后查看该部分是否有效...

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


最后,出于对万物的热爱,请考虑修改数据结构,以使日期实际上保留为DATE,而不是VARCHAR或INT。