求一Sql触发器,向表里插入数据时判断该条记录是否存在,如果存在则更新,不存在则插入

zcxzlp 2012-12-14 02:22:35
求一Sql触发器,向表里插入数据时判断该条记录是否存在,如果存在则更新,不存在则插入!
...全文
10975 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
zcxzlp 2012-12-17
  • 打赏
  • 举报
回复
引用 15 楼 galenkeny 的回复:
引用 12 楼 zcxzlp 的回复:引用 6 楼 galenkeny 的回复: SQL code?12345678910111213141516171819202122232425262728291、--处理的触发器示例create trigger tr_insert on 表instead of insert --注意触发器的类型as--更新已经存在的主键upda……
SET identity_insert ON 弄了 还是出现这个!
以学习为目的 2012-12-16
  • 打赏
  • 举报
回复
引用 12 楼 zcxzlp 的回复:
引用 6 楼 galenkeny 的回复: SQL code?12345678910111213141516171819202122232425262728291、--处理的触发器示例create trigger tr_insert on 表instead of insert --注意触发器的类型as--更新已经存在的主键update 表 set name=b.name,sex=b.sexfr……
你表里面有自增列,然后被显示插入值造成报错。SET identity_insert ON,然后再执行
我腫了 2012-12-15
  • 打赏
  • 举报
回复
不用那麼麻煩,直接用這語句就行.
Update dbo.PartOpr
		Set 字段=值
-- 存在記錄才更新
Where OperationDesc=@OperationDesc 
	and TopVersion=@TopVersion 
	and DrawNum=@DrawNum  
	and TopPartNum=@TopPartNum 
	and [Version]=@Version


Insert into dbo.PartOpr(字段)
	Select 
			字段
		-- 不存在記錄才插入
		Where Not exists(select 1 from dbo.PartOpr				
							Where OperationDesc=@OperationDesc 
								and TopVersion=@TopVersion 
								and DrawNum=@DrawNum  
								and TopPartNum=@TopPartNum 
								and [Version]=@Version
					)
  • 打赏
  • 举报
回复
--好久没写触发器了  写个练练手
if OBJECT_ID('tbl') is not null
drop table tbl
go
create table tbl
(
	id int identity,
	StuNo varchar(20),
	StuName varchar(20),
	age smallint
)
go
insert tbl(StuNo,StuName,age)
select '200911076','tracy',22 union all
select '200911077','kobe',21 union all
select '200911078','nash',23 union all
select '200911079','lucy',22 union all
select '200911080','lily',21
go
if OBJECT_ID('tr_test') is not null
drop trigger tr_test
go
create trigger tr_test on tbl
instead of insert
as
--插入的数据都会放在inserted这个临时表中,不管是tbl存在的或者不存在的
--所以  我们只需把存在的更新过去  不存在的插入就好
--先更新原有的
update tbl
set tbl.StuName=i.StuName,tbl.age=i.age
from inserted i where i.StuNo=tbl.StuNo
--再插入不存在的
insert tbl(StuNo,StuName,age)
select StuNo,StuName,age from inserted a
where not exists(select 1 from tbl i where a.StuNo=i.StuNo)
go

insert tbl(StuNo,StuName,age)
select '200911076','tracy mcgrady',30 union all
select '200911081','david',23

select * from tbl

/*
id	StuNo	StuName	age
------------------------------------------------------------
1	200911076	tracy mcgrady	30
2	200911077	kobe	21
3	200911078	nash	23
4	200911079	lucy	22
5	200911080	lily	21
6	200911081	david	23
*/
zcxzlp 2012-12-15
  • 打赏
  • 举报
回复
引用 6 楼 galenkeny 的回复:
SQL code?12345678910111213141516171819202122232425262728291、--处理的触发器示例create trigger tr_insert on 表instead of insert --注意触发器的类型as--更新已经存在的主键update 表 set name=b.name,sex=b.sexfrom 表 a joi……
仅当使用了列列表并且 IDENTITY_INSERT 为 ON 时,才能为表'dbo.PartOpr'中的标识列指定显式值。 者句话是什么意思!
zcxzlp 2012-12-15
  • 打赏
  • 举报
