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

Schreibe einen Kommentar