97

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

为什么SCOPE_IDENTITY()不只返回一个普通整数?是否有人通常使用十进制/非标识值作为主键?

4

5 回答 5

111

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

正如之前的答案所说,只需int在返回之前将其投射到服务器上,然后 ADO.NET 将按照您的预期检测其类型。

于 2010-04-08T16:59:32.887 回答
37

您不能在从查询或存储过程中返回它之前将其转换(SP 总是返回 int,但也许您正在使用输出参数)?

SELECT CAST(SCOPE_IDENTITY() AS INT) AS LAST_IDENTITY

为什么会这样?可能更灵活并处理更大的数字。

于 2010-04-08T16:28:08.033 回答
4

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

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

于 2010-04-08T16:48:23.110 回答
3

尝试使用它,你会得到一个整数:

ExecuteScalar('insert...; select CONVERT(int,scope_identity())');
于 2010-04-08T17:13:14.860 回答
0

这不是对所问问题的确切答案,但按照上面的答案,如何(在 T-SQL - MS SQLServer 中):

选择转换(bigint,SCOPE_IDENTITY())

于 2020-12-04T14:17:42.273 回答