2016-08-08 9 views
0

Ich habe folgende Cursor-Code in einem Trigger 5 Aufzeichnungen arbeitet jede Stunde in eine neue Tabelle Cursor zu bewegen fein unabhängig, aber wenn in Trigger es funktioniert nicht. TableA wird vor jedem Laden abgeschnitten.Cursor in einem Trigger nicht wie erwartet funktionieren

meine Cursor Logik

Declare @a[varchar](50),@b[varchar](50),@c[varchar](50),@d[varchar](50),@e[varchar](50) 
-- declare a cursor 
DECLARE insert_cursor CURSOR FOR 
SELECT [a] 
     ,[b] 
     ,[c] 
     ,[d] 
     ,[e] 
     FROM TableA 

-- open cursor and fetch first row into variables 
OPEN insert_cursor 
FETCH NEXT FROM insert_cursor into @a,@b,@c,@d,@e 

-- check for a new row 
WHILE @@FETCH_STATUS=0 
BEGIN 
-- do complex operation here 
Insert into TableB 
SELECT @a,@b,@c,@d,@e 
-- get next available row into variables 
FETCH NEXT FROM insert_cursor into @a,@b,@c,@d,@e 
END 
close insert_cursor 
Deallocate insert_cursor 

Mein Cursor in Trigger-Code:

CREATE TRIGGER IO_ABC_INSERT ON TABLEA 
INSTEAD OF INSERT 
AS 
BEGIN 
    Declare @a[varchar](50),@b[varchar](50),@c[varchar](50),@d[varchar](50),@e[varchar](50) 
-- declare a cursor 
DECLARE insert_cursor CURSOR FOR 
SELECT [a] 
     ,[b] 
     ,[c] 
     ,[d] 
     ,[e] 
     FROM TableA 

-- open cursor and fetch first row into variables 
OPEN insert_cursor 
FETCH NEXT FROM insert_cursor into @a,@b,@c,@d,@e 

-- check for a new row 
WHILE @@FETCH_STATUS=0 
BEGIN 
-- do complex operation here 
Insert into TableB 
SELECT @a,@b,@c,@d,@e 
-- get next available row into variables 
FETCH NEXT FROM insert_cursor into @a,@b,@c,@d,@e 
END 
close insert_cursor 
Deallocate insert_cursor 
END 

Kann jemand mir zeigen, wo genau ich falsch tue?

+0

Ein Cursor ist in der Regel eine schlechte Idee, in einem Trigger ist es Ereignis Schlimmste. Außerdem ist Ihr Trigger ein Insert-Trigger, was bedeutet, dass keine Zeilen in die Tabelle eingefügt werden, es sei denn, Sie fügen sie in den Trigger selbst ein. –

+0

Ich verstehe, aber nur für 5 Zeilen jede Stunde so dachte, dieser Prozess wäre gut alle Hinweise für jede andere Art wird sehr geschätzt. – Zack

+0

Erstens passt diese Art von Task einem geplanten Job besser als einem Trigger. Zweitens müssen Sie herausfinden, welche fünf Datensätze Sie zuerst kopieren möchten. Ihr aktueller Code nimmt nur alle Datensätze aus TabelleA und fügt sie einzeln in TabelleB ein. –

Antwort

1

Sie sind nicht von TableA eingefügt Tabelle auswählen, was bedeutet, Sie alle Tabellenwerte von TableA für jeden Einsatz auf TableA in TableB einfügen

Sie Ihre Trigger auf Ihren Code setbased..Instead des Einsatzes ändern könnte bedeutet ..

Wenn der Einsatz geschieht auf TableA Einsatz in TableB ... Es wird keine Einsätze in tableA sein..

Ihren Code zu ändern, um unten für Satz basiert ..

CREATE TRIGGER IO_ABC_INSERT ON TABLEA 
INSTEAD OF INSERT 
AS 
BEGIN 

Insert into TableB 
select a,b,c,d,e from Inserted 

End 
+0

Ich habe versucht, Inserted als auch das Ergebnis ist das gleiche. – Zack

+0

was erwarten Sie, .. Was meinst du nicht funktioniert ..? Wollen Sie Werte von TableA in TableB 5 zufällige Werte jede Stunde ein, wenn Einsatz auf der A @TheGameiswar – TheGameiswar

+0

Ja geschieht, was bedeutete, dass ich so nicht funktioniert, wenn überhaupt Ich füge neue Werte in TableA ein, die nicht in TableB eingefügt werden. – Zack

Verwandte Themen