使用 SUM 函数时偶尔会出现转换错误

Posted

技术标签:

【中文标题】使用 SUM 函数时偶尔会出现转换错误【英文标题】:Occasional conversion error using SUM function 【发布时间】:2009-08-10 14:44:57 【问题描述】:

我的应用程序使用 sql2000,它使用的 select 语句有时会失败。一周左右一次,选择返回错误

'将数据类型 varchar 转换为数值时出错'

SQL:

sum(case when ISNULL(form_prsn_id, -1) = irpd_prsn_id 
                          then convert(dec(11,2), case when valu_value = '' 
                                                       then '0' 
                                                       else isnull
(valu_value,'0') 
                                                        end)* case when  
fmdt_deduction_flag = 'Y' 
                                                                   then -1 
                                                                   else 1 
                                                                    end 
                          else 0 
                           end) as client_sum

value_value 字段是一个 varchar 并存储一些数字和一些 varchar。但包括我的加入和 where 子句过滤器

它将始终选择数字或空字符串。 当它失败时,我可以删除 SUM,查看数据并知道它的数字。 那么为什么 SUM 函数有时(比如 5% 的时间)会在数字数据上失败。 我想知道 SQL 是否以某种方式“向前看”以确保它可以转换为十进制,而不仅仅是返回没有总和的行。 请注意,我发现了一个修复方法,其中包含 ( where isNumeric(valu_value) = 1 )

谢谢

【问题讨论】:

【参考方案1】:

这样的事情会发生(有时)。问题(几乎)总是在 SQL Server 为您的查询生成的执行计划中。 SQL Server 可能会在您加入/条件运算符之前进行转换。这就是你得到错误的原因。

使用提示或引入额外条件(如您所做的那样)强制执行特定的 [执行] 计划是解决此类问题的关键。

【讨论】:

【参考方案2】:

试试这个:

sum(case
        when ISNULL(form_prsn_id, -1) = irpd_prsn_id then convert(dec(11,2), case
                                                                                 when ISNUMERIC(valu_value)=1 THEN valu_value
                                                                                 else 0
                                                                             end
                                                                 )* case
                                                                        when fmdt_deduction_flag = 'Y' then -1 
                                                                        else 1 
                                                                    end 
        else 0 
    end
   ) as client_sum

区别就在这里:

case
    when valu_value = ''  then '0'
    else isnull(valu_value,'0')
end

case
    when ISNUMERIC(valu_value)=1 THEN valu_value
    else 0
end

【讨论】:

【参考方案3】:

只是一个快速的想法,因为您没有说明如何确保 valu_value 是数字但它可以包含逗号吗? 例如

select isnumeric('23,00')

通过!

select convert(dec(11,2),'23,00')

FAIL - 将数据类型 varchar 转换为数字时出错。

【讨论】:

【参考方案4】:

我以前也遇到过,所以根本原因可能是SQL Server 2005在执行join之前处理转换或基于执行计划的where语句。

我的情况是:

SELECT Convert(decimal(18,0), NVarcharColumn) FROM Table1

我通过将语句更改为来解决它:

SELECT Convert(decimal(18,0), NVarcharColumn) FROM Table1
WHERE isnumeric(NvarcharColumn) = 1

【讨论】:

以上是关于使用 SUM 函数时偶尔会出现转换错误的主要内容,如果未能解决你的问题,请参考以下文章

在 laravel 5.7 中偶尔会出现 419 错误

wps 求和怎么会出现value?

nginx+php运行几天后偶尔会出现404错误

偶尔会出现“处理调整请求的时间过多”错误

您如何重现偶尔出现的错误?

spi flash偶尔出现写入错误的情况