簡體   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