首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >选择1024*1024*1024*1024失败

选择1024*1024*1024*1024失败
EN

Stack Overflow用户
提问于 2016-07-05 07:40:18
回答 3查看 309关注 0票数 0

有人能解释为什么整数乘法的SELECT失败吗?

代码语言:javascript
复制
SELECT 1024*1024*1024*1024 -- ERROR

是因为乘法结果比INT数据类型阈值大吗?

代码语言:javascript
复制
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)数据类型。

EN

回答 3

Stack Overflow用户

发布于 2016-07-05 07:48:02

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

从左到右计算一个术语。

如果您编写1099511627776,则它是一个数值。

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

代码语言:javascript
复制
select cast(1 as bigint)*1024*1024*1024*1024
票数 4
EN

Stack Overflow用户

发布于 2016-07-05 07:50:19

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

解决方法可以是将您在操作中使用的数字存储在BIGINT变量中,如下所示:

代码语言:javascript
复制
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)
票数 1
EN

Stack Overflow用户

发布于 2016-07-05 07:46:32

刚刚找到一个查询,该查询在更多googling后不会抛出错误;如果我将其中一个值转换为十进制/数值,即1024.0

请参阅使用BIGINT的TSQL算术溢出

代码语言:javascript
复制
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
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38197823

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档