1

トリガーMyTriggerがあります。これは、TABLEAに最近挿入された行のDESCRIPTIONフィールド[Description]のみを変更するようにします。示されているように、私はそれの基本を持っていますが、現在、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

これをOFトリガーで実行することをお勧めしますINSTEAD。したがって、実際にはテーブルに対して1つのDDLアクションのみを実行します(WHEREここでの句を無視して、のすべてに置換呼び出しを適用することもできます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 OFませんAFTER(例は次のとおりです)。

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 に答える