Asp.net 如何解决group by中的“将数据类型varchar转换为数字时出错”?
如何解决将数据类型varchar转换为数值时出现的错误。我已经尝试过了Asp.net 如何解决group by中的“将数据类型varchar转换为数字时出错”?,asp.net,sql,sql-server-2008,Asp.net,Sql,Sql Server 2008,如何解决将数据类型varchar转换为数值时出现的错误。我已经尝试过了 SET ANSI_WARNINGS off; 但只有警告信息消失了,但错误仍然存在。 我的代码是 SELECT tblLogin.FullName, SUM(CAST(tblDetails.Productivity_Hours AS decimal(9,2))) AS [hours] FROM tblTaskDetails INNER JOIN tbltsheet ON tblTaskShe
SET ANSI_WARNINGS off;
但只有警告信息消失了,但错误仍然存在。
我的代码是
SELECT tblLogin.FullName,
SUM(CAST(tblDetails.Productivity_Hours AS decimal(9,2))) AS [hours]
FROM tblTaskDetails
INNER JOIN tbltsheet ON tblTaskSheet.TaskId=tblDetails.TaskId
INNER JOIN tblLogin ON tblLogin.UserId=tblTaskSheet.UserId
INNER JOIN tblTCategory ON tblDetails.CatId=tblTCategory.CatId
WHERE dbo.tbltsheet.TaskDate>= '12/28/2013'
AND tbltsheet.TaskDate<='12/31/2013'
AND tblTCategory.CatName LIKE 'abc'
GROUP BY tblLogin.FullName
ORDER BY [hours] DESC
尝试查找无法转换为数字的值:
select Productivity_Hours from tblDetails where ISNUMERIC(Productivity_Hours)=0
此外,您还可以使用CASE语句来避免这些错误值,并将它们接受为0值:
SELECT tblLogin.FullName,
SUM(CASE WHEN ISNUMERIC(tblDetails.Productivity_Hours)=1
THEN CAST(tblDetails.Productivity_Hours AS decimal(9,2))
ELSE 0
END
) AS [hours]
FROM ....
尝试查找无法转换为数字的值:
select Productivity_Hours from tblDetails where ISNUMERIC(Productivity_Hours)=0
此外,您还可以使用CASE语句来避免这些错误值,并将它们接受为0值:
SELECT tblLogin.FullName,
SUM(CASE WHEN ISNUMERIC(tblDetails.Productivity_Hours)=1
THEN CAST(tblDetails.Productivity_Hours AS decimal(9,2))
ELSE 0
END
) AS [hours]
FROM ....
使用IsNumeric验证您的类型
WHERE dbo.tbltsheet.TaskDate>= '12/28/2013'
AND tbltsheet.TaskDate<='12/31/2013'
AND tblTCategory.CatName LIKE 'abc'
AND ISNUMERIC(tblDetails.Productivity_Hours) =1
使用IsNumeric验证您的类型
WHERE dbo.tbltsheet.TaskDate>= '12/28/2013'
AND tbltsheet.TaskDate<='12/31/2013'
AND tblTCategory.CatName LIKE 'abc'
AND ISNUMERIC(tblDetails.Productivity_Hours) =1
为什么不找到问题的根源,以正确的格式存储数字数据,而不是每次使用时都要验证和转换数据?Aaron Bertrand写了一篇很好的文章,阐述了为什么不找到问题的根源,以正确的格式存储数值数据,而不是每次使用时都要验证和转换数据?Aaron Bertrand就此写了一篇很好的文章,值得注意的是,ISNUMERIC将为9999返回1,因为逗号字符仍然可以是数字,但它们不会转换为十进制。在转换之前,您可以尝试替换以删除有问题的值,而不是咀嚼该值。@user3056839您可以检查它是否为十进制。您可以使用ISNUMERICtblDetails.Productivity\u Hours+'e0'。值得注意的是,ISNUMERIC将为9999返回1,因为逗号字符仍然可以是数字,但不会转换为十进制。在转换之前,您可以尝试替换以删除有问题的值,而不是咀嚼该值。@user3056839您可以检查它是否为十进制。您可以使用ISNUMERICtblDetails.Productivity\u Hours+'e0'。