本贴并非问题。只是为了回答“新手提问有关SQL触发器的问题 [已结贴,结贴人:vickiyan]”这个哥哥我在回贴,还没有打完字,他老人家就结贴了,有些问题没有和他说清楚呢
CREATE TRIGGER TR_SendB ON dbo.SendB
FOR UPDATE
NOT FOR REPLICATION --这条记得加上啊,
AS
DECLARE @ID INT
DECLARE @MOBB VARCHAR(50)
DECLARE @State
SET @ID =(SELECT ID FROM INSERTED)
SET @MOBB=(SELECT MOBB FROM INSERTED)
SET @State=(SELECT State FROM INSERTED)
PRINT @ID
PRINT @MOBB
PRINT @StateIF UPDATE (State)
BEGIN
UPDATE AcceptB SET Reply=@State WHERE Accept.ID=@ID AND Accept.MOBB=@MoBB AND Reply<>@State
END
这样写的好处是在UPDATE AcceptA时不用关联到INSERTED临时表,不会出现超时等无数据反回的情况。另外,请不要使用
SQL codeUPDATE SendB SET Reply=1 OR
UPDATE SendB SET Reply=0如果要用的话,请将我上面的触发器语句用游标来处理。不知道楼主是否要用到批处理SendB呢?上面的回答没有一个涉及了这个问题的。一次更新一条是没有问题的,但一次更新很多条就会出问题哦。
CREATE TRIGGER TR_SendB ON dbo.SendB
FOR UPDATE
NOT FOR REPLICATION --这条记得加上啊,
AS
DECLARE @ID INT
DECLARE @MOBB VARCHAR(50)
DECLARE @State
SET @ID =(SELECT ID FROM INSERTED)
SET @MOBB=(SELECT MOBB FROM INSERTED)
SET @State=(SELECT State FROM INSERTED)
PRINT @ID
PRINT @MOBB
PRINT @StateIF UPDATE (State)
BEGIN
UPDATE AcceptB SET Reply=@State WHERE Accept.ID=@ID AND Accept.MOBB=@MoBB AND Reply<>@State
END
这样写的好处是在UPDATE AcceptA时不用关联到INSERTED临时表,不会出现超时等无数据反回的情况。另外,请不要使用
SQL codeUPDATE SendB SET Reply=1 OR
UPDATE SendB SET Reply=0如果要用的话,请将我上面的触发器语句用游标来处理。不知道楼主是否要用到批处理SendB呢?上面的回答没有一个涉及了这个问题的。一次更新一条是没有问题的,但一次更新很多条就会出问题哦。
请教一下NOT FOR REPLICATION --这条记得加上啊,
这句是什么意思呢
NOT FOR REPLICATION表示当复制进程更改触发器所涉及的表时,不应执行该触发器。
SET @MOBB=(SELECT MOBB FROM INSERTED)
SET @State=(SELECT State FROM INSERTED)可否改为
select @Id=id,@mobb=mobb,@state=state from inserted