MS-SQL T-SQL: verschachtelte Cursor
Hallo @all,
ich brauche mal wieder das Schwarmwissen, da ich den Wald vor lauter Bäumen, und so...
Ausgang: MS-SQLServer-Express V 11.00.7507
Problem:
Ich habe einen Cursor <curAuftrag1> (Forward Only)
Dieser wird durchlaufen und mit jeder "Runde" wird ein zweiter Cursor <curAdressen> erstellt (Forwar Only).
Dieser wird ebenfalls durchlaufen und jeder Datensatz von <curAdressen> dann per INSERT an die Tabelle <Adressdaten> angehangen.
Beispiel:
Ich weis, dass eines der Probleme im <@@Fetch_Status> liegt.
Wie kann ich diese "Verschachtelung" lösen ?
Danke schon mal im Voraus😊
ich brauche mal wieder das Schwarmwissen, da ich den Wald vor lauter Bäumen, und so...
Ausgang: MS-SQLServer-Express V 11.00.7507
Problem:
Ich habe einen Cursor <curAuftrag1> (Forward Only)
Dieser wird durchlaufen und mit jeder "Runde" wird ein zweiter Cursor <curAdressen> erstellt (Forwar Only).
Dieser wird ebenfalls durchlaufen und jeder Datensatz von <curAdressen> dann per INSERT an die Tabelle <Adressdaten> angehangen.
Beispiel:
CREATE PROCEDURE [dbo].[uspCheckAdressenGewicht]
@Produktionsvariante int,
@Ausgabe varchar(25)
AS
BEGIN
SET NOCOUNT ON;
DECLARE @AuftragsDetailId BIGINT
DECLARE @VerlagsID INT
DECLARE @EinzelGewicht INT
DECLARE @AdressID BIGINT
DECLARE @HeftAnzahl INT
DECLARE @LKZ NVARCHAR(3)
DECLARE curAuftrag CURSOR FORWARD_ONLY
FOR
SELECT AuftragsDetailId, VerlagsID, EinzelGewicht
FROM AuftragsDetail
WHERE ProduktionsVariantenid=@Produktionsvariante AND Ausgabe=@Ausgabe
OPEN curAuftrag
FETCH NEXT FROM curAuftrag INTO @AuftragsDetailId, @VerlagsID, @EinzelGewicht
WHILE @@FETCH_STATUS = 0
BEGIN
-- Für jede AuftragsID für die Ausgabe die Adressen zu den Adressen ermitteln
DECLARE curAdressen CURSOR FORWARD_ONLY
FOR
SELECT Counter AS AdressID, HeftAnzahl, LKZ
FROM Adressdaten
WHERE (AusgabeID = @AuftragsDetailId)
AND (LKZ IN (SELECT LKZ FROM [dbo].[GewichtsGrenzeVersandFuerLKZ]));
OPEN curAdressen
FETCH NEXT FROM curAdressen INTO @AdressID, @HeftAnzahl, @LKZ
WHILE @@FETCH_STATUS = 0
BEGIN
--- Hier steht dann das INSERT-Statement in die Tabelle <Adressdaten>
END -- Durch alle Adressen itterieren
CLOSE curAdressen
DEALLOCATE curAdressen
END -- Durch alle AuftragsID itterieren
CLOSE curAuftrag
DEALLOCATE curAuftrag
END
Wie kann ich diese "Verschachtelung" lösen ?
Danke schon mal im Voraus😊
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 673030
Url: https://administrator.de/forum/ms-sql-t-sql-verschachtelte-cursor-673030.html
Ausgedruckt am: 27.05.2025 um 18:05 Uhr
6 Kommentare
Neuester Kommentar
Moin,
Das dürfte am Ende vermutlich auch performanter sein!?
Meine Erfahrungen mit Cursorn sind begrenzt weil ich sie fast nie brauche 
Ich ebensowenigWieso arbeitest du in diesem Fall mit einem Cursor, ginge nicht auch einfach ein ordentliches Insert auf Basis eines Selects?
Ich hätte bei dem, was ich da so rauslese(n kann) behauptet, dass ein JOIN (ob nun LEFT, RIGHT oder INNER musst du entscheiden) hilft, um dann ein INSERT INTO durchzuführen.Das dürfte am Ende vermutlich auch performanter sein!?
Zitat von @em-pie:
Ich hätte bei dem, was ich da so rauslese(n kann) behauptet, dass ein JOIN (ob nun LEFT, RIGHT oder INNER musst du entscheiden) hilft, um dann ein INSERT INTO durchzuführen.
Das dürfte am Ende vermutlich auch performanter sein!?
Ich hätte bei dem, was ich da so rauslese(n kann) behauptet, dass ein JOIN (ob nun LEFT, RIGHT oder INNER musst du entscheiden) hilft, um dann ein INSERT INTO durchzuführen.
Das dürfte am Ende vermutlich auch performanter sein!?
Hatte ich vor langen mal mit Cursorn. Idee war eig. das man es über Systemtabellen o.ä. lauf lässt und dann bestimmte Dinge aulöst. DB Backup geht ja auch.
https://www.mssqltips.com/sqlservertip/1599/cursor-in-sql-server/
Backup. Collation umstellen? Ich weiss nicht mehr wofür ich es damals genommen hab. Idee ist halt wie beim manuellen Prozeß: ich gehen was durch und führe Aktion aus.
INSERT reicht da teils nicht aus. EXEC irgendwas.
Ich weiß nur noch, dass es bei Schleifen Probleme gab. Entweder fehlt eins und ein Element wurde doppel verwurstet. Da gab es auch einen "Fix" um immer unique Ergenisse zu haben.
Lange her bei mir.
Manuell oder Debug wenn ich fragen darf? Alte SQL Server war ja easy. Bei den neuen muss man sich ja teils mit Visual Studio verbinden. Ist es ein remote Server, muss der Server Dienst unter dem jeweiigen User laufen, damit man Werte erhält. Hatte ich bis dato nur einmal gemacht.
Bei lokaler Installatioin fällt das ja weg. Normal hätte dir doch dann das Studio den Fehler anzeigen müssen - Thrown Exception....