为什么select SCOPE_IDENTITY()返回一个小数而不是一个整数?

所以我有一个标识列作为主键的表,所以它是一个整数。 那么,为什么SCOPE_IDENTITY()总是返回一个十进制值而不是一个int到我的C#应用​​程序? 这真的很烦人,因为十进制值不会隐式转换为C#中的整数,这意味着我现在不得不重写一堆东西,并有很多帮助方法,因为我使用SQL Server和Postgres,其中Postgres返回一个整数等价函数

为什么SCOPE_IDENTITY()不只是返回一个纯整数? 有没有人通常使用主键的十进制/非身份值?

在SQL Server中,可以将IDENTITY属性分配给tinyintsmallintintbigintdecimal(p, 0)numeric(p, 0)列。 因此, SCOPE_IDENTITY函数必须返回一个数据types,可以包含上述所有内容。

正如前面的答案所说的,只是在返回之前将其转换为服务器上的int ,那么ADO.NET将按照您的预期检测其types。

难道你不能只是把它从你的查询或存储过程返回它(SP总是返回int无论如何,但也许你正在使用一个输出参数)吗?

SELECT CAST(SCOPE_IDENTITY() AS INT) AS LAST_IDENTITY

为什么这样做呢? 可能会更灵活,处理更多的数字。

范围标识返回值是十进制(38,0)

CAST它,使用OUTPUT子句,或分配给输出参数,而不是SELECT SCOPE_IDENTITY()到客户端

尝试使用这个,你会得到一个整数回来:

 ExecuteScalar('insert...; select CONVERT(int,scope_identity())');