5

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

假设我有如下表

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 中插入值,则两者都会更新空值

 insert into triggertestTable(columnA) values('pqr')

现在记录是

ColumnA | ColumnB
  xyz   |  xyz 
  NULL  |  NULL

正确的记录集应该如下所示

  ColumnA   | ColumnB
      xyz   |  xyz 
      pqr   |  NULL

如何解决这个问题呢。

4

4 回答 4

11

试试这个触发器(当将值插入 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
于 2013-07-25T15:12:25.663 回答
2

inserted是一个伪表,可能包含行。你应该写一些基于集合的东西。就像是:

 update triggertestTable
    set columnA=COALESCE(columnA,columnB)
where id in (select id from inserted)

(如果triggertestTable有一个名为 的主键列id

以上设置columnAcolumnB' 值,如果columnA还没有值,我认为这可能是您正在寻找的。

于 2013-07-25T14:41:40.543 回答
1

在您的触发器中,只有当 ColumnB 不为 NULL 时,您才必须更新 ColumnA。

使用以下内容:

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
于 2013-07-25T14:28:58.160 回答
0

您是否尝试过以下方法:

    update triggertestTable
    set columnA=@value
    where columnB is not NULL
于 2013-07-25T14:28:30.247 回答