【问题标题】:Conversion failed when converting the varchar value to data type int. [SQLSTATE 22018] (Error 245)将 varchar 值转换为数据类型 int 时转换失败。 [SQLSTATE 22018](错误 245)
【发布时间】:2018-11-08 11:29:51
【问题描述】:

我的 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

【问题讨论】:

  • 这一行不是问题。在任何时候都不会涉及VARCHARINT 之间的任何转换,除非00000000 已转换,但该转换将始终成功。进一步看。此错误的常见罪魁祸首是无意中将VARCHAR 列与INT 值而不是字符串进行比较,这会将列值隐式转换为INT,而不是将INT 转换为VARCHAR
  • 谢谢.. 如果 SP 成功,我如何调试 SP 以找到问题所在?有什么想法吗?
  • @JeroenMostert - 这取决于列的数据类型。如果d.DateofBirthINTc.dobVARCHAR() 那么ISNULL(d.DateofBirth, c.dob) 可能是个问题......毕竟c.datedeath 肯定是一个字符串,所以一切皆有可能......跨度>
  • 请确认该表达式引用的所有列的数据类型。
  • @Ayman:取存储过程定义,将参数转换为变量,手动执行。如果行号没有给你足够的线索,分而治之,有选择地消除陈述,直到你找到有问题的陈述。不幸的是,T-SQL 对调试这些东西的帮助是不存在的。

标签: sql tsql stored-procedures


【解决方案1】:

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

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

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

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

例如,在上面的表达式中,如果它产生错误,你可以试试 COALESCE() 部分,看看它是否有效......

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


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

【讨论】:

  • 我按照您的示例进行了操作,但没有成功,然后我尝试了第二部分进行测试,但出现此错误:不允许从数据类型 datetime 到数字的隐式转换。使用 CONVERT 函数运行此查询。
  • 你做的太多了。错误消息似乎是您正在尝试将结果插入到目标中。我建议您只运行 SELECT 语句,将其与存储过程的其余部分分开。如果您继续尝试运行整个 SP 来调试它,您将永远在这里。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-01-07
  • 1970-01-01
  • 1970-01-01
  • 2011-12-01
  • 2012-04-10
  • 1970-01-01
相关资源
最近更新 更多