繁体   English   中英

将varchar转换为数值类型的算术溢出错误

[英]Arithmetic overflow error converting varchar to data type numeric

首先,让我声明我已经阅读了各种类似的文章,还无法确定其他张贴者在此错误消息上遇到的问题与我遇到的情况之间的相似之处。 也许我没有正确搜索,但这是场景。 我正在尝试在表中搜索转换为数字值时小于70的值。 有时,该值可以用逗号存储(例如3,080等),因此我有一个replace语句来删除逗号。 下面查询中的obsValue列是varchar(2000) ,我猜测可能与它有关。 我最初的查询工作:

Select name, obsValue
From database.dbo.table
Where name in ('LDL') 
and isnumeric(obsvalue) = 1 
and cast(replace(obsvalue,',','') as decimal(18)) < 70

这会带回期望值,但这不是我要搜索的唯一name 其他示例包括('LDL(CALC)') 使用UNION语句将使我可以将查询合并在一起,但是不幸的是,我不控制应用程序代码,这不是一个选择。 我唯一可用的选项是使用IN子句,因此当我搜索各种name值时,最终查询将如下所示:

Select name, obsValue
From database.dbo.table
Where name in ('LDL', 'LDL(CALC)') 
and isnumeric(obsvalue) = 1 
and cast(replace(obsvalue,',','') as decimal(18)) < 70

不幸的是,这样做是我收到错误消息的地方。 抱歉,如果其他地方都没有回答。 请链接,我将在到期的信用额中给予信用。

obsvalue中的某些值可能对您的cast(如十进制)函数而言太大,但您无论如何都不在乎,因为它们不符合in()标准。

尝试在子查询中应用cast(),将查询限制为实际需要转换的obsvalues。

此外,由于逗号仅在值大于999时存在,并且您要测试的值小于70,因此不需要替换。 实际上,您可以排除任何包含逗号的行,因为您知道它太高了。

问题在于,当IN子句中有多个项目时,SQL Server将优化查询的方式有所不同。 您可以使用CASE语句阻止优化

SELECT name, obsvalue
FROM database.dbo.table 
WHERE (CASE WHEN ( isnumeric(obsvalue) = 1 
             AND name in ('LDL', 'LDL(CALC)')) 
       THEN cast(replace(obsvalue,',','') as decimal(18))
       ELSE null END) < 70

您可以将IsNumeric(obsvalue)替换为(在isnumeric(obsvalue)= 1时选择obsvalue)。

Select name, obsValue
From database.dbo.table
Where name in ('LDL', 'LDL(CALC)') 
and isnumeric(obsvalue) = 1 
and cast(replace((select obsvalue where isnumeric(obsvalue) = 1),',','') as decimal(18)) < 70

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM