Tsql 将varchar(max)强制转换为十进制时,将数据类型varchar转换为数字时出错

Tsql 将varchar(max)强制转换为十进制时,将数据类型varchar转换为数字时出错,tsql,stored-procedures,sql-server-2008-r2,varchar,Tsql,Stored Procedures,Sql Server 2008 R2,Varchar,我试图对两个字符串的值求和。为了做到这一点,我将字符串转换为小数,将它们相加,然后将其转换回字符串以进行输出。还可以使用max来避免重复条目。 我的SP中有以下行: Cast(Max(当QuestionID=261时为Cast(答案为十进制)或ELSE“”结束)+Max(当QuestionID=260时为Cast(答案为十进制)或ELSE“”结束时为varchar)作为总计 应答字段为varchar(max),默认值为“”。 问题是我收到了错误消息:将数据类型varchar转换为数字时出错 CA

我试图对两个字符串的值求和。为了做到这一点,我将字符串转换为小数,将它们相加,然后将其转换回字符串以进行输出。还可以使用max来避免重复条目。 我的SP中有以下行:

Cast(Max(当QuestionID=261时为Cast(答案为十进制)或ELSE“”结束)+Max(当QuestionID=260时为Cast(答案为十进制)或ELSE“”结束时为varchar)作为总计

应答字段为varchar(max),默认值为“”。

问题是我收到了错误消息:将数据类型varchar转换为数字时出错

CASE WHEN QuestionID = 261
     THEN CAST(Answer AS decimal)
     ELSE '' END
CASE
表达式(如上文)只能返回一种数据类型。在这种情况下,它不能同时返回十进制和varchar(空字符串“”)。由于任何一个分支的结果都转换为十进制。如果任何行具有
问题ID!=261
,它将尝试将
'
转换为十进制,然后bam-您的错误

你需要这个:

Cast( Max(CASE WHEN QuestionID IN (261,260) AND ISNUMERIC(ANSWER) = 1
               THEN CAST(Answer AS decimal)
               ELSE 0 END)
   AS varchar) as Total

这有点可读性

Cast(最大值(当QuestionID=261时为Cast(当答案为“”时为CASE),然后0 Else Cast(答案为十进制(9,2))结束为十进制(9,2))结束+

Max(当QuestionID=260时为CASE,然后将其转换为Total(当Answer=''时为CASE,然后将0 Else转换为decimal(9,2))结束为decimal(9,2))结束为varchar(Max))

仍在获取错误消息。我找到了一种方法,这不是最优雅的方法,但它完成了这项工作:`Cast(Max(当问题ID=261时CASE)然后Cast(当答案为“”,然后0 Else Cast(答案为十进制(9,2))结束为十进制(9,2))End)+Max(当问题ID=260时CASE然后Cast(当答案为“”,然后0 Else Cast(答案为十进制(9,2))结束为十进制)(9,2))结束)作为varchar(最大值)as Total`您的查询现在看起来像什么?您是否已将
'
'替换为0?当我尝试运行它时,我收到另一条错误消息:警告:通过聚合或其他集合操作消除空值。是的,这是可行的,但它显示的结果没有小数点空格,我也需要它们。即使如此,比我的小得多:),谢谢,您只需要使用适当的值,例如十进制(12,4),将答案正确地转换为十进制(m,n)。