2017-12-15 5 views
-1

私はトリガーについて学んでいます。 UPDATEアクションに応答するトリガーを作成しているとします。この更新アクションが1行にしか影響しない場合は、のINSERTEDテーブルに行が含まれているため、簡単に処理できます。しかし、私の更新アクションが複数の行に影響を及ぼす場合、INSERTEDテーブルには複数の行が含まれます。この時点で、CURSORを使用して、INSERTEDテーブルのすべての行を参照してデータを処理する必要があります。しかし、CURSORを使用すると、表に複数の行がある場合はシステムの速度が低下します。 挿入したテーブルのすべての行を参照する方法はありますかCURSOR?私はグーグルではありますが、文法が間違っていれば、結果は得られず残念です。みんなありがとう!SQLのテーブルにカーソルを置かずにすべてのレコードを参照してください

+0

はい、挿入された仮想テーブルを他のものと同様に使用して、セットベースの操作を実行できます。助けが必要な場合は、カーソルコードを追加してください。 –

+0

これはあまりにも幅広く閉じられている可能性があります。トリガーではセットベースのロジックを使用し、可能であればカーソルを避けるべきです。 –

+0

テーブルの構造やカーソルの中でどのような操作をしているかなど、詳細をいくつか追加してください。 –

答えて

0

一つのアプローチは、更新可能CTE

CREATE TABLE dbo.tmp(ID INT IDENTITY,SomeValue VARCHAR(100),TestColumn VARCHAR(100)); 
GO 

CREATE TRIGGER dbo.testTrigger On dbo.tmp 
FOR INSERT, UPDATE 
AS 
BEGIN 
    WITH UpdateableCTE AS 
    (
     SELECT i.SomeValue AS newValue 
       ,t.TestColumn AS oldValue 
     FROM inserted AS i 
     INNER JOIN dbo.tmp AS t ON t.ID=i.ID 
    ) 
    UPDATE UpdateableCTE 
    SET oldValue = newValue 
END 
GO 

INSERT INTO dbo.tmp(SomeValue) VALUES('test1'),('test2'),('test3'); 
SELECT * FROM dbo.tmp; 
INSERT INTO dbo.tmp(SomeValue) VALUES('one more') 
SELECT * FROM dbo.tmp; 
UPDATE dbo.tmp SET SomeValue='blah' WHERE ID <= 2; 
SELECT * FROM dbo.tmp; 

これは構文参加シンプルな砂糖が、読み優れています。

関連する問題