2013-07-30 246 views
1

最近我正在玩SQL Server數據類型,並將大量數據放入表中,並嘗試用Varchar和Numeric數據計算性能。但是,我得到了一些錯誤,這是我不認爲不應該,但它是。我的問題是如下:具有Int和Decimal轉換功能的Sql Server SUM函數

我有一個表:

create table sa(f1 varchar(100)) 

我有一個存儲過程,而插入100000個數據到表:

create proc sad 
as 
begin 
    declare @i int=0 
    while @i<100000 
    begin 
     insert into sa values(@i) 
     set @[email protected]+1 
    end 
end 


exec sad 

而且我已經測試了以下內容:

select CONVERT(int,f1) from sa //Works Fine, i tested after the Problem 
select sum(convert(int,f1)) from sa //Didn't Worked, So i tested above and Below 
select sum(convert(decimal(18,2),f1)) from sa //And, it again works fine 

但是,當我總結轉換F1到INT,它顯示我一個錯誤。
但是,當我只選擇轉換爲Int罰款。
而且,當我總結轉換F1到十進制它工作正常。

什麼是SUM函數的數據類型?
在上面的數據它適用於十進制,但不是詮釋?
爲什麼?

即時得到以下錯誤

算術溢出錯誤將表達式轉換爲數據類型int。

+0

請複製並粘貼您收到的錯誤... –

+0

對不起,我編輯了我的問題,並收到了錯誤 –

+0

我試圖找出性能問題,同時使用Varchar和數字數據類型 –

回答

4

根據MS文檔(參見https://docs.microsoft.com/en-us/sql/t-sql/functions/sum-transact-sql),則SUM()函數返回一個不同類型的值,根據該列的數據類型您正在添加:如果該列的類型爲int,tinyintsmallint,則SUM會返回類型爲int的值。

轉換爲bigintdecimal品牌SUM()返回一個較大的數據類型,這也解釋了爲什麼在這種情況下,你沒有溢出。

+0

好的,那麼總和取決於我們正在求和的列數據類型。謝謝。這讓我清楚。 –

7

您的總和爲INT,其範圍不能保留該總和。

DECIMAL可以。

1到99999之間的所有值的總和爲4999950000,最大INT值爲2147483647,小於總和結束爲的一半。

當你加上INT的時候,你會得到一個新的INT。當你總結DECIMAL的時候,你會得到一個新的DECIMAL,所以輸入類型定義了輸出類型。

您可以改用bigint代替,它應該「沒問題」。

此外,在第二個注意,請不要存儲數字作爲文本

+0

雅,我不應該。但爲什麼?當我將它轉換爲SUM時,SUM函數是否將其數據類型導出爲INT? –

+0

是的。輸入是INT,輸出是INT。 –

+0

如何,總和取決於INT,在這裏轉換成INT工程嘛。而且,轉換成十進制也很好。那麼,爲什麼Summing(int)沒有工作,但它可以轉換,但爲什麼sum作品Decimal? –

2

期待您已超過最大int值SQL Server允許(2,147,483,647) - 見https://docs.microsoft.com/en-us/sql/t-sql/data-types/int-bigint-smallint-and-tinyint-transact-sql

十進制允許高達10^38 - 1的更高限制(即1個38之後的0) - 請參閱https://docs.microsoft.com/en-us/sql/t-sql/data-types/decimal-and-numeric-transact-sql

但是,如果值的類型爲int,我不建議轉換爲decimalDecimal如果數字具有已知精度和比例的小數點後的可能數字(例如貨幣,百分比等),則此值非常有用。)作爲另一的海報曾建議,這裏的最佳的轉換將是一個bigint

select sum(cast(f1 as bigint)) from sa