所以我有一个以标识列为主键的表,所以它是一个整数。那么,为什么SCOPE_IDENTITY()
总是向我的C#应用程序返回一个十进制值而不是一个int?这真的很烦人,因为十进制值不会隐式转换为C#中的整数,这意味着我现在必须重写一堆东西,并且有很多辅助方法,因为我使用SQL Server和Postgres,Postgres确实返回一个整数等效函数..
为什么SCOPE_IDENTITY()
不只是返回一个普通的整数?是否有人通常使用十进制/非身份值作为主键?
答案 0 :(得分:96)
在SQL Server中,IDENTITY
属性可以分配给tinyint
,smallint
,int
,bigint
,decimal(p, 0)
或{ {1}}列。因此,numeric(p, 0)
函数必须返回一个可以包含上述所有内容的数据类型。
正如之前的答案所说的那样,只需将它转发到服务器上的SCOPE_IDENTITY
,然后再返回它,然后ADO.NET会检测到它的类型。
答案 1 :(得分:30)
你不能在从查询或存储过程中返回它之前抛出它(无论如何,SP总是返回int,但是你可能正在使用输出参数)?
赞SELECT CAST(SCOPE_IDENTITY() AS INT) AS LAST_IDENTITY
为什么会这样呢?可能更灵活,处理更多的数字。
答案 2 :(得分:4)
Scope identity返回值为十进制(38,0)
CAST它,使用OUTPUT子句,或者为客户端分配输出参数而不是SELECT SCOPE_IDENTITY()
答案 3 :(得分:3)
尝试使用此功能,您将获得一个整数:
ExecuteScalar('insert...; select CONVERT(int,scope_identity())');
答案 4 :(得分:0)
这不是所问问题的确切答案,但就上述答案而言,该怎么回事(在T-SQL-MS SQLServer中):
选择convert(bigint,SCOPE_IDENTITY())