刚接触触发器,自己也在学习中,有点急用,特来向各位朋友学写了,不吝赐教!谢谢!
要实现下面的功能:---------------------------------------------
示例数据:
attr_a attr_b attr_c attr_p
1 ww 2006-8-17 18:44:22 1
2 ee 2006-8-17 18:23:42 2
1 ww 2006-8-17 18:56:12 3
----------------------------------------------
其中attr_p是主键,自增attr_a是某个人的编号,attr_b是他的名字,attr_c是插入记录的时间。
现在我需要写一个触发器,每插入一条数据都要先判断数据库中是否有这个人当天的插入记录,如果没有就插入该条记录,如果有就继续判断他今天的记录是一条吗?如果是的话那么插入现在想插入的记录。如果有两条今天的记录,那么我要找出时间上晚一些的那条记录然后更新它,更新的只是时间。。
谢谢大家了,感觉比较难了点,没有什么头绪!
要实现下面的功能:---------------------------------------------
示例数据:
attr_a attr_b attr_c attr_p
1 ww 2006-8-17 18:44:22 1
2 ee 2006-8-17 18:23:42 2
1 ww 2006-8-17 18:56:12 3
----------------------------------------------
其中attr_p是主键,自增attr_a是某个人的编号,attr_b是他的名字,attr_c是插入记录的时间。
现在我需要写一个触发器,每插入一条数据都要先判断数据库中是否有这个人当天的插入记录,如果没有就插入该条记录,如果有就继续判断他今天的记录是一条吗?如果是的话那么插入现在想插入的记录。如果有两条今天的记录,那么我要找出时间上晚一些的那条记录然后更新它,更新的只是时间。。
谢谢大家了,感觉比较难了点,没有什么头绪!
--测试表
CREATE TABLE TB1(Attr_a int,attr_b varchar(10),attr_c datetime,attr_p int identity(1,1))
--触发器
CREATE TRIGGER TRI_TB1
ON TB1
INSTEAD OF INSERT
AS
DECLARE @NUM INT
SELECT @NUM=COUNT(*)
FROM TB1
WHERE DATEDIFF(DAY,ATTR_C,GETDATE())=0
SELECT @NUM
IF @NUM<2
BEGIN
INSERT TB1(Attr_a,Attr_B,Attr_C) SELECT Attr_a,Attr_B,Attr_C FROM INSERTED
RETURN
END
ELSE
UPDATE A
SET ATTR_C='2006-4-4'
FROM TB1
----TEST
INSERT TB1
SELECT 1,'AA','2005-8-8'
SELECT * FROM TB1
create table tb
(
attr_a int,
attr_b varchar(30),
attr_c datetime,
attr_p int identity(1,1)
)create proc tbInsert
(
@attr_a int,
@attr_b varchar(30)
)
as
declare @Record int
declare @MaxId intselect
@Record=count(1),
@MaxId=max(attr_p)
from tb
where
attr_a=@attr_a and datediff(day,attr_c,getdate())=0if @Record=0 or @Record=1
insert tb(attr_a,attr_b,attr_c) values(@attr_a,@attr_b,getdate())
else
begin
if @Record=2
update tb set attr_c=getdate() where attr_a=@attr_a and attr_p=@MaxId
end
CREATE TRIGGER TRI_TB1
ON TB1
INSTEAD OF INSERT
AS
declare @nowdatetime datetime
set @nowdatetime=getdate() --保存记录时间
DECLARE @NUM INT
SELECT @NUM=COUNT(*)
FROM TB1
WHERE DATEDIFF(DAY,ATTR_C,GETDATE())=0
SELECT @NUM
IF @NUM<2
BEGIN
INSERT TB1(Attr_a,Attr_B,Attr_C) SELECT Attr_a,Attr_B,Attr_C FROM INSERTED
RETURN
END
ELSE
UPDATE A
SET ATTR_C=@nowdatetime
FROM TB1
where ATTR_C in (select max(ATTR_C) from TB1 where DATEDIFF(DAY,ATTR_C,GETDATE())=0)
CREATE TRIGGER TRI_TB1
ON TB1
INSTEAD OF INSERT
AS
declare @Attr_C datetime ,@Attr_a varchar(50),@Attr_B varchar(50)
select @Attr_a=Attr_a,@Attr_B=@Attr_B,@Attr_C=@Attr_C from inserted
DECLARE @NUM INT
SELECT @NUM=COUNT(*)
FROM TB1
WHERE Attr_a=@Attr_a and DATEDIFF(DAY,ATTR_C,@Attr_C)=0
IF @NUM<2
BEGIN
INSERT TB1(Attr_a,Attr_B,Attr_C) SELECT Attr_a,Attr_B,Attr_C FROM INSERTED
RETURN
END
ELSE
UPDATE A
SET ATTR_C=@Attr_C
FROM TB1
where ATTR_C in (select max(ATTR_C) from TB1 where Attr_a=@Attr_a and DATEDIFF(DAY,ATTR_C,GETDATE())=0)
我写了如上说的:
CREATE TRIGGER TRI_TB1
ON TB1
INSTEAD OF INSERT
AS
declare @Attr_C datetime ,@Attr_a varchar(50),@Attr_B varchar(50)
select @Attr_a=Attr_a,@Attr_B=@Attr_B,@Attr_C=@Attr_C from inserted
DECLARE @NUM INT
SELECT @NUM=COUNT(*)
FROM TB1
WHERE Attr_a=@Attr_a and DATEDIFF(DAY,ATTR_C,@Attr_C)=0
IF @NUM<2
BEGIN
INSERT TB1(Attr_a,Attr_B,Attr_C) SELECT Attr_a,Attr_B,Attr_C FROM INSERTED
RETURN
END
ELSE
UPDATE A
SET ATTR_C=@Attr_C
FROM TB1
where ATTR_C in (select max(ATTR_C) from TB1 where Attr_a=@Attr_a and DATEDIFF(DAY,ATTR_C,GETDATE())=0)
但是在语法检测老是通不过呀,提示:
错误156:在关键字’FOR‘附近有语法错误!
然后我删除了instead编译是通过了,但是在插入记录的时候提示对象名instead无效
但是在插入记录的时候总是提示对象名INSTEAD无效
我也在努力中,渴望继续关注
再谢!