如何给文字一个类型?

时间:2018-03-20 13:06:02

标签: sql-server tsql

我想告诉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范围的数值表示。'

2 个答案:

答案 0 :(得分:2)

不,如果您不计算隐式转换(即DECLARE @x TINYINT = 3),则不会。某些类型确实有单独的文字编写方式(数字,浮点,二进制等),但不是各种整数类型的情况。区分它们的唯一方法是显式转换常量(否则默认为INTNUMERIC类型)。

你是对的,文件在这方面缺乏。没有小数点,类型取决于它是否适合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。