回复
引用 6 楼 galenkeny 的回复:
SQL code?12345678910111213141516171819202122232425262728291、--处理的触发器示例create trigger tr_insert on 表instead of insert --注意触发器的类型as--更新已经存在的主键update 表 set name=b.name,sex=b.sexfrom 表 a joi……
还在吗? 因为我没有标识列,我判断数据中存不存在相同数据。是以2条数据中五个字段是否相同来比较的。但是我这么写出问题
xiaoxiangqing 2012-12-15
  • 打赏
  • 举报
回复
6楼的就不错
zcxzlp 2012-12-15
  • 打赏
  • 举报
回复
引用 6 楼 galenkeny 的回复:
SQL code?12345678910111213141516171819202122232425262728291、--处理的触发器示例create trigger tr_insert on 表instead of insert --注意触发器的类型as--更新已经存在的主键update 表 set name=b.name,sex=b.sexfrom 表 a joi……
insertd 不是可识别的
sqlkxr 2012-12-14
  • 打赏
  • 举报
回复
靠,看成不让插入重复数据了
以学习为目的 2012-12-14
  • 打赏
  • 举报
回复

1、--处理的触发器示例
create trigger tr_insert on 表
instead of insert  --注意触发器的类型
as
--更新已经存在的主键
update 表 set name=b.name,sex=b.sex
from 表 a join inserted b on a.id=b.id

--插入存在的主键数据
insert 表
select a.*
from inserted a left join 表 b on a.id=b.id
where b.id is null
go
——————————————————————————————————————————

2、--触发器
CREATE TRIGGER tri_edit  ON tab
INSTEAD OF INSERT
AS

if exists(select col1,col2 from tab join inserted on tab.学号=INSERTED.学号)
 begin
--这里面你可以加如些其他修改操作,取决于具体的功能
        update tab set col1='num1' from tab join inserted on tab.学号=inserted.学号
 end
else
 insert tab  select * from inserted
GO

以学习为目的 2012-12-14
  • 打赏
  • 举报
回复
你的数据库是SQL 2008以上版本么?SQL 2008引入了meger函数,可以满足你的需求。
zcxzlp 2012-12-14
  • 打赏
  • 举报
回复
引用 2 楼 jiangshun 的回复:
引用 楼主 zcxzlp 的回复:求一Sql触发器,向表里插入数据时判断该条记录是否存在,如果存在则更新,不存在则插入! 没理由要用触发器啊,你先判断存在,存在就update,不存在就insert 还不如直接delete,在insert,这样就不用管记录存在不存在,也不用update 就可以保证记录是最新的
删除不能用,因为是几个部门的资料整合在一起提交上去的数据。只能用更新。 每个部门只能提交其中所属于他们管辖的字段。 if exists((select top 1 0 from dbo.PartOpr where OperationDesc=@OperationDesc and TopVersion=@TopVersion and DrawNum=@DrawNum and TopPartNum=@TopPartNum and [Version]=@Version)) 着是我写的判断存在 你觉得这么写对吗?
zcxzlp 2012-12-14
  • 打赏
  • 举报
回复
删除不能用,因为是几个部门的资料整合在一起提交上去的数据。只能用更新。 每个部门只能提交其中所属于他们管辖的字段。 if exists((select top 1 0 from dbo.PartOpr where OperationDesc=@OperationDesc and TopVersion=@TopVersion and DrawNum=@DrawNum and TopPartNum=@TopPartNum and [Version]=@Version)) 着是我写的判断存在 你觉得这么写对吗?
jiangshun 2012-12-14
  • 打赏
  • 举报
回复
引用 楼主 zcxzlp 的回复:
求一Sql触发器,向表里插入数据时判断该条记录是否存在,如果存在则更新,不存在则插入!
没理由要用触发器啊,你先判断存在,存在就update,不存在就insert 还不如直接delete,在insert,这样就不用管记录存在不存在,也不用update 就可以保证记录是最新的
zcxzlp 2012-12-14
  • 打赏
  • 举报
回复
大神在吗?

34,590

社区成员

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

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