选择1024 * 1024 * 1024 * 1024失败

时间:2016-07-05 07:40:18

标签: sql-server

有人可以解释为什么SELECT整数乘法会失败吗?

SELECT 1024*1024*1024*1024 -- ERROR

是否由于乘法结果大于INT数据类型阈值?

DECLARE @VAL AS BIGINT
SET @VAL = 1024 -- OK
SET @VAL = 1024*1024 -- OK
SET @VAL = 1024*1024*1024 -- OK
SET @VAL = 1024*1024*1024*1024 -- ERROR
SET @VAL = 1099511627776 -- OK - 1024*1024*1024*1024=1099511627776
SET @VAL = CAST((1024*1024*1024*1024) AS BIGINT) -- ERROR

错误消息

  

将表达式转换为数据类型int的算术溢出错误。

int, bigint, smallint, and tinyint (Transact-SQL)

  

注意

     

当您使用+, - ,*,/或%算术运算符执行int,smallint,tinyint或bigint常量值到float,real,decimal或numeric数据类型的隐式或显式转换时,规则SQL Server在计算数据类型时应用,表达式结果的精度因查询是否自动参数化而有所不同。

     

因此,查询中的类似表达式有时会产生不同的结果。当查询不是自动参数化时,常量值首先转换为数字,其精度只要大到足以保存常量的值,然后再转换为指定的数据类型。例如,常量值1转换为数字(1,0),常量值250转换为数字(3,0)。

     

当查询自动参数化时,常量值总是在转换为最终数据类型之前转换为数字(10,0)。当涉及/运算符时,不仅结果类型的精度在类似查询中不同,但结果值也可能不同。例如,包含表达式SELECT CAST(1.0 / 7 AS float)的自动参数化查询的结果值将不同于未自动参数化的同一查询的结果值,因为自动参​​数化查询的结果将被截断以适合到数字(10,0)数据类型。

3 个答案:

答案 0 :(得分:4)

因为1024是一个int。 SQL-Server采用第一种数据类型来生成算术函数。

从左到右评估一个术语。

如果您编写1099511627776,则为数字值。

将第一个值转换为bigint(或数字),然后它可以工作:

select cast(1 as bigint)*1024*1024*1024*1024

答案 1 :(得分:1)

在这种情况下,SQL默认使用INT类型来完成操作。这解释了如果结果值溢出INT的最大容量(2,147,483,647),您将收到错误的原因。

解决方法可能是将您在操作中使用的数字存储在BIGINT varialbe中:

DECLARE @NUMBER AS BIGINT = 1024
DECLARE @VAL AS BIGINT
SET @VAL = @NUMBER
SET @VAL = @NUMBER*@NUMBER
SET @VAL = @NUMBER*@NUMBER*@NUMBER
SET @VAL = @NUMBER*@NUMBER*@NUMBER*@NUMBER
SET @VAL = 1099511627776
SET @VAL = CAST((@NUMBER*@NUMBER*@NUMBER*@NUMBER) AS BIGINT)

答案 2 :(得分:-1)

刚发现一个查询,在google搜索后不会抛出错误;如果我将其中一个值转换为十进制/数字,即1024.0

请参阅TSQL Arithmetic overflow using BIGINT

SELECT 1024*1024*1024*1024.0 -- OK
DECLARE @VAL AS BIGINT
SET @VAL = 1024 -- OK
SET @VAL = 1024*1024 -- OK
SET @VAL = 1024*1024*1024 -- OK
SET @VAL = 1024*1024*1024*1024.0 -- OK
SET @VAL = 1099511627776 -- OK

select SQL_VARIANT_PROPERTY(CONVERT(sql_variant,1024.0),'BaseType')  -- numeric
select SQL_VARIANT_PROPERTY(CONVERT(sql_variant,1024*1024*1024*1024.0),'BaseType')   -- numeric