1

我有一个触发器,MyTrigger,我想让它只更改 TABLEA 中最近插入的行的描述字段 [描述]。如图所示,我有它的基础知识,但它目前只会扫描整个表以查找 TABLEA 上的每个 INSERT。

触发器在下方............

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TRIGGER MyTrigger  
   ON  TABLEA
   AFTER INSERT
AS 
BEGIN

SET NOCOUNT ON;

UPDATE TABLEA
SET [DESCRIPTION] = REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE([DESCRIPTION], '…' , '...'),'–','-'),'’',''''),'½','1/2'),'•','+'),'”','"'),'“','"'),'‘',''''),'—','-'),'é','e')
WHERE  DESCRIPTION LIKE '%…%' 
    OR DESCRIPTION LIKE '%–%'
    OR DESCRIPTION LIKE '%’%'
    OR DESCRIPTION LIKE '%’%'
    OR DESCRIPTION LIKE '%’%'
    OR DESCRIPTION LIKE '%½%'
    OR DESCRIPTION LIKE '%•%'
    OR DESCRIPTION LIKE '%”%'
    OR DESCRIPTION LIKE '%“%'
    OR DESCRIPTION LIKE '%‘%'
    OR DESCRIPTION LIKE '%—%'
    OR DESCRIPTION LIKE '%é%'

END
GO
4

4 回答 4

2

I would suggest doing this in an INSTEAD OF trigger, thus only actually performing one DDL action against the table (you can also ignore the WHERE clause here and just apply the replace calls to everything in inserted).

DROP TRIGGER MyTrigger ON TABLEA;
GO

CREATE TRIGGER dbo.MyTrigger  
   ON  TABLEA
   INSTEAD OF INSERT
AS 
BEGIN
  SET NOCOUNT ON;

  INSERT TABLEA(col1, col2, ..., Description)
    SELECT col1, col2, ...,
    REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
    REPLACE(REPLACE(REPLACE([DESCRIPTION], '…' , '...'),'–','-'),'’','''')
    ,'½','1/2'),'•','+'),'”','"'),'“','"'),'‘',''''),'—','-'),'é','e')
    FROM inserted;
END
GO
于 2012-05-17T20:21:36.703 回答
1

为什么您不使用INSERTEDAND之类的表,DELETED而不是扫描整个表并更新最后一条记录....

检查这个:使用插入和删除的表

于 2012-05-17T19:27:23.687 回答
1

我会使用该表并不使用inserted触发器(示例如下)。INSTEAD OFAFTER

SET NOCOUNT ON;

DECLARE     @temp       table   --temp table that can be modified
(
    Column1
    , Column1
    , Column1
    , [DESCRIPTION]     --this table should mimic your TABLEA schema
)

INSERT INTO @temp
SELECT      *
FROM        inserted

UPDATE @temp
SET [DESCRIPTION] = REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE([DESCRIPTION], '…' , '...'),'–','-'),'’',''''),'½','1/2'),'•','+'),'”','"'),'“','"'),'‘',''''),'—','-'),'é','e')
WHERE  DESCRIPTION LIKE '%…%' 
    OR DESCRIPTION LIKE '%–%'
    OR DESCRIPTION LIKE '%’%'
    OR DESCRIPTION LIKE '%’%'
    OR DESCRIPTION LIKE '%’%'
    OR DESCRIPTION LIKE '%½%'
    OR DESCRIPTION LIKE '%•%'
    OR DESCRIPTION LIKE '%”%'
    OR DESCRIPTION LIKE '%“%'
    OR DESCRIPTION LIKE '%‘%'
    OR DESCRIPTION LIKE '%—%'
    OR DESCRIPTION LIKE '%é%'


INSERT INTO TABLEA
            (
                Column1
                , Column1
                , Column1
                , [DESCRIPTION]
            )
SELECT      Column1
            , Column1
            , Column1
            , [DESCRIPTION]
FROM        @temp

END
GO
于 2012-05-17T19:31:02.030 回答
0

请参考代码中的最后一行 - 使用表的唯一标识符/(主键?)更改标识符。

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TRIGGER MyTrigger  
   ON  TABLEA
   AFTER INSERT
AS 
BEGIN

SET NOCOUNT ON;

UPDATE TABLEA
SET [DESCRIPTION] = REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE([DESCRIPTION], '…' , '...'),'–','-'),'’',''''),'½','1/2'),'•','+'),'”','"'),'“','"'),'‘',''''),'—','-'),'é','e')
WHERE  (DESCRIPTION LIKE '%…%' 
    OR DESCRIPTION LIKE '%–%'
    OR DESCRIPTION LIKE '%’%'
    OR DESCRIPTION LIKE '%’%'
    OR DESCRIPTION LIKE '%’%'
    OR DESCRIPTION LIKE '%½%'
    OR DESCRIPTION LIKE '%•%'
    OR DESCRIPTION LIKE '%”%'
    OR DESCRIPTION LIKE '%“%'
    OR DESCRIPTION LIKE '%‘%'
    OR DESCRIPTION LIKE '%—%'
    OR DESCRIPTION LIKE '%é%')
    AND EXISTS (SELECT * FROM Inserted i WHERE i.Identifier = TableA.Identifier)

END
GO
于 2012-05-17T19:40:06.207 回答