所以我有一个以标识列作为主键的表,所以它是一个整数。那么,为什么SCOPE_IDENTITY()
总是向我的 C# 应用程序返回一个十进制值而不是一个 int?这真的很烦人,因为十进制值不会隐式转换为 C# 中的整数,这意味着我现在必须重写一堆东西并有很多帮助方法,因为我使用 SQL Server 和 Postgres,Postgres 确实返回一个整数等效功能..
为什么SCOPE_IDENTITY()
不只返回一个普通整数?是否有人通常使用十进制/非标识值作为主键?
所以我有一个以标识列作为主键的表,所以它是一个整数。那么,为什么SCOPE_IDENTITY()
总是向我的 C# 应用程序返回一个十进制值而不是一个 int?这真的很烦人,因为十进制值不会隐式转换为 C# 中的整数,这意味着我现在必须重写一堆东西并有很多帮助方法,因为我使用 SQL Server 和 Postgres,Postgres 确实返回一个整数等效功能..
为什么SCOPE_IDENTITY()
不只返回一个普通整数?是否有人通常使用十进制/非标识值作为主键?
在 SQL Server 中,IDENTITY
可以将属性分配给tinyint
、smallint
、int
、bigint
、decimal(p, 0)
或numeric(p, 0)
列。因此,该SCOPE_IDENTITY
函数必须返回一个可以包含上述所有内容的数据类型。
正如之前的答案所说,只需int
在返回之前将其投射到服务器上,然后 ADO.NET 将按照您的预期检测其类型。
您不能在从查询或存储过程中返回它之前将其转换(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())');
这不是对所问问题的确切答案,但按照上面的答案,如何(在 T-SQL - MS SQLServer 中):
选择转换(bigint,SCOPE_IDENTITY())