求助触发器一个(判断插入信息来调整表中信息),难难.......请给予支持!

cheng525jj 2010-10-06 05:22:45
有一个数据库表t1,对应的四个字段如下:

userkey username tel addreee

0001 张三 020-5689121 北京一路
0002 李四 020-5689121 北京二路
0003 王五 020-5689121 北京三路
....

条件:对表t1做插入操作时,判断插入数据userkey是否已经存在,
1.如果不存在就做插入操作;
2.如果存在,就判断userkey对应的tel,和addreee是否有变化,有变化就做更新(update)操作

例如:批量插入二条记录
0001 张三 020-1234567 北京中路
0004 张六 020-25698 北京西路

希望t1最后得到的结果是这样的:
0001 张三 020-1234567 北京中路
0002 李四 020-5689121 北京二路
0003 王五 020-5689121 北京三路
0004 张六 020-25698 北京西路



...全文
99 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
SQLCenter 2010-10-07
  • 打赏
  • 举报
回复
单条不需要exists判断,update/@@rowcount=0就是判断:

BEGIN TRAN    --开启事务
update [表t1] set tel='XXXX',addreee = 'XXXY' --自己给更新条件
where userkey ='XXXX' and tel ='020-1234567' and addreee ='北京中路'
if @@rowcount=0
begin
insert into [表t1] values ('0004', '张六', '020-25698', '北京西路') --自己给插入数据
end
COMMIT TRAN
SQLCenter 2010-10-07
  • 打赏
  • 举报
回复
例如:批量插入二条记录
0001 张三 020-1234567 北京中路
0004 张六 020-25698 北京西路
SQLCenter 2010-10-07
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 claro 的回复:]

引用 5 楼 sqlcenter 的回复:
这个还真不是包在一个事务能解决问题的
或许可以。
SQL code
BEGIN TRAN --开启事务
--判断条件是否成立
if exists(select * from [表t1] a where userkey ='XXXX' ) --判断条件自己给
begin
update [表t1] set te……
[/Quote]

这个是单条数据,INSERT批量呢
claro 2010-10-07
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 sqlcenter 的回复:]
这个还真不是包在一个事务能解决问题的
[/Quote]或许可以。
BEGIN TRAN	--开启事务
--判断条件是否成立
if exists(select * from [表t1] a where userkey ='XXXX' ) --判断条件自己给
begin
update [表t1] set tel='XXXX',addreee = 'XXXY' --自己给更新条件
where userkey ='XXXX' and tel ='020-1234567' and addreee ='北京中路'
end
else
begin
insert into [表t1] values ('0004', '张六', '020-25698', '北京西路') --自己给插入数据
end
COMMIT TRAN


http://topic.csdn.net/u/20101007/10/38790eb1-3acd-4b79-8813-91f70b215c67.html?97873
低调的感觉 2010-10-07
  • 打赏
  • 举报
回复
SQLCenter 2010-10-06
  • 打赏
  • 举报
回复
--> 测试数据:test
if object_id('test') is not null drop table test
create table test(userkey varchar(8), username varchar(8), tel varchar(11), addreee varchar(8))
insert into test
select '0001', '张三', '020-5689121', '北京一路' union all
select '0002', '李四', '020-5689121', '北京二路' union all
select '0003', '王五', '020-5689121', '北京三路'
go

--> trigger
create trigger tr_test on test
instead of insert
as
set nocount on
update t set t.username=i.username, t.tel=i.tel, t.addreee=i.addreee from test t join inserted i on t.userkey=i.userkey
insert test select * from inserted i where not exists (select 1 from test where userkey=i.userkey)
set nocount off
go

--> insert
insert into test
select '0001', '张三', '020-1234567', '北京中路' union all
select '0004', '张六', '020-25698', '北京西路'

select * from test
/*
userkey username tel addreee
-------- -------- ----------- --------
0001 张三 020-1234567 北京中路
0002 李四 020-5689121 北京二路
0003 王五 020-5689121 北京三路
0004 张六 020-25698 北京西路
*/
SQLCenter 2010-10-06
  • 打赏
  • 举报
回复
这个还真不是包在一个事务能解决问题的

给你一个思路

instead of 触发器
1、update已存在的userkey,这个就不判断了,直接update
2、插入不存在的userkey
cheng525jj 2010-10-06
  • 打赏
  • 举报
回复
请向claro请教一下,能否给一点思路,谢谢!
claro 2010-10-06
  • 打赏
  • 举报
回复
包在一个事务中不可以吗?
claro 2010-10-06
  • 打赏
  • 举报
回复
这个要用触发器吗?
「已注销」 2010-10-06
  • 打赏
  • 举报
回复
自己找个触发器的校例子看看,这个很简单的。

22,210

社区成员

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

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