Freigeben über


Verwenden von T-SQL-Schleifen für dedizierte SQL-Pools in Azure Synapse Analytics

Dieser Artikel enthält Tipps für die dedizierte Entwicklung von SQL-Poollösungen mithilfe von T-SQL-Schleifen und Ersetzen von Cursorn.

Zweck von WHILE-Schleifen

Dedizierte SQL-Pools in Azure Synapse unterstützen die WHILE-Schleife für wiederholt ausgeführte Anweisungsblöcke. Diese WHILE-Schleife wird so lange fortgesetzt, wie die angegebenen Bedingungen wahr sind oder bis der Code die Schleife mit dem SCHLÜSSELwort BREAK spezifisch beendet.

Schleifen eignen sich zum Ersetzen von Cursorn, die in SQL-Code definiert sind. Glücklicherweise sind fast alle Cursor, die per SQL-Code geschrieben werden, schreibgeschützte Cursor für den schnellen Vorlauf. So sind WHILE-Schleifen eine großartige Alternative zum Ersetzen von Cursorn.

Ersetzen von Cursorn im dedizierten SQL-Pool

Bevor Sie jedoch vorschnell handeln, sollten Sie sich die folgende Frage stellen: "Könnte dieser Cursor umgeschrieben werden, um set-basierte Operationen zu verwenden?"

In vielen Fällen ist die Antwort ja und ist häufig der beste Ansatz. Satzbasierte Operationen werden häufig schneller ausgeführt als ein iterativer Ansatz Zeile für Zeile.

Nur-Lese-Cursor für den schnellen Vorlauf können leicht durch ein Schleifenkonstrukt ersetzt werden. Das folgende Beispiel ist ein einfaches Beispiel. In diesem Codebeispiel werden die Statistiken für jede Tabelle in der Datenbank aktualisiert. Durch das Iterieren über die Tabellen in der Schleife wird jeder Befehl nacheinander ausgeführt.

Erstellen Sie zunächst eine temporäre Tabelle mit einer eindeutigen Zeilennummer, mit der die einzelnen Anweisungen identifiziert werden:

CREATE TABLE #tbl
WITH
( DISTRIBUTION = ROUND_ROBIN
)
AS
SELECT  ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) AS Sequence
,       [name]
,       'UPDATE STATISTICS '+QUOTENAME([name]) AS sql_code
FROM    sys.tables
;

Initialisieren Sie als Nächstes die Variablen, die zum Durchführen des Schleifenvorgangs erforderlich sind:

DECLARE @nbr_statements INT = (SELECT COUNT(*) FROM #tbl)
,       @i INT = 1
;

Jetzt können Sie die Anweisungen per Schleife durchlaufen und einzeln ausführen:

WHILE   @i <= @nbr_statements
BEGIN
    DECLARE @sql_code NVARCHAR(4000) = (SELECT sql_code FROM #tbl WHERE Sequence = @i);
    EXEC    sp_executesql @sql_code;
    SET     @i +=1;
END

Legen Sie schließlich die temporäre Tabelle ab, die im ersten Schritt erstellt wurde.

DROP TABLE #tbl;

Nächste Schritte

Weitere Hinweise zur Entwicklung finden Sie in der Entwicklungsübersicht.