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


90

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

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

Answers:


106

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

如先前的回答所述,只需int在返回它之前将其转换为服务器上的内容,然后ADO.NET就会按照您的期望检测其类型。


2
SCOPE_IDENTITY函数返回值是十进制(38,0)
Kiquenet

36

您难道不可以在从查询或存储的proc中返回它之前就强制转换它(SP总是返回int,但也许您使用的是输出参数)?

喜欢 SELECT CAST(SCOPE_IDENTITY() AS INT) AS LAST_IDENTITY

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


SCOPE_IDENTITY是内置函数..因此,当执行ExecuteScalar('insert...; select scope_identity());该操作时,它将从该函数返回一个小数而不是预期的int。
Earlz 2010年

@Earlz,因此将SQL更改为ExecuteScalar('insert ...; select CAST(scope_identity()AS int)');
Cade Roux

4

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

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


在我的情况下,该列具有数据类型,int但是SCOPE_IDENTITY()由于某种原因返回System.Decimal...该OUTPUT子句按预期返回整数,所以谢谢!
埃里克·巴克

3

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

ExecuteScalar('insert...; select CONVERT(int,scope_identity())');
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.