2014-06-11 34 views
5

Bu sorguyu çalıştırırken hata alıyorum, Herhangi bir Fikri neden?Veri türü minik değeri için aritmetik taşma hatası, value = -1

select ISNULL(NULLIF(0,0), -1) 

Hata: veri türü tinyint için

Msg 220, Kademe 16, durum 2'de, satır 1

aritmetik taşma hatası değeri = -1.

DÜZENLEME - başka bir örnek

select ISNULL(NULLIF(0.0,0.0), 1.0) 

Msg 8115, Düzey 16, durum 8, veri tipi sayısal için sayısal dönüştürücü Hat 1 Aritmetik taşma hatası.

cevap

4

Bu çalışma:

select ISNULL(NULLIF(cast(0 as int),0), -1) 

SQL optimalizer en küçük veri türüne dökme "gizli" yok. NULLIF (http://technet.microsoft.com/pl-pl/library/ms177562%28v=sql.110%29.aspx) belgelerinde kaynaktan

:

birinci ifade ile aynı tip döndürür.

Yani NULLIF -1 için tinyint yerine tinyint ve denemek ISNULL döner ve o zaman var taşma size "yeni" veri türünü döndürür NULLIF (0) int (veya küçük tamsayı) ilk parametreyi döküm

ki

gerçek türü kullanılan bulmak için, sağ için -1:

SELECT NULLIF(0,0) test_col INTO #test_table 

SELECT data_type, numeric_precision, numeric_scale 
FROM tempdb.INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_NAME LIKE '#test_table%' AND COLUMN_NAME = 'test_col' 
İlgili konular