为什么select SCOPE_IDENTITY()返回一个小数而不是一个整数?
所以我有一个标识列作为主键的表,所以它是一个整数。 那么,为什么SCOPE_IDENTITY()
总是返回一个十进制值而不是一个int到我的C#应用程序? 这真的很烦人,因为十进制值不会隐式转换为C#中的整数,这意味着我现在不得不重写一堆东西,并有很多帮助方法,因为我使用SQL Server和Postgres,其中Postgres返回一个整数等价函数
为什么SCOPE_IDENTITY()
不只是返回一个纯整数? 有没有人通常使用主键的十进制/非身份值?
在SQL Server中,可以将IDENTITY
属性分配给tinyint
, smallint
, int
, bigint
, decimal(p, 0)
或numeric(p, 0)
列。 因此, SCOPE_IDENTITY
函数必须返回一个数据types,可以包含上述所有内容。
正如前面的答案所说的,只是在返回之前将其转换为服务器上的int
,那么ADO.NET将按照您的预期检测其types。
难道你不能只是把它从你的查询或存储过程返回它(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())');