数据类型为tinyint的算术溢出错误,值= -1

Ran*_*mar 6 sql t-sql sql-server

在运行此查询时,我收到错误,任何想法为什么?

select ISNULL(NULLIF(0,0), -1)
Run Code Online (Sandbox Code Playgroud)

错误:

Msg 220,Level 16,State 2,Line 1

数据类型为tinyint的算术溢出错误,值= -1.

编辑 - 另一个例子:

select ISNULL(NULLIF(0.0,0.0), 1.0)
Run Code Online (Sandbox Code Playgroud)

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

rob*_*rtw 5

这项工作:

select ISNULL(NULLIF(cast(0 as int),0), -1)
Run Code Online (Sandbox Code Playgroud)

SQL优化器将"隐藏"强制转换为最小的数据类型.

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

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

所以NULLIF返回tinyint,ISNULL尝试将tinyint替换为-1然后你有溢出

当您将第一个参数(0)强制转换为int(或smallint)时,NULLIF将返回适合-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'
Run Code Online (Sandbox Code Playgroud)