SQL触发器问题

cow_sheep 2008-09-12 03:02:00
表A:10000条数据 20条数据为一组 ,一共500组


表B:有初始数据。

用户100人。

要求:用户可以通过点击按钮把表A的一组数据拷贝到表B同时删除表A中对应的这组数据
并且把该组数据计入到点击按钮的用户名下(采用update方法把‘数据所属人’字段更改成点击按钮的用户名)

假如100个用户点击按钮,会按点击时间排序,按组号从小到大取得数据。

请教各位SQL语句和触发器的写法~请贴出代码 谢谢
...全文
243 14 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
cow_sheep 2008-09-14
  • 打赏
  • 举报
回复
呵呵 马上结贴
csdyyr 2008-09-13
  • 打赏
  • 举报
回复

create proc test
@errorcode int output
as
--if an error occurs then
set @errorcode=@@error
go

declare @errorcode int
exec test @errorcode output
select @errorcode

drop proc test
113244 2008-09-13
  • 打赏
  • 举报
回复
学习。
cow_sheep 2008-09-13
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 happyflystone 的回复:]
引用 9 楼 wbfsa 的回复:
请问在前台读取到错误是用@@error的值吗? 如果总是出现“并发错误”只类的提示,而没有处理过程,这可不太友好了~



提示你可以写得详细点呀,至于出错后的处理完全取决于你呀,似乎别人不懂你的业务也是白拾
[/Quote]

就比如说 出错后出现错误页面然后自动history.go(-1)到上一页面.这样的话就必需要取得错误号了啊
通过错误号我才能设计错误响应吧~~请赐教
昵称被占用了 2008-09-12
  • 打赏
  • 举报
回复
--加个取组号程序,这样就user account一个参数了
declare @groupid int
begin transaction
select top 1 @groupid=groupid from a with (xlock) order by groupid --加锁防止冲突
if @@error<>0
begin
rollback
raiserror(16,1,'并发错误')
end

insert into b select 'user account',* from a where groupid=@groupid
if @@error<>0
begin
rollback
raiserror(16,1,'并发错误')
end

delete a where groupid=@groupid

if @@error<>0
begin
rollback
raiserror(16,1,'并发错误')
end
commit transaction
ximizhi 2008-09-12
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 utpcb 的回复:]
估计你要的不光是触发器吧程序不可以吗? 调用PROC
[/Quote]

应该有存储过程
-狙击手- 2008-09-12
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 wbfsa 的回复:]
请问在前台读取到错误是用@@error的值吗? 如果总是出现“并发错误”只类的提示,而没有处理过程,这可不太友好了~
[/Quote]


提示你可以写得详细点呀,至于出错后的处理完全取决于你呀,似乎别人不懂你的业务也是白拾
utpcb 2008-09-12
  • 打赏
  • 举报
回复
估计你要的不光是触发器吧程序不可以吗? 调用PROC
cow_sheep 2008-09-12
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 zheninchangjiang 的回复:]
begin transaction
insert into b select 'user account',* from a where groupid=@groupid
delete a where groupid=@groupid
if @@rowcount=0
begin
rollback
raiserror(16,1,'并发错误')
end
commit transaction

用触发器并不能将账号传入,用个这样的事务挺好.
除非对于b没有其他的数据插入,可以使用b表的插入触发器
create trigger trgtest on b
for insert
as
begin

[/Quote]


不好意思 引用错了~~呵呵
cow_sheep 2008-09-12
  • 打赏
  • 举报
回复
[Quote=引用楼主 wbfsa 的帖子:]
表A:10000条数据 20条数据为一组 ,一共500组


表B:有初始数据。

用户100人。

要求:用户可以通过点击按钮把表A的一组数据拷贝到表B同时删除表A中对应的这组数据
并且把该组数据计入到点击按钮的用户名下(采用update方法把‘数据所属人’字段更改成点击按钮的用户名)

假如100个用户点击按钮,会按点击时间排序,按组号从小到大取得数据。

请教各位SQL语句和触发器的写法~请贴出代码 谢谢
[/Quote]

茅塞顿开~~~呵呵 强人
组号是顺序生成的~ 用户点击按钮时并不知道组号,换句话说就是:

用户1 点击按钮 选取了第一组,用户2随后点击按钮 他选取的就是第二组
依此类推。
像朋友上面的写法,必需是groupid作为参数,如果是groupid参数未知的情况下怎么做到?


zoroz 2008-09-12
  • 打赏
  • 举报
回复
不熟悉 帮顶
xabcxyz 2008-09-12
  • 打赏
  • 举报
回复
旁听学习了,呵呵
zheninchangjiang 2008-09-12
  • 打赏
  • 举报
回复
begin transaction
insert into b select 'user account',* from a where groupid=@groupid
delete a where groupid=@groupid
if @@rowcount=0
begin
rollback
raiserror(16,1,'并发错误')
end
commit transaction

用触发器并不能将账号传入,用个这样的事务挺好.
除非对于b没有其他的数据插入,可以使用b表的插入触发器
create trigger trgtest on b
for insert
as
begin
delete a from a join inserted b on a.groupid=b.groupid
if @rowcount=0
begin
rollback
raiserror(16,1,'并发错误')
end
end
cow_sheep 2008-09-12
  • 打赏
  • 举报
回复
请问在前台读取到错误是用@@error的值吗? 如果总是出现“并发错误”只类的提示,而没有处理过程,这可不太友好了~

22,300

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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