当在 mssql 语句中硬编码纯数字时,默认类型是什么?
what is the default type when a plain number is hard coded in a mssql statement?
我有一些代码
正在做
SELECT * FROM table where col = 123
col 是 varchar(64)
当 col 包含小于 1456324852868 的值时
它工作正常,直到有人在 table 中添加值 635912311949815157,这当然导致了这个错误
Arithmetic overflow error converting varchar to data type numeric.
这是因为为了比较两个值,它们需要是兼容的类型。因此,出于某种原因,小于 1456324852868 的值可以正常转换,但无法转换 635912311949815157。
我的问题是什么时候有硬编码的 sql 整数值(如上面的 123)它们是什么数据类型以及为什么它适用于高于 int 范围的 varchar 值 1456324852868 但当添加 varchar 值 635912311949815157 时东西开始坏了?
我做了一些实验并且
SELECT * FROM table where col = convert(int,123)
给出不同的错误 (Arithmetic overflow error converting expression to data type int.
) 所以
答案不是整数。
顺便说一句,我知道在数字周围加上引号可以修复这个新错误,但我想知道数据类型发生了什么。我知道这是一种糟糕的做法,但代码就在那里,但不是我写的。
我正在使用 MS-SQL Server 2012
谢谢!
值 123 存储为整数,您可以使用 sp_describe_first_result_set
在类似的语句中验证这一点
EXEC sp_describe_first_result_set N'SELECT 123'
在评估您的查询时,col
将隐式转换为整数,但是,这将取决于所选择的执行计划,哪些记录将被转换,因此您可能已经逃脱了 1456324852868
.
我不得不在我们的实时环境中调试类似的问题。有问题的查询多年来一直 运行 没有问题,直到新数据被添加到其中一个表并且所选的执行计划发生了变化。这导致查询失败,因为新的执行计划导致评估无法转换为整数的 VARCHAR
值。
对于初学者来说,不应该将硬编码的整数值插入到 varchar
(或任何类型的字符)列中。 这样做是一种错误的做法! 插入到字符数据类型中的所有文字值都应该用单引号引起来。
也就是说,以下代码回答了您的主要问题:
use tempdb
go
select
20 as 'tiny',
1000 as 'small',
33000 as 'medium',
100000 as 'large',
3000000000 as 'huge'
into #tempvalues
go
exec sp_help 'tempdb.dbo.#tempvalues_________________________________________________________________________________________________________000000000003'
go
您必须在 tempdb 中执行此操作并查找 sp_help
的适当名称
结果是所有整数文字都被隐式转换为 int
除非它们太大,在这种情况下它们被转换为 numeric
我有一些代码
正在做
SELECT * FROM table where col = 123
col 是 varchar(64)
当 col 包含小于 1456324852868 的值时
它工作正常,直到有人在 table 中添加值 635912311949815157,这当然导致了这个错误
Arithmetic overflow error converting varchar to data type numeric.
这是因为为了比较两个值,它们需要是兼容的类型。因此,出于某种原因,小于 1456324852868 的值可以正常转换,但无法转换 635912311949815157。
我的问题是什么时候有硬编码的 sql 整数值(如上面的 123)它们是什么数据类型以及为什么它适用于高于 int 范围的 varchar 值 1456324852868 但当添加 varchar 值 635912311949815157 时东西开始坏了?
我做了一些实验并且
SELECT * FROM table where col = convert(int,123)
给出不同的错误 (Arithmetic overflow error converting expression to data type int.
) 所以
答案不是整数。
顺便说一句,我知道在数字周围加上引号可以修复这个新错误,但我想知道数据类型发生了什么。我知道这是一种糟糕的做法,但代码就在那里,但不是我写的。
我正在使用 MS-SQL Server 2012
谢谢!
值 123 存储为整数,您可以使用 sp_describe_first_result_set
EXEC sp_describe_first_result_set N'SELECT 123'
在评估您的查询时,col
将隐式转换为整数,但是,这将取决于所选择的执行计划,哪些记录将被转换,因此您可能已经逃脱了 1456324852868
.
我不得不在我们的实时环境中调试类似的问题。有问题的查询多年来一直 运行 没有问题,直到新数据被添加到其中一个表并且所选的执行计划发生了变化。这导致查询失败,因为新的执行计划导致评估无法转换为整数的 VARCHAR
值。
对于初学者来说,不应该将硬编码的整数值插入到 varchar
(或任何类型的字符)列中。 这样做是一种错误的做法! 插入到字符数据类型中的所有文字值都应该用单引号引起来。
也就是说,以下代码回答了您的主要问题:
use tempdb
go
select
20 as 'tiny',
1000 as 'small',
33000 as 'medium',
100000 as 'large',
3000000000 as 'huge'
into #tempvalues
go
exec sp_help 'tempdb.dbo.#tempvalues_________________________________________________________________________________________________________000000000003'
go
您必须在 tempdb 中执行此操作并查找 sp_help
结果是所有整数文字都被隐式转换为 int
除非它们太大,在这种情况下它们被转换为 numeric