Hier ist mein Szenario:
Angenommen, ich habe eine gespeicherte Prozedur, in der ich eine andere gespeicherte Prozedur für eine Reihe bestimmter IDs aufrufen muss. Gibt es eine Möglichkeit, dies zu tun?
dh anstatt dies tun zu müssen:
exec p_MyInnerProcedure 4
exec p_MyInnerProcedure 7
exec p_MyInnerProcedure 12
exec p_MyInnerProcedure 22
exec p_MyInnerProcedure 19
So etwas machen:
*magic where I specify my list contains 4,7,12,22,19*
DECLARE my_cursor CURSOR FAST_FORWARD FOR
*magic select*
OPEN my_cursor
FETCH NEXT FROM my_cursor INTO @MyId
WHILE @@FETCH_STATUS = 0
BEGIN
exec p_MyInnerProcedure @MyId
FETCH NEXT FROM my_cursor INTO @MyId
END
Mein Hauptziel hier ist einfach die Wartbarkeit (einfach zu entfernen / IDs hinzuzufügen, wenn sich das Geschäft ändert), in der Lage zu sein, alle IDs in einer einzigen Zeile aufzulisten ... Die Leistung sollte kein so großes Problem sein
sql
sql-server
tsql
John
quelle
quelle
Antworten:
quelle
In diesem Szenario erstelle ich eine Tabellenvariable für die IDs.
- (oder rufen Sie eine andere Tabellenwertfunktion auf, um diese Tabelle zu generieren)
Dann Schleife basierend auf den Zeilen in dieser Tabelle
oder...
Jeder der oben genannten Ansätze ist viel schneller als ein Cursor (deklariert gegenüber regulären Benutzertabellen). Variablen mit Tabellenwerten haben eine schlechte Wiederholung, da sie bei unsachgemäßer Verwendung (für sehr breite Tabellen mit einer großen Anzahl von Zeilen) nicht performant sind. Wenn Sie sie jedoch nur verwenden, um einen Schlüsselwert oder eine 4-Byte-Ganzzahl mit einem Index (wie in diesem Fall) zu speichern, sind sie extrem schnell.
quelle
Verwenden Sie eine statische Cursor-Variable und eine Split-Funktion :
Cursor haben einen schlechten Repräsentanten, da die Standardoptionen, wenn sie für Benutzertabellen deklariert werden, viel Overhead verursachen können.
In diesem Fall ist der Overhead jedoch recht gering, weniger als bei allen anderen Methoden. STATIC weist SQL Server an, die Ergebnisse in tempdb zu materialisieren und dann darüber zu iterieren. Für kleine Listen wie diese ist es die optimale Lösung.
quelle
Sie können wie folgt versuchen:
quelle
@list ='4,7,12,22,19' + ','
folgt machen: - Das ist also völlig klar, dass die Liste mit einem Komma enden muss (ohne funktioniert es nicht!).Normalerweise verwende ich den folgenden Ansatz
quelle
quelle
Stellen Sie mit einer prozeduralen Programmiersprache (hier Python) eine Verbindung zu Ihrer Datenbank her und führen Sie dort die Schleife aus. Auf diese Weise können Sie auch komplizierte Schleifen erstellen.
quelle