2014-06-11 41 views
5

运行此查询时,出现错误,任何想法为什么?数据类型为tinyint,value = -1的算术溢出错误

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

错误:

用于数据类型TINYINT

消息220,级别16,状态2,行1

算术溢出错误,值= -1。

编辑 - 另一个例子:

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

消息8115,级别16,状态8,行1 算术溢出错误转换数字数据类型数值。

回答

4

这项工作:

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

SQL optimalizer做 “隐藏” 转换为最小的数据类型。

从NULLIF(http://technet.microsoft.com/pl-pl/library/ms177562%28v=sql.110%29.aspx)的文档:

返回类型相同的第一个表达式。

所以NULLIF返回TINYINT和ISNULL试图取代TINYINT -1,那么你有溢出

当你施放NULLIF返回你的“新”的数据类型第一个参数(0)为int(或SMALLINT)这是正确的-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' 
相关问题