T-SQL: Cursor-iteration nicht zu stoppen von @@FETCH_STATUS=-1
Habe ich einen einfachen cursor in einer gespeicherten Prozedur. Der cursor einfach durchläuft alle Zeilen einer Tabelle.
Aus meiner Ausgabe scheint es, dass der iterator holt n+1 Zeilen.
Habe ich versucht, ein break die while-Schleife die iteration, aber das löst nicht das Problem.
Wie kommt das?
ALTER PROC spInsertNewCategory --spInsertNewCategory '-1','-1'
@categoryName NVARCHAR(80),
@categoryInfo NVARCHAR(80)
AS
BEGIN
DECLARE @siteLanguage_id INT
DECLARE @lang_id INT
DECLARE @default_siteLanguage INT
DECLARE cr_siteLanguage CURSOR
FOR
SELECT sl.siteLanguage_id, sl.lang_id, sl.default_siteLanguage
FROM siteLanguage sl
OPEN cr_siteLanguage
FETCH NEXT FROM cr_siteLanguage
INTO @siteLanguage_id,@lang_id,@default_siteLanguage
PRINT '@siteLanguage_id: '+ CAST(@siteLanguage_id AS NVARCHAR(3))+' fetch: '+ CAST(@@FETCH_STATUS AS NVARCHAR(5))
WHILE (@@FETCH_STATUS = 0)
BEGIN
IF (@@FETCH_STATUS=-1)
BEGIN
PRINT 'in if -1'
BREAK
END
FETCH NEXT FROM cr_siteLanguage
INTO @siteLanguage_id,@lang_id,@default_siteLanguage
PRINT '@siteLanguage_id: '+ CAST(@siteLanguage_id AS NVARCHAR(3))+' fetch: '+ CAST(@@FETCH_STATUS AS NVARCHAR(5))
END
CLOSE cr_siteLanguage
DEALLOCATE cr_siteLanguage
SELECT * FROM siteLanguage
END
- Warum einmal die Mühe mit einem cursor für diese? Scheint ziemlich einfach - nur mit einem richtigen set-basierte Ansatz und mit ihm getan werden. Es wird viel schneller laufen, und Sie nicht zu verwirren haben, um mit
@@FETCH_STATUS
und so ein Zeug .... - Das ist einfach nur testen Sie den cursor fucntionality, ich bin nicht eine cursor-fan, aber ich habe einen Fall, in dem der cursor ist meine beste option (ja, ich bin umarmt die Dunkle Seite). Speziell für die code-Wartung. Der performance-Aspekt ist irrelevant, da die cursor-code zum Durchlaufen ca 100 Zeilen einmal im Monat. Ich bin mit diesem code für die site-Konfiguration/Wartung. Und ja, wie Sie sagten, set-basierten Ansatz ist die Art, wie Dinge getan werden sollte, in sql.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ja, es ist halt an @@FETCH_STATUS=-1
Das ist, warum Sie nicht sehen, Ihr PRINT', wenn -1'
Auf der letzten FETCH @@FETCH_STATUS=-1 und beendet die WHILE (@@FETCH_STATUS = 0)
Nein, es nicht zu Holen n+1 Zeilen.
Auf n+1 ist, wenn es weiß, gibt es keine weiteren Zeilen mehr.
Der cursor wird nicht wissen, Wann es an der letzten Zeile - es weiß nur, wenn keine weiteren Zeilen vorhanden sind (n+1)
Das ist der Grund, warum du da die erste Zeile vor die Schleife
Drucken Sie nach der FETCH innerhalb der Schleife
So erhalten Sie das endgültige -1
Dann fällt es aus der WHILE (@@FETCH_STATUS = 0)
Es laufen im debug und Uhr
Scheint es, dass
IF (@@FETCH_STATUS=-1)
wird nie ausgeführt werden, wenn @@FETCH_STATUS=-1,Prüfen Sie den Wert von @@FETCH_STATUS sofort nach Eintritt in die Schleife,
hat eine WO Klausel (@@FETCH_STATUS = 0).
wahrscheinlich könnte man überprüfen, nachdem Sie die FETCH NEXT stmt innerhalb der Schleife.
Hinweis: ich übernehmen die erste FETCH NEXT stmt (sofort nach dem ÖFFNEN cr_siteLanguage), tut Datensätze abrufen.