如何创建触发器以在列中插入值,该值与表中新插入行的同一表的另一列的值相同。
假设我有如下表格
ColumnA | ColumnB
我希望只要将行插入表或columnB值更新就将columnB值插入ColumnA。但它不应该相反,即将columnA值插入columnB
.Below代码只处理INSERT,请帮助我如何处理表的插入和更新,即插入或更新columnB值时。
CREATE TRIGGER inserupdate
ON triggertestTable
AFTER INSERT,UPDATE
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
-- Insert statements for trigger here
declare @value int
select @value=columnB from inserted
update triggertestTable
set columnA=@value
END
GO
如果值插入如下
,这可以正常工作insert into triggertestTable(columnB) values('xyz')
将ColumnB值插入columnA
ColumnA | ColumnB
xyz | xyz
但是如果某个其他应用程序在columnA
中插入值,则null值会更新 insert into triggertestTable(columnA) values('pqr')
现在记录
ColumnA | ColumnB
xyz | xyz
NULL | NULL
正确的记录集应如下所示
ColumnA | ColumnB
xyz | xyz
pqr | NULL
如何解决这个问题。
答案 0 :(得分:10)
尝试此触发器(当将值插入Column或从ColumbB更新值时,它会将值从列复制到列):
CREATE TRIGGER trgIU_triggertestTable_UpdateColumnAWhenColumnB
ON dbo.triggertestTable
AFTER INSERT,UPDATE
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
IF UPDATE(ColumnB)
BEGIN
UPDATE dbo.triggertestTable
SET ColumnA=i.ColumnB
FROM inserted i
INNER JOIN dbo.triggertestTable t ON i.MyID=t.MyID
LEFT JOIN deleted d ON i.MyID=d.MyID
WHERE d.MyID IS NULL AND i.ColumnB IS NOT NULL -- Row was inserted
OR d.MyID IS NOT NULL -- Row was updated
END
END
GO
我用过这张表:
CREATE TABLE dbo.triggertestTable(
MyID INT IDENTITY(1,1) PRIMARY KEY, -- MyID should be a PRIMARY KEY or a mandatory(NOT NULL) UNIQUE constraint
ColumnA VARCHAR(100),
ColumnB VARCHAR(100)
);
GO
答案 1 :(得分:2)
inserted
是一个伪表,可能包含多个行。你应该写一些基于集合的东西。类似的东西:
update triggertestTable
set columnA=COALESCE(columnA,columnB)
where id in (select id from inserted)
(如果triggertestTable
有一个名为id
的主键列
以上设置columnA
到columnB
的值,如果columnA
还没有值,我认为这可能就是您要找的内容。
答案 2 :(得分:0)
您是否尝试过以下操作:
update triggertestTable
set columnA=@value
where columnB is not NULL
答案 3 :(得分:0)
在触发器中,只有在Column不为NULL时才必须更新Column。
使用以下内容:
CREATE TRIGGER inserupdate
ON triggertestTable
AFTER INSERT,UPDATE
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
-- Insert statements for trigger here
declare @id1 int
select @value=columnB from inserted
if @value is not null
begin
update triggertestTable
set columnA=@value
end
END
GO