为什么选择SCOPE_IDENTITY()返回的是十进制而不是整数?

103
我有一个带有自增列作为主键的表格,因此它是一个整数。那么,为什么 SCOPE_IDENTITY() 总是返回一个十进制值而不是整数给我的 C# 应用程序?这真的很烦人,因为在 C# 中十进制值不能隐式地转换为整数,这意味着我现在必须重写很多东西并且使用很多辅助方法,因为我同时使用 SQL Server 和 Postgres,而 Postgres 对应函数确实会返回一个整数..
为什么 SCOPE_IDENTITY() 不直接返回一个整数呢?是否有人通常使用十进制/非自增值作为主键?
5个回答

115
在SQL Server中,可以将IDENTITY属性分配给tinyint, smallint, int, bigint, decimal(p, 0),或numeric(p, 0)列。因此,SCOPE_IDENTITY函数必须返回一个能够包含所有这些类型的数据类型。
正如之前的回答所说,只需要在服务器上将其强制转换为int,然后ADO.NET会按照你的预期检测它的类型。

4
SCOPE_IDENTITY 函数返回值为 ***decimal(38,0)***。 - Kiquenet

40

你不能在查询或存储过程返回之前对其进行转换吗?(SP始终返回int,但也许你正在使用输出参数)

比如 SELECT CAST(SCOPE_IDENTITY() AS INT) AS LAST_IDENTITY

为什么要这样做呢?可能是为了更灵活地处理更大的数字。


SCOPE_IDENTITY 是一个内置函数.. 因此,当执行类似于 ExecuteScalar('insert...; select scope_identity()); 的语句时,它将返回该函数的十进制值,而不是预期的整数。 - Earlz
@Earlz,那么将SQL更改为ExecuteScalar('insert ...; select CAST(scope_identity()AS int)'); - Cade Roux

4

尝试使用此代码,您将获得一个整数:

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

4

Scope identity 返回值为decimal(38,0)

使用CAST进行转换,使用OUTPUT子句或赋值给输出参数,而不是将SELECT SCOPE_IDENTITY()返回给客户端


在我的情况下,该列具有数据类型 int,但由于某些原因,SCOPE_IDENTITY() 返回 System.Decimal 类型... OUTPUT 子句按预期返回整数,所以感谢! - Erik Barke

0
这并不是一个精确的答案来回答问题,但是在上面提供的答案中,如何在T-SQL - MS SQLServer中进行:select convert(bigint, SCOPE_IDENTITY())

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接