Lun*_*Box 1 sql t-sql sql-server int
我有一个名为列的表PtObjId中的INT数据类型。
根据我的理解,通过查看位于此处的Microsoft 文档的线程。我最多只能存储 +/- 2,147,483,647 的值
如果我运行此查询:
Select top 100 *
from [table]
where [PtObjId] IN (44237141916)
Run Code Online (Sandbox Code Playgroud)
应该不会报错吧?
为什么此查询错误如下:
select top 100 *
from [table]
where [PtObjID] IN ('44237141916')
Run Code Online (Sandbox Code Playgroud)
但最上面的查询没有出错?
这篇sqlshack 文章 解释了有关 SQL-Server 中隐式转换的详细信息。
必须为比较隐式转换一个值。文字44237141916被视为decimal,其优先级高于int,因此另一个操作数被强制转换为decimal。
文章中给出了完整的优先级列表(以及可能的转换表),摘录如下:
10. float
11. real
12. decimal
13. money
14. smallmoney
15. bigint
16. int
17. smallint
18. tinyint
...
25. nvarchar (including nvarchar(max))
Run Code Online (Sandbox Code Playgroud)
(较低的数字 = 较高的优先级)
在的情况下,int和nvarchar,一个具有较高的优先级int,这导致溢出为44237141916。