2011-10-27 9 views
0

セットベースの操作の基本を理解しようとしています。私は読んでセットベースの操作は、カーソルのループよりもパフォーマンスがはるかに優れています。カーソルを設定操作に変換するにはどのような手順が必要ですか?あなたは私たちにもう少し詳細をお願いできます:ここで私はSQLトリガー - セットベースの操作でカーソルを変換する

CREATE Trigger DataUpdate ON [Data] 
    FOR UPDATE 
    AS 
     SET NOCOUNT ON 
    BEGIN 
     declare @Id int 
     declare cur cursor for select DataId from Deleted 
     open cur 
     fetch next from c into @Id 
     while @@FETCH_STATUS = 0 
      begin 
      if 
       UPDATE(ID) and 
       UPDATE(Title) or 
       UPDATE(Description)    
      BEGIN 
       update Data 
       set ModDate = getdate() 
       where ID = @Id 
      END 
      fetch next from c into @Id 
      end 
     close cur 
     deallocate cur 
    end 

、別のトリガー

CREATE TRIGGER DataAudit 
     ON [Data] FOR UPDATE 
     AS 

     SET NOCOUNT ON 

    IF UPDATE(ModDate) 
     BEGIN 
      SET NOCOUNT ON 
      DECLARE @ParentId INT 
      DECLARE @ChildId INT 
      DECLARE @Export BIT 

      DECLARE cursorInserted CURSOR FOR 
       select ParentID, ChildID, Export from INSERTED 

      OPEN cursorInserted 

      Fetch next from cursorInserted into @ParentId, @ChildId, @Export 

      WHILE @@FETCH_STATUS = 0 
      BEGIN    
       DECLARE @brief BIT 

       DECLARE cursorBriefcase CURSOR FOR 
       select ShowExport 
        from Sites 
       where SiteID in (select ds.siteid from DataSiteIDs as ds where ChildID = @ChildId) 

       OPEN cursorBriefcase 
       -- Perform the first fetch. 
       FETCH NEXT FROM cursorBriefcase INTO @brief 

       -- Check @@FETCH_STATUS to see if there are any more rows to fetch. 
       WHILE @@FETCH_STATUS = 0 and @brief = 0 
        BEGIN 
         FETCH NEXT FROM cursorBriefcase INTO @brief 
        END 
       CLOSE cursorBriefcase 
       DEALLOCATE cursorBriefcase 

      IF @brief = 0 and 
       @Export = 1 and 
       ((SELECT Distinct ParentID FROM Sites Where ParentID = @ParentId AND (TemplateID = 5 OR TemplateParams = 1)) > 0) and 
       ((Select Distinct ParentID From SubUserGroupIDs Where ParentID = @ParentId) > 0) 
      BEGIN 
       -- Populate the SubAuditItems table with rows on hold 
       INSERT INTO SubAuditItems (ChildID, ParentID, RecordDate, Type, FromTable) 
       VALUES (@ChildId, @ParentId, GETDATE(), 'MOD', 'Data') 
      END 

      Fetch next from cursorInserted into @ParentId, @ChildId, @Export 
      END 
      CLOSE cursorInserted 
      DEALLOCATE cursorInserted  

     END 
+0

http://wiki.lessthandot.com/index.php/Cursors_and_How_to_Avoid_Themアイデア – HLGEM

答えて

0

@Yusufで働いているカップルの例はありますか?達成したいことは何ですか?

CREATETRIGGER [dbo].[UpdateCustomerHistory] 
    ON [dbo].[tblCustomers] 
AFTER DELETE 
AS 

--------------------------------------------------- 
-- Insert the deleted Record in History 
--------------------------------------------------- 
INSERT INTO tblCustomersHistory 
(
    CustomerId, Name, DateCreated 
) 
------ Get deleted row 
SELECT CustomerId, Name, GETDATE() 
FROM DELETED 
+0

ありがとう:、トリガーの本体はようなものになるだろう。基本的には、最初のケースでは、特定のフィールドが更新されたときに、自動的に変更日付を更新したいときに、いくつかの事が欲しいです。これは一度に1つずつ行うことができますが、プロシージャによって複数のアイテムが同時に更新されるような一括更新を処理する必要があります。 2番目のケースでは、複数のテーブルから来る可能性のある条件に基づいて別のテーブルを更新したいと考えています。 – Yusuf

+0

テーブル構造とサンプルデータの詳細を教えてください。 –

0

これは、最初のトリガの体のために行う必要があります:私が正しくあなたの第二の例を解釈している場合は

UPDATE d     
SET ModDate = getdate() 
FROM inserted i 
JOIN data d ON i.id = d.ID 
JOIN deleted del ON i.id = del.id 
WHERE 
    (i.Id <> del.id) 
OR 
    (i.title <> del.title) 
OR 
    (i.description <> del.description) 

を使用すると、表から削除されたレコードを維持したい場合、あなたはそれが好き行うことができます

INSERT INTO SubAuditItems (ChildID, ParentID, RecordDate, Type, FromTable) 
SELECT i.ChildID,i.ParentID, GETDATE(), 'MOD', 'Data' 
FROM INSERTED 
JOIN DataSiteIDs s ON ds.childid = i.childid 
JOIN Sites s ON ds.siteid = s.siteid 
WHERE i.Export = 1 
関連する問題