How to create trigger to insert a value in a column same as value of another column of same table of a newly inserted row in the table.
Suppose I have table like below
ColumnA | ColumnB
I want columnB value to be inserted into ColumnA as soon as row gets inserted into table or columnB value gets updated . But it should not be vice versa ie insert columnA value into columnB
.Below code handles INSERT only , please help me how to handle both Insertion and Updation of table ie when columnB value gets inserted or updated.
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
This works fine if values inserted like below
insert into triggertestTable(columnB) values('xyz')
ColumnB value gets inserted into columnA
ColumnA | ColumnB
xyz | xyz
But null value gets updated in both if some other application inserts value in columnA
insert into triggertestTable(columnA) values('pqr')
Now records are
ColumnA | ColumnB
xyz | xyz
NULL | NULL
The correct recordset should be like below
ColumnA | ColumnB
xyz | xyz
pqr | NULL
How to solve this problem.
Try this trigger (it will copy the values from ColumnB to ColumnA when are inserted values into ColumnB or when are updated the values from 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
I used this table:
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
inserted
is a pseudo-table and may contain multiple rows. You should write something set-based. Something like:
update triggertestTable
set columnA=COALESCE(columnA,columnB)
where id in (select id from inserted)
(If triggertestTable
has a primary key column called id
)
The above sets columnA
to columnB
's value, if columnA
doesn't already have a value, which I think might be what you're looking for.
In your trigger, you have to update ColumnA only if ColumnB is not NULL.
Use the following:
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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With