select SCOPE_IDENTITY()为何有时失效?

siu5 2011-01-05 06:26:51
在公司写的的项目里面,添加新数据的时候,经常要用到添加完之后要返回新数据的ID,于是就在insert后面加上了select SCOPE_IDENTITY()这句代码。
奇怪的是,有些表加上这句代码可以顺利返回ID,但另一些表却报:“该语句没有返回结果集。”
最神奇的是:之前一直能够正常返回ID的表,今天用着用着也突然间不能返回了,也报:“该语句没有返回结果集”这个异常了,这是怎么回事呢?
谢谢你。
...全文
775 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
siu5 2011-03-24
  • 打赏
  • 举报
回复
刚才测试了一下,用存储过程,确实可以返回id,但因为我的系统里面有很多表,有些表还有几十列。如果用存储过程的话,1、要生成很多存储过程,这需要不少时间;2、有些存储过程,需要几十个变量,因为表里有几十列。这样需要很大的工作量的啊!
我想了个偷懒的办法,就是把insert tableName values (xxxx, xxxx)这个语句,作为一个变量,然后在存储过程里面用exec来执行,这样我就只需要生成一个存储过程就可以了。结果,select scope_identity()的结果是null。也就是说,我这个办法行不通了。
请问有没有简单一些办法,用一个存储过程,就可以任何表在这个存储过程里面“insert ”的之后,都可以取出id呢?
COOL波波 2011-03-24
  • 打赏
  • 举报
回复
insert 出现问题了,可能是有些表在select SCOPE_IDENTITY()语句执行前执行了其他的操作!利用存储过程是比较容易些,但是相对来说LZ你的这个情况不太适合
coleling 2011-01-06
  • 打赏
  • 举报
回复
楼主,最稳妥的做法是把这两个语句放到一个存储过程中,然后调用这个存储过程。
AcHerat 元老 2011-01-06
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 siu5 的回复:]
最令我觉得不解的是:上午还用得好好的,下午突然就出现那个问题。
刚才我修改了一下代码,原来insert语句是和select scope_identity();连载一起写的,现在分开了就行了。
原来的代码:
ResultSet rs=db.executeQuery(insert into table1 values (a, b, c);select scope_identity())
现在的……
[/Quote]

最好还是按你第一次写的那样做,select scope_identity() 是马上获得当前作用域insert语句里的最后标识值!
分开写时insert已经执行完!作用域应该不会返回结果。
coleling 2011-01-06
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 siu5 的回复:]

请教12楼:我是很少用到(其实是在学习使用数据库的时候,写过存储过程,正式工作之后就没有写过了)存储过程的,如果用存储过程,那岂不是要写很多参数变量?应该如何写法呢?可否简单写个例子?谢谢。
[/Quote]

以你所用语句为例,在查询分析器(2000)或SSMS中执行以下语句:
create proc spname --spname是存储过程名称,请自行修改
(
@a int,
@b int,
@c int --这三个是参数名称和类型,可根据实际自行修改
)
as
begin
insert into table1 values (@a, @b, @c);
select scope_identity()
end

以上语句即生成了一个名为spname的存储过程,然后将程序中的语句改为
ResultSet rs=db.executeQuery(exec spname a,b,c)应该就可以了
luoyefeng1022 2011-01-06
  • 打赏
  • 举报
回复
应该是 executeQuery 在访问SQL 时 SQL中的 Scope_identity() 已消失!
你错误的效果应该如下例句:
Insert Into #tb values('1','1')
Select * from #tb
Select Scope_identity()
siu5 2011-01-06
  • 打赏
  • 举报
回复
请教12楼:我是很少用到(其实是在学习使用数据库的时候,写过存储过程,正式工作之后就没有写过了)存储过程的,如果用存储过程,那岂不是要写很多参数变量?应该如何写法呢?可否简单写个例子?谢谢。
feixianxxx 2011-01-05
  • 打赏
  • 举报
回复
3种返回最大标志值方法

试试使用DENT_CURRENT 返回为任何会话和任何作用域中的特定表最后生成的标识值。
siu5 2011-01-05
  • 打赏
  • 举报
回复
最令我觉得不解的是:上午还用得好好的,下午突然就出现那个问题。
刚才我修改了一下代码,原来insert语句是和select scope_identity();连载一起写的,现在分开了就行了。
原来的代码:
ResultSet rs=db.executeQuery(insert into table1 values (a, b, c);select scope_identity())
现在的代码:
boolean ok=db.executeUpdate(insert into table1 values (a, b, c))
ResultSet rs=db.executeQuery(select scope_identity())

说明:db是数据类的对象变量。
现在的代码执行的时候,我是很担心的,因为尽管可能性不大,但还是存在一种情况:两个甚至更多个用户同时添加记录,取出来的id就说不清楚了。
happy664618843 2011-01-05
  • 打赏
  • 举报
回复
select scope_identity();或者select max(id)
飘零一叶 2011-01-05
  • 打赏
  • 举报
回复
select SCOPE_IDENTITY()这句的前面应该是加了其他操作了。
nihao134711 2011-01-05
  • 打赏
  • 举报
回复
表是否使用了触发器
siu5 2011-01-05
  • 打赏
  • 举报
回复
当然是自增类型的。insert出错应该报的不是这个异常吧,应该是其他提示吧。。。
Shawn 2011-01-05
  • 打赏
  • 举报
回复
呃呃,仔细看一下,是否有破绽:
http://msdn.microsoft.com/zh-cn/library/ms190315.aspx
bancxc 2011-01-05
  • 打赏
  • 举报
回复
insert出错了?
nihao134711 2011-01-05
  • 打赏
  • 举报
回复
请确认你使用的表的主键是自增类型的?

34,588

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