创建触发器以将列值插入到同一表SQL Server 2005的其他列中

Mud*_*san 5 sql sql-server triggers sql-server-2005

如何创建触发器以在列中插入值,该列与表中新插入的行的同一表的另一列的值相同.

假设我有如下表格

ColumnA | ColumnB
Run Code Online (Sandbox Code Playgroud)

我希望一旦将行插入到表中或将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
Run Code Online (Sandbox Code Playgroud)

如果插入的值如下所示,这可以正常工作

insert into triggertestTable(columnB) values('xyz')
Run Code Online (Sandbox Code Playgroud)

ColumnB值插入columnA

ColumnA | ColumnB
  xyz   |  xyz 
Run Code Online (Sandbox Code Playgroud)

但是如果某个其他应用程序在columnA中插入值,则null值会更新

 insert into triggertestTable(columnA) values('pqr')
Run Code Online (Sandbox Code Playgroud)

现在的记录是

ColumnA | ColumnB
  xyz   |  xyz 
  NULL  |  NULL
Run Code Online (Sandbox Code Playgroud)

正确的记录集应如下所示

  ColumnA   | ColumnB
      xyz   |  xyz 
      pqr   |  NULL
Run Code Online (Sandbox Code Playgroud)

如何解决这个问题呢.

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
Run Code Online (Sandbox Code Playgroud)

我用这个表:

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
Run Code Online (Sandbox Code Playgroud)