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