使用 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 函数时偶尔会出现转换错误的主要内容,如果未能解决你的问题,请参考以下文章