Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将varchar值转换为int数据类型[SQLSTATE 22018]时转换失败(错误245)_Sql_Tsql_Stored Procedures - Fatal编程技术网

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

将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

我有一个sql作业失败,它产生了上述错误。作业运行存储过程,因此我尝试运行该过程,以便确定问题。。SP未出现故障,但同时未执行作业(SP应将数据插入另一个未执行任务的表)。我已经彻底查看了SP,我认为下面这一行可能就是问题所在

我试图在结尾添加cast as 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

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

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来调试此功能,您将永远在这里。