Verwenden Sie "WHERE CURRENT OF-Klausel" update nur die bestimmte Zeile auf der der CURSOR positioniert ist in SQL
Habe ich die folgenden cursor in SQL:
DECLARE @Script varchar(max)
DECLARE @getScript CURSOR
SET @getScript = CURSOR FOR
SELECT [Script]
FROM ScriptTable
OPEN @getScript
FETCH NEXT
FROM @getScript INTO @Script
WHILE @@FETCH_STATUS = 0
BEGIN
BEGIN TRY
EXEC(@Script) --Working part. This executes the query stored in the Script column.
--For example INSERT INTO zTest VALUES(VAL1, VAL2, etc etc..)
UPDATE ScriptTable
SET DateDone = GETDATE(), IsDone = 1, Err = NULL
FETCH NEXT
FROM @getScript INTO @Script
END TRY
BEGIN CATCH
DECLARE @Err varchar(max)
SET @Err = ERROR_MESSAGE()
UPDATE ScriptTable
SET DateDone = GETDATE(), Err = @Err
END CATCH
END
CLOSE @getScript
DEALLOCATE @getScript
Q1:
Derzeit bin ich immer die Werte eingefügt in die "zTest" angegebenen Tabelle in meine Kommentare, wenn ich ausführen-EXEC(@Script).
Jedoch der zweite Teil, wo die "Update ScriptTable" ist, updates alle Zeilen in mein Script Tisch. Ich weiß, ich muss zu geben Sie die ID für die entsprechende Zeile, die den cursor bewegen. Die Frage ist, wie kann ich das tun? Ich wan ' T, um nur aktualisieren Sie die entsprechende Zeile, bewegen Sie auf die nächste aktualisieren.
Q2:
Meine nächste Frage ist, in den CATCH-block, ich denke, ich Schaffe eine Endlosschleife, sobald es einen Fehler in einer der Abfragen in der Spalte Script der ScriptTable als wenn ich Blick auf die Ergebnisse, es nur gehen hält und zu gehen. Ich will nicht zu BRECHEN; das Verfahren, wie ich will, zu schreiben, ein Fehler in der Err-Spalte und fahren Sie mit den nächsten Zeilen, bis es das Ende erreicht von @Script, dann stoppen.
IDENT_CURRENT, Scope_Identity usw funktioniert nicht, da ich noch nicht alles eingefügt in das Scripts-Tabelle.
Bitte helfen.
InformationsquelleAutor frans | 2013-09-02
Du musst angemeldet sein, um einen Kommentar abzugeben.
Bezüglich Q1, müssen Sie eine primäre Taste, um den cursor zum updaten (es gibt zwar workarounds).
Im Allgemeinen werden Sie wollen, syntax, so etwas wie dieses:
Bezüglich Q2, dann macht es Sinn, dass es eine unendliche Schleife. Wenn Sie die
TRY
undCATCH
Klauseln und es nicht es nicht führen Sie die syntax in derTRY
"Bereich".Dafür ist der
FETCH NEXT
wird übersprungen und in die nächste Schleife der gleiche Fehler wieder passiert.Versuchen Sie, stellen Sie sicher, es gibt immer ein
FETCH NEXT
in der Schleife.Hoffe das hilft dir ein bisschen.
InformationsquelleAutor Gidil
Hier ist meine Letzte code, falls es jemanden interessiert:
Aber ich verstehe es nicht - wieso bist du nicht mit
WHERE CURRENT OF
statt. Verwenden Sie es in den CATCH-block..!InformationsquelleAutor frans
:
Oder so:
InformationsquelleAutor Tom Hunter