我想告诉SQL-Server一个数字是给定类型的。这是一个小例子:
drop table if exists test
declare @i int = 100000
SELECT 4 pwr, cast(10000 * @i as bigint) val into test
insert test SELECT 5, cast(100000 * @i as bigint)
insert test SELECT 6, cast(1000000 * @i as bigint)
insert test SELECT 7, cast(10000000 * @i as bigint)
insert test SELECT 8, cast(100000000 * @i as bigint)
insert test SELECT 9, cast(1000000000 * @i as bigint)
insert test SELECT 10, cast(10000000000 * @i as bigint)
select * from test
在表中只有pwr 4和10的行.SQL-Server似乎为数字文字提供了一个数据类型,具体取决于值。高值将转换为数字,较小的值转换为int。
转换为类型是一种处理此问题的方法。
insert test SELECT 6, cast(cast(1000000 as bigint) * @i as bigint) test
有没有办法告诉SQL-Server一个常量的数据类型,而不是每次使用它时抛出它?
此处不清楚在线帮助(https://docs.microsoft.com/en-us/sql/t-sql/data-types/constants-transact-sql) 正如它所说'十进制常量由一串数字表示,这些数字未用引号括起来并包含小数点。'。它应该说'..或由不适合int范围的数值表示。'
答案 0 :(得分:2)
不,如果您不计算隐式转换(即DECLARE @x TINYINT = 3
),则不会。某些类型确实有单独的文字编写方式(数字,浮点,二进制等),但不是各种整数类型的情况。区分它们的唯一方法是显式转换常量(否则默认为INT
或NUMERIC
类型)。
你是对的,文件在这方面缺乏。没有小数点,类型取决于它是否适合INT
:
SELECT SQL_VARIANT_PROPERTY(CONVERT(SQL_VARIANT, 0), 'BaseType')
-- int
SELECT SQL_VARIANT_PROPERTY(CONVERT(SQL_VARIANT, 2147483648), 'BaseType')
-- numeric
除了转换之外,无法将BIGINT
排除在外。
答案 1 :(得分:0)
你投的太晚了 它就像
一样简单declare @i bigint = 100000;
这种演员阵容在乘法之后发生。
最后的作品是因为10000000000是bigint。
首先是因为乘法结果仍然是int。
即使使用declare @i int = 100000;
,也可以。
insert #test SELECT 5, cast(100000 as bigint) * @i;
这与小数没有关系。
10000是整数,因此它进行整数数学运算,结果为整数
100000是整数所以它做整数数学问题是结果不是整数
10000000000是bigint所以它做bigint数学
Jeroen 10000000000的每次校正是十进制的。十进制数学有效,然后结果成功转换为bigint。