Mud*_*san 5 sql sql-server triggers sql-server-2005
如何创建触发器以在列中插入值,该列与表中新插入的行的同一表的另一列的值相同.
假设我有如下表格
ColumnA | ColumnB
我希望一旦将行插入到表中或将columnB值更新,就将columnB值插入ColumnA.但它不应该相反,即将columnA值插入columnB
.下面的代码只处理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
如何解决这个问题呢.
Bog*_*ean 10
尝试此触发器(当将值插入ColumnB或从ColumbB更新值时,它会将值从ColumnB复制到ColumnA):
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
| 归档时间: | 
 | 
| 查看次数: | 48160 次 | 
| 最近记录: |