SQL Server“int”数据类型是否会在输入时可靠地截断(而不是舍入)十进制值?

Bre*_*ers 4 sql-server integer

我有一个用户使用的软件有时会将 UNIT 的 ID 作为整数(例如 1000)发回,有时会附加一个小十进制值(例如 1000.001)。该软件会自动生成具有“真实”数据类型的 MSSQL (2016 SP1) 表,并且“最重要”使此 UNIT 列成为主键的一部分。这会导致数据输入端和报告端出现问题。

我意识到这确实是软件的一个“错误”,但我试图在数据库方面提供帮助。我已经在沙盒区域证明我可以将“真实”数据类型更改为“int”,这不会导致现有数据丢失数据,并且每个输入场景都显示任何输入的十进制值将在“int”列(未四舍五入)。

我的问题是,“当输入到“int”数据类型时,SQL Server 是否总是可靠地截断十进制值(我们没有办法深入到打包的应用程序中并强制将其转为 ROUND)?是否有任何情况会出错,或引起问题?” 我在任何地方都找不到此文档。

Han*_*non 7

和数据类型的Microsoft Docs 页面是这样说的:floatreal

float 的值在转换为任何整数类型时会被截断。

此外,CAST 和 CONVERT (Transact-SQL)页面说:

当您转换小数位不同的数据类型时,SQL Server 有时会返回一个截断的结果值,而在其他时候它会返回一个四舍五入的值。此表显示了行为。

换算表

我更喜欢修改源软件以不返回浮点数据,但除此之外,如果某些进程不使用该数据会危及生命,那么它看起来像隐式转换int应该是安全的。

我用“非危及生命”对其进行了限定,因为在某些情况下,隐式转换可能不会按照记录的方式运行。以int文档页面的“注意”部分中显示的详细信息为例。