首页 新闻 会员 周边 捐助

SqlServer自增列的问题

0
悬赏园豆:15 [已解决问题] 解决于 2008-09-19 18:03

我用insert后跟select @@Identity的方法,执行ExecuteScalar后返回一个objcet,事实证明这个object的确是自动生成的值,但是它的类型居然是System.Decimal!我数据库里显然是int啊,为什么会返回这么奇怪的数据类型呢?

JimLiu的主页 JimLiu | 菜鸟二级 | 园豆:300
提问于:2008-09-19 14:08
< >
分享
最佳答案
0

在SQL SERVER中可以使用三种方法来获取系统生成的标识值:
@@IDENTITY、SCOPE_IDENTITY 和 IDENT_CURRENT 这三个函数都返回最后生成的标识值。但是,它们在定义"最后"的作用域和会话上不同。

  • @@IDENTITY 返回为当前会话的所有作用域中的任何表最后生成的标识值。
  • SCOPE_IDENTITY 返回为当前会话和当前作用域中的任何表最后生成的标识值。
  • IDENT_CURRENT 返回为任何会话和任何作用域中的特定表最后生成的标识值。 

@@IDENTITY

返回最后插入的标识值。

语法
@@IDENTITY

返回类型
numeric

注释
在一条 INSERT、SELECT INTO 或大容量复制语句完成后,@@IDENTITY 中包含此语句产生的最后的标识值。若此语句没有影响任何有标识列的表,则 @@IDENTITY 返回 NULL。若插入了多个行,则会产生多个标识值,@@IDENTITY 返回最后产生的标识值。如果此语句激发一个或多个执行产生标识值的插入操作的触发器,则语句执行后立即调用 @@IDENTITY 将返回由触发器产生的最后的标识值。若 INSERT 或 SELECT INTO 语句失败或大容量复制失败,或事务被回滚,则 @@IDENTITY 值不会还原为以前的设置。

如果在你进行insert操作的时间和检查@@IDENTITY的时间之间有另一个insert操作被执行,@@IDENTITY返回的不是系统为你的insert所生成的标识值,而是它为最近的一个insert操作所生成的标识值。

SCOPE_IDENTITY

返回插入到同一作用域中的 IDENTITY 列内的最后一个 IDENTITY 值。一个作用域就是一个模块——存储过程、触发器、函数或批处理。因此,如果两个语句处于同一个存储过程、函数或批处理中,则它们位于相同的作用域中。

……

更多 http://blog.csdn.net/vince6799/archive/2006/05/14/727925.aspx

 


根据引用的解释看,似乎 @@Identity 的返回类型是固定的,而对于 c# 大概就是 Decimal 了。你换用 SCOPE_IDENTITY 之类的试试呢,看解释它似乎是忠于原类型的。

陛下 | 老鸟四级 |园豆:3938 | 2008-09-19 14:53
其他回答(2)
0

SCOPE_IDENTITY !! 楼上解释的非常清楚了

SCOPE_IDENTITY 返回为当前会话和当前作用域中的任何表最后生成的标识值。

Allie | 园豆:707 (小虾三级) | 2008-09-19 15:48
0

@@IDENTITY 返回的是numeric 类型。numeric(38,0) 

在C#里自然对应decimal了。

roboth | 园豆:28 (初学一级) | 2008-09-19 16:03
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册