2010-04-08 79 views
73

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

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

回答

84

在SQL Server,所述IDENTITY属性可以分配给tinyint,smallint,int,bigint,decimal(p, 0)numeric(p, 0)列。因此SCOPE_IDENTITY函数必须返回一个数据类型,可以包含上述所有内容。如前面的答案所述,只要在返回之前将其转换为服务器上的int,ADO.NET就会按照您的预期检测其类型。

+1

我不知道你可以有任何东西,但主键int和bigint .. – Earlz 2010-04-08 18:17:04

+0

'SCOPE_IDENTITY'函数返回值是***小数(38,0)*** – Kiquenet 2017-02-16 08:48:36

27

难道你不能只是在从你的查询或存储过程返回它之前施放它(SP总是返回int无论如何,但也许你正在使用输出参数)?

SELECT CAST(SCOPE_IDENTITY() AS INT) AS LAST_IDENTITY

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

+0

'SCOPE_IDENTITY'是一个内置的功能..所以做这样'的ExecuteScalar时(“插入...;选择SCOPE_IDENTITY()) ;'它将从该函数返回一个小数,而不是预期的int。 – Earlz 2010-04-08 16:42:42

+0

@Earlz,所以将SQL更改为ExecuteScalar('insert ...; select CAST(scope_identity()AS int)'); – 2010-04-08 17:17:17

3

Scope identity返回值是十进制(38,0)

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

3

尝试使用这一点,你会得到一个整数回:

ExecuteScalar('insert...; select CONVERT(int,scope_identity())'); 
相关问题