bu Sorgu deneyin ancak mevcut cevapların hiçbiri hitap görünüyor "neden?" sorunuza bakış açısı.
İlk olarak, sözcük ifadeleriniz için veri türü nedir? Ben emin değildi (ve o kadar bakmadı) bu yüzden aşağıdaki koştum: hata verir
select 1.4 union all
select 'frob'
:
Msg 8114, Level 16, State 5, Line 1
Error converting data type varchar to numeric.
Tamam, 1.4
ve diğer değişmezleri numeric
vardır - decimal
.
bir decimal(p,s)
geçtiyseniz SUM
fonksiyonun dönüş tipi, ne Ardından:
decimal(38, s)
Tamam, sorgunuzdaki 3 SUM
ifadelerin veri türleridir decimal(38,1)
, decimal(38,4)
ve decimal(38,2)
.decimal(38,1)
arasından seçim yapabileceğiniz 3 veri türü göz önüne alındığında, differing precisions and scales kurallarına dayalı olarak son seçilen türdür.
The result precision and scale have an absolute maximum of 38. When a result precision is greater than 38, the corresponding scale is reduced to prevent the integral part of a result from being truncated.
Yani, nihayet, geri
decimal
üzerine belgelerine:
By default, SQL Server uses rounding when converting a number to a decimal or numeric value with a lower precision and scale. However, if the SET ARITHABORT option is ON, SQL Server raises an error when overflow occurs. Loss of only precision and scale is not sufficient to raise an error.
Demek nihai sonuç bu. genellikle, sum
birden çok satır karşı olacağını fark kadar ilk bu tip anda
, şaşırtıcı görünebilir ve kendi veri türünü taşmaya verilen bir duyarlık ve ölçek birden çok değer için kolayca mümkündür. , için herhangi bir hassasiyeti kaybetmeden taşmaları karşılamak için mümkün olan en geniş alanı verir ve son veri türünün sorgulamadan önce kararlaştırılabileceği anlamına gelir.