有人能解释为什么整数乘法的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和tinyint (Transact-SQL)
警诫 当使用+、-、*、/或%算术运算符执行int、bigint、tinyint或bigint常量值到浮点数、实值、十进制或数字数据类型的隐式或显式转换时,Server在计算数据类型和表达式结果的精度时应用的规则因查询是否自动命名而有所不同。 因此,查询中类似的表达式有时会产生不同的结果。当查询未自动命名时,常量值首先转换为数值,其精度仅足以容纳常量的值,然后再转换为指定的数据类型。例如,常量值1被转换为数值(1,0),常量值250被转换为数值(3,0)。 当查询被自动命名时,常量值总是在转换为最终数据类型之前被转换为数字(10,0)。当涉及/运算符时,不仅结果类型的精度在类似的查询中不同,而且结果值也可能不同。例如,包含表达式SELECT (1.0 /7作为浮点数)的自动数组化查询的结果值将与未自动命名的同一查询的结果值不同,因为自动标记查询的结果将被截断以适应数字(10,0)数据类型。
发布于 2016-07-05 07:48:02
因为1024是整数。Server采用第一个数据类型来生成算术函数。
从左到右计算一个术语。
如果您编写1099511627776,则它是一个数值。
将第一个值转换为bigint (或数值),然后它工作:
select cast(1 as bigint)*1024*1024*1024*1024发布于 2016-07-05 07:50:19
在这种情况下,SQL将默认使用INT类型来完成操作。这解释了如果结果值溢出INT的最大容量(2,147,483,647),您将得到错误。
解决方法可以是将您在操作中使用的数字存储在BIGINT变量中,如下所示:
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)发布于 2016-07-05 07:46:32
刚刚找到一个查询,该查询在更多googling后不会抛出错误;如果我将其中一个值转换为十进制/数值,即1024.0
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') -- numerichttps://stackoverflow.com/questions/38197823
复制相似问题