日期:2014-05-18  浏览次数:20734 次

触发器 IF NOT EXISTS 应用困惑
SQL code

if OBJECT_ID('tb')is not null
drop table tb
go
create table tb
(ID varchar(2),商品 char(20),条码 char(20),金额 int,新上架 char(2))
insert into tb values ('1','洗发水','0124578104','20','')

CREATE TRIGGER [tb-update] ON [dbo].[tb]   
FOR INSERT 
AS  
DECLARE   @ID VARCHAR(2)                     
BEGIN   
SELECT @ID=ID  FROM INSERTED   
-- 当商品在tb表中不存在时,更新 新上架 字段
-- 行级触发器,只更新 新增行数据 
IF  not EXISTS  (SELECT  A.商品 FROM INSERTED A INNER JOIN tb B ON A.商品=B.商品)  
UPDATE tb SET 新上架='是' FROM tb   WHERE  @ID=ID  
END
COMMIT      


请教各位大神,为啥我现在在本地测试插入新行,新上架字段不会更新呢!
到底是哪里逻辑出了问题呢!
是NOT EXISTS 用的不对么?

------解决方案--------------------
SQL code

create table tb
(ID varchar(2),商品 char(20),条码 char(20),金额 int,新上架 char(2))
go

CREATE TRIGGER [tb-update] ON [dbo].[tb]   
instead of INSERT 
AS
begin
DECLARE   @ID VARCHAR(2)                     
BEGIN   
SELECT @ID=ID  FROM INSERTED   
-- 当商品在tb表中不存在时,更新 新上架 字段
-- 行级触发器,只更新 新增行数据 
IF  not EXISTS  (SELECT 1 FROM INSERTED A INNER JOIN tb B ON A.商品=B.商品)  
insert into tb select ID,商品,条码,金额,'是' FROM INSERTED WHERE  @ID=ID  
else
insert into tb select * from inserted
END
end
go

--test

select * from tb
insert into tb values ('1','洗发水','0124578104','20','')

--select

select * from tb

drop TRIGGER [tb-update]
drop table tb

/****************************

ID   商品                   条码                   金额          新上架
---- -------------------- -------------------- ----------- ----
1    洗发水                  0124578104           20          是

(1 行受影响)

****************************/

------解决方案--------------------
SQL code
if OBJECT_ID('tb')is not null
drop table tb
go
create table tb
(ID varchar(2),商品 char(20),条码 char(20),金额 int,新上架 char(2))
if OBJECT_ID('[tb-update]','TR')is not null drop trigger [tb-update]
go
CREATE TRIGGER [tb-update] ON [dbo].[tb]   
FOR INSERT 
AS  
DECLARE   @ID VARCHAR(2)                     
BEGIN   
SELECT @ID=ID  FROM INSERTED   
-- 当商品在tb表中不存在时,更新 新上架 字段
-- 行级触发器,只更新 新增行数据 

IF  not EXISTS  (SELECT  A.商品 FROM INSERTED A INNER JOIN tb B ON A.商品=B.商品 and a.id!=b.id) /*加上id*/ 
UPDATE tb SET 新上架='是' FROM tb   WHERE  @ID=ID  
END

insert into tb values ('1','洗发水','0124578104','20','')

select * from tb
/*
ID   商品                   条码                   金额          新上架
---- -------------------- -------------------- ----------- ----
1    洗发水                  0124578104           20          是

(1 行受影响)


*/