将varchar值转换为int数据类型[SQLSTATE 22018]时转换失败(错误245)
我有一个sql作业失败,它产生了上述错误。作业运行存储过程,因此我尝试运行该过程,以便确定问题。。SP未出现故障,但同时未执行作业(SP应将数据插入另一个未执行任务的表)。我已经彻底查看了SP,我认为下面这一行可能就是问题所在 我试图在结尾添加cast as varchar,但没有成功。下一行应计算客户年龄,并将其插入“年龄”列数据类型numeric(18,6) 列类型:将varchar值转换为int数据类型[SQLSTATE 22018]时转换失败(错误245),sql,tsql,stored-procedures,Sql,Tsql,Stored Procedures,我有一个sql作业失败,它产生了上述错误。作业运行存储过程,因此我尝试运行该过程,以便确定问题。。SP未出现故障,但同时未执行作业(SP应将数据插入另一个未执行任务的表)。我已经彻底查看了SP,我认为下面这一行可能就是问题所在 我试图在结尾添加cast as varchar,但没有成功。下一行应计算客户年龄,并将其插入“年龄”列数据类型numeric(18,6) 列类型: d.DateofBirth Date c.dob DateTime c.datedeath varchar(50) c.D
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
试试看,这是一种更干净的方法,根据您的数据类型,可能会有不同的行为
DATEDIFF(
YEAR,
ISNULL(d.DateofBirth, c.dob),
COALESCE(
CAST(NULLIF(c.datedeath, '00000000') AS DATE),
c.DateofAttendance,
GETDATE()
)
)
如果没有帮助,请确认此表达式中引用的列的确切数据类型
如果这不起作用,那么像@Jeroenmoster所说的那样,划分一个并征服你的SP;按顺序执行SP的每个部分,直到您严格地确定它的哪个部分实际生成错误为止
例如,在上面的表达式中,如果它正在生成错误,您可以尝试使用COALESCE()
部分,然后查看它是否有效
COALESCE(
CAST(NULLIF(c.datedeath, '00000000') AS DATE),
c.DateofAttendance,
GETDATE()
)
最后,对于所有事物的爱,考虑修改你的数据结构,以便日期实际上被保存为日期,而不是VARCHAR或INT. 这条线不是问题。在任何时候都不涉及
VARCHAR
和INT
之间的任何转换,除非00000000
被转换,但该转换始终会成功。再看看。此错误的常见原因是无意中将VARCHAR
列与INT
值(而不是字符串)进行比较,这会隐式地将列值转换为INT
,而不是将INT
转换为VARCHAR
。谢谢。。如果SP成功,我如何调试SP以找到有问题的线路??有什么想法吗?@jeroenmoster-这取决于列的数据类型。如果d.DateofBirth
是一个INT
并且c.dob
是一个VARCHAR()
那么ISNULL(d.DateofBirth,c.dob)
可能是一个问题。。。。毕竟,c.datedeath
肯定是一个字符串,所以一切皆有可能……请确认此表达式引用的所有列的数据类型。@Ayman:获取存储过程定义,将参数转换为变量,手动执行它。如果行号没有给你足够的线索,你可以通过选择性地删除语句来分而治之,直到你找到了有问题的语句。不幸的是,T-SQL在调试这些东西方面的帮助是不存在的。我遵循了您的示例,但它不起作用,然后我尝试了第二部分进行测试,但我得到了以下错误:不允许从数据类型datetime隐式转换为数字。使用CONVERT函数运行此查询。您尝试执行的操作太多。错误消息似乎是您正在尝试将结果插入到目标。我建议您只运行SELECT语句,与存储过程的其余部分分开运行。如果您继续尝试运行整个SP来调试此功能,您将永远在这里。