EXECUTE IMMEDIATE FROM¶
EXECUTE IMMEDIATE FROM führt die in einer Datei angegebenen SQL-Anweisungen in einem Stagingbereich aus. Die Datei kann SQL-Anweisungen oder Snowflake Scripting-Blöcke enthalten. Bei den Anweisungen muss es sich um syntaktisch korrekte SQL-Anweisungen handeln.
Sie können den Befehl EXECUTE IMMEDIATE FROM verwenden, um die Anweisungen in einer Datei von einer beliebigen Snowflake-Sitzung aus auszuführen.
Dieses Feature bietet einen Mechanismus zur Steuerung der Bereitstellung und Verwaltung Ihrer Snowflake-Objekte und Ihres Codes. Sie können zum Beispiel ein gespeichertes Skript ausführen, um eine Standard-Snowflake-Umgebung für alle Ihre Konten zu erstellen. Das Konfigurationsskript kann Anweisungen enthalten, die Benutzer, Rollen, Datenbanken und Schemas für jedes neue Konto erstellen.
Erstellen von Jinja2-Vorlagen¶
EXECUTE IMMEDIATE FROM kann auch eine Vorlagendatei mit der Jinja2-Vorlagensprache ausführen. Eine Vorlage kann Variablen und Ausdrücke enthalten, die die Verwendung von Schleifen, Bedingungen, Variablenersetzungen, Makros und mehr ermöglichen.
Weitere Informationen zur Vorlagensprache finden Sie in der Jinja2-Dokumentation.
Die auszuführende Vorlagendatei muss folgende Voraussetzungen erfüllen:
Ist eine syntaktisch gültige Jinja2-Vorlage.
Befindet sich in einem Stagingbereich oder Git-Repository.
Ist in der Lage, syntaktisch gültige SQL-Anweisungen zu rendern.
Die Verwendung von Vorlagen ermöglicht flexiblere Kontrollstrukturen und ermöglicht die Parametrisierung mithilfe von Umgebungsvariablen. Sie können zum Beispiel eine Vorlage verwenden, um das Bereitstellungsziel der im Skript definierten Objekte dynamisch auszuwählen. Um eine Vorlage zum Rendern eines SQL-Skripts zu verwenden, verwenden Sie die Vorlagenrichtlinie oder fügen Sie eine USING-Klausel mit mindestens einer Vorlagenvariablen hinzu.
Vorlagenrichtlinie¶
Sie können eine der beiden Vorlagenrichtlinien verwenden.
Die empfohlene Richtlinie verwendet eine gültige SQL-Syntax:
--!jinja
Optional können Sie auch die alternative Richtlinie verwenden:
#!jinja
Bemerkung
Nur eine Byte-Reihenfolgemarke und bis zu 10 Leerzeichen (Zeilenumbrüche, Tabulatoren, Leerzeichen) dürfen der Richtlinie vorangestellt werden. Alle Zeichen, die nach der Richtlinie in der gleichen Zeile stehen, werden ignoriert.
- Siehe auch:
Syntax¶
EXECUTE IMMEDIATE
FROM { absoluteFilePath | relativeFilePath }
[ USING ( <key> => <value> [ , <key> => <value> [ , ... ] ] ) ]
Wobei:
absoluteFilePath ::= @[ <namespace>. ]<stage_name>/<path>/<filename>relativeFilePath ::= '[ / | ./ | ../ ]<path>/<filename>'
Erforderliche Parameter¶
Absoluter Dateipfad (absoluteFilePath
)¶
namespace
Datenbank und/oder Schema, in dem sich der interne oder externe Stagingbereich befindet, im Format
database_name.schema_name
oderschema_name
. Der Namespace ist optional, wenn in der Benutzersitzung aktuell eine Datenbank und ein Schema verwendet werden. Andernfalls ist er erforderlich.stage_name
Name des internen oder externen Stagingbereichs.
path
Pfad zu der Datei im Stagingbereich mit Unterscheidung von Groß-/Kleinschreibung.
filename
Name der auszuführenden Datei. Er muss syntaktisch korrekte und gültige SQL-Anweisungen enthalten. Jede Anweisung muss durch ein Semikolon getrennt werden.
Relativer Dateipfad (relativeFilePath
)¶
path
Pfad zur relativen Datei im Stagingbereich mit Unterscheidung von Groß-/Kleinschreibung. Relative Pfade unterstützen etablierte Konventionen wie ein führendes
/
, um die Wurzel des Dateisystems eines Stagingbereichs anzugeben,./
, um auf das aktuelle Verzeichnis zu verweisen (das Verzeichnis, in dem sich die übergeordnete Datei befindet) und../
, um auf das übergeordnete Verzeichnis zu verweisen. Weitere Informationen dazu finden Sie unter Nutzungshinweise.filename
Name der auszuführenden Datei. Er muss syntaktisch korrekte und gültige SQL-Anweisungen enthalten. Jede Anweisung muss durch ein Semikolon getrennt werden.
Optionale Parameter¶
USING ( <key> => <value> [ , <key> => <value> [ , ... ] ] )
Ermöglicht Ihnen die Übergabe eines oder mehrerer Schlüssel-Wert-Paare, die zur Parametrisierung der Vorlagenerweiterung verwendet werden können. Die Schlüssel-Wert-Paare müssen eine durch Komma getrennte Liste bilden.
Wenn die USING-Klausel vorhanden ist, wird die Datei zunächst als Jinja2-Vorlage gerendert, bevor sie als SQL-Skript ausgeführt wird.
Wobei:
key
ist der Name der Vorlagenvariable. Der Name der Vorlagenvariable kann optional in doppelte Anführungszeichen ("
) eingeschlossen werden.value
ist der Wert, der der Variablen in der Vorlage zugewiesen werden soll. Zeichenfolgenwert müssen in'
oder$$
eingeschlossen sein. Ein Beispiel finden Sie unter Nutzungshinweise zu Vorlagen.
Rückgabewerte¶
EXECUTE IMMEDIATE FROM Rückgabewerte:
Das Ergebnis der letzten Anweisung in der Datei, wenn alle Anweisungen erfolgreich ausgeführt wurden.
Die Fehlermeldung, wenn eine Anweisung in der Datei fehlgeschlagen ist.
Wenn in einer Anweisung in der Datei ein Fehler auftritt, schlägt der Befehl EXECUTE IMMEDIATE FROM fehl und gibt die Fehlermeldung der fehlgeschlagenen Anweisung zurück.
Bemerkung
Wenn der Befehl EXECUTE IMMEDIATE FROM fehlschlägt und eine Fehlermeldung zurückgibt, sind alle Anweisungen in der Datei vor der fehlgeschlagenen Anweisung erfolgreich abgeschlossen worden.
Anforderungen an die Zugriffssteuerung¶
Die Rolle, die zur Ausführung des Befehls EXECUTE IMMEDIATE FROM verwendet wird, muss über die Berechtigung USAGE (externer Stagingbereich) oder READ (interner Stagingbereich) für den Stagingbereich verfügen, in dem sich die Datei befindet.
Die Rolle, mit der die Datei ausgeführt wird, kann nur die Anweisungen in der Datei ausführen, für die sie Berechtigungen hat. Wenn beispielsweise eine CREATE TABLE-Anweisung in der Datei enthalten ist, muss die Rolle über die notwendigen Berechtigungen verfügen, um eine Tabelle im Konto zu erstellen, sonst schlägt die Anweisung fehl.
Beachten Sie, dass für die Bearbeitung eines Objekts in einem Schema auch die Berechtigung USAGE für die übergeordnete Datenbank und das Schema erforderlich ist.
Eine Anleitung zum Erstellen einer kundenspezifischen Rolle mit einer bestimmten Gruppe von Berechtigungen finden Sie unter Erstellen von kundenspezifischen Rollen.
Allgemeine Informationen zu Rollen und Berechtigungen zur Durchführung von SQL-Aktionen auf sicherungsfähigen Objekten finden Sie unter Übersicht zur Zugriffssteuerung.
Nutzungshinweise¶
Die SQL-Anweisungen in einer auszuführenden Datei können EXECUTE IMMEDIATE FROM-Anweisungen enthalten:
Verschachtelte EXECUTE IMMEDIATE FROM-Anweisungen können relative Dateipfade verwenden.
Relative Pfade werden in Bezug auf den Stagingbereich und den Dateipfad der übergeordneten Datei ausgewertet. Wenn der relative Dateipfad mit
/
beginnt, beginnt der Pfad im Stammverzeichnis des Stagingbereichs, der die übergeordnete Datei enthält.Ein Beispiel dazu finden Sie unter Beispiele.
Relative Dateipfade müssen in einfache Anführungszeichen (
'
) oder$$
gesetzt wird.Die maximale Ausführungstiefe für verschachtelte Dateien ist 5.
Absolute Dateipfade können optional in einfache Anführungszeichen (
'
) oder$$
gesetzt werden.Die auszuführende Datei darf nicht größer als 10MB sein.
Die auszuführende Datei muss in UTF-8 kodiert sein.
Die auszuführende Datei muss unkomprimiert sein. Wenn Sie den Befehl PUT verwenden, um eine Datei in einen internen Stagingbereich hochzuladen, müssen Sie den Parameter AUTO_COMPRESS explizit auf FALSE setzen.
Laden Sie zum Beispiel
my_file.sql
nachmy_stage
hoch:PUT file://~/sql/scripts/my_file.sql @my_stage/scripts/ AUTO_COMPRESS=FALSE;
Das Ausführen aller Dateien in einem Verzeichnis wird nicht unterstützt. Zum Beispiel führt
EXECUTE IMMEDIATE FROM @stage_name/scripts/
zu einem Fehler.
Nutzungshinweise zu Vorlagen¶
Bei Variablennamen in Vorlagen wird zwischen Groß- und Kleinschreibung unterschieden.
Der Name der Vorlagenvariable kann optional in doppelte Anführungszeichen gesetzt werden. Das Einschließen des Variablennamens kann nützlich sein, wenn irgendwelche reservierten Schlüsselwörter als Variablennamen verwendet werden.
Die folgenden Parametertypen werden in der USING-Klausel unterstützt:
Zeichenfolge. Muss von
'
oder$$
umschlossen sein. Beispiel:USING (a => 'a', b => $$b$$)
.Zahl (dezimal und ganzzahlig). Beispiel:
USING (a => 1, b => -1.23)
.Boolescher Wert. Beispiel:
USING (a => TRUE, b => FALSE)
.NULL. Beispiel:
USING (a => NULL)
.Bemerkung
Die Jinja2-Vorlagen-Engine interpretiert einen NULL-Wert als Python-Typ NoneType.
Sitzungsvariablen. Beispiel:
USING (a => $var)
. Es sind nur Sitzungsvariablen erlaubt, die Werte von unterstützten Datentypen enthalten.Bindungsvariablen. Beispiel:
USING (a => :var)
. Nur Bindungsvariablen, die Werte von unterstützten Datentypen enthalten, sind erlaubt. Sie können Bindungsvariablen verwenden, um Argumente für gespeicherte Prozeduren an eine Vorlage zu übergeben.
Die maximale Ergebnisgröße für die Wiedergabe von Vorlagen beträgt 100.000 Bytes.
Vorlagen werden mit der Jinja2 Version 3.1.2-Vorlagen-Engine gerendert.
Problembehandlung bei EXECUTE IMMEDIATE FROM-Fehlern¶
Dieser Abschnitt enthält einige häufige Fehler, die sich aus einer EXECUTE IMMEDIATE FROM-Anweisung ergeben, und wie Sie diese beheben können.
Dateifehler¶
Fehler |
001501 (02000): File '<directory_name>' not found in stage '<stage_name>'.
|
---|---|
Ursache |
Es gibt mehrere Ursachen für diesen Fehler:
|
Lösung |
Überprüfen Sie den Namen der Datei, und stellen Sie sicher, dass die Datei vorhanden ist. Das Ausführen aller Dateien in einem Verzeichnis wird nicht unterstützt. |
Fehler |
001503 (42601): Relative file references like '<filename.sql>' cannot be used in top-level EXECUTE IMMEDIATE calls.
|
---|---|
Ursache |
Die Anweisung wurde mit einem relativen Dateipfad außerhalb einer Dateiausführung ausgeführt. |
Lösung |
Ein relativer Dateipfad kann nur in EXECUTE IMMEDIATE FROM-Anweisungen in einer Datei verwendet werden. Verwenden Sie den absoluten Dateipfad für die Datei. Weitere Informationen dazu finden Sie unter Nutzungshinweise. |
Fehler |
001003 (42000): SQL compilation error: syntax error line <n> at position <m> unexpected '<string>'.
|
---|---|
Ursache |
Die Datei enthält SQL-Syntaxfehler. |
Lösung |
Korrigieren Sie die Syntaxfehler in der Datei, und laden Sie die Datei erneut in den Stagingbereich hoch. |
Stagingbereichsfehler¶
Fehler |
002003 (02000): SQL compilation error: Stage '<stage_name>' does not exist or not authorized.
|
---|---|
Ursache |
Der Stagingbereich ist nicht vorhanden, oder Sie haben keinen Zugriff auf den Stagingbereich. |
Lösung |
|
Zugriffssteuerungsfehler¶
Fehler |
003001 (42501): Uncaught exception of type 'STATEMENT_ERROR' in file <file_name> on line <n> at position <m>:
SQL access control error: Insufficient privileges to operate on schema '<schema_name>'
|
---|---|
Ursache |
Die zur Ausführung der Anweisung verwendete Rolle verfügt nicht über die erforderlichen Berechtigungen, um einige oder alle Anweisungen in der Datei auszuführen. |
Lösung |
Verwenden Sie eine Rolle, die über die entsprechenden Berechtigungen verfügt, um die Anweisungen in der Datei auszuführen. Weitere Informationen dazu finden Sie unter Anforderungen an die Zugriffssteuerung. |
Siehe auch Stagingbereichsfehler.
Fehler bei der Verwendung von Vorlagen¶
Fehler |
001003 (42000): SQL compilation error:
syntax error line [n] at position [m] unexpected '{'.
|
---|---|
Ursache |
Die Datei enthält Vorlagenkonstrukte (z. B. |
Lösung |
Fügen Sie eine Vorlagenrichtlinie hinzu, oder führen Sie die Anweisung mit der USING-Klausel erneut aus und geben Sie mindestens eine Vorlagenvariable an. |
Fehler |
000005 (XX000): Python Interpreter Error:
jinja2.exceptions.UndefinedError: '<key>' is undefined
in template processing
|
---|---|
Ursache |
Wenn eine der in der Vorlage verwendeten Variablen in der USING-Klausel nicht spezifiziert ist, tritt ein Fehler auf. |
Lösung |
Überprüfen Sie die Namen und die Anzahl der Variablen in der Vorlage und aktualisieren Sie die USING-Klausel, um Werte für alle Variablen der Vorlage aufzunehmen. |
Fehler |
001510 (42601): Unable to use value of template variable '<key>'
|
---|---|
Ursache |
Der Wert der Variablen |
Lösung |
Vergewissern Sie sich, dass Sie für den Wert der Vorlagenvariablen einen unterstützten Parametertyp verwenden. Weitere Informationen dazu finden Sie unter Nutzungshinweise zu Vorlagen. |
Fehler |
001518 (42601): Size of expanded template exceeds limit of 100,000 bytes.
|
---|---|
Ursache |
Die Größe der gerenderten Vorlage überschreitet die aktuelle Beschränkung. |
Lösung |
Teilen Sie Ihre Datei mit Vorlagen in mehrere kleinere Vorlagen auf und fügen Sie ein neues Skript hinzu, um diese nacheinander auszuführen und dabei Variablen der Vorlage an die verschachtelten Skripte weiterzugeben. |
Beispiele¶
Grundlegendes Beispiel¶
In diesem Beispiel wird die Datei create-inventory.sql
ausgeführt, die sich im Stagingbereich my_stage
befindet.
Erstellen Sie eine Datei namens
create-inventory.sql
mit den folgenden Anweisungen:CREATE OR REPLACE TABLE my_inventory( sku VARCHAR, price NUMBER ); EXECUTE IMMEDIATE FROM './insert-inventory.sql'; SELECT sku, price FROM my_inventory ORDER BY price DESC;
Erstellen Sie eine Datei namens
insert-inventory.sql
mit den folgenden Anweisungen:INSERT INTO my_inventory VALUES ('XYZ12345', 10.00), ('XYZ81974', 50.00), ('XYZ34985', 30.00), ('XYZ15324', 15.00);
Erstellen Sie einen internen Stagingbereich
my_stage
:CREATE STAGE my_stage;
Laden Sie beide lokalen Dateien mit dem Befehl PUT in den Stagingbereich hoch:
PUT file://~/sql/scripts/create-inventory.sql @my_stage/scripts/ AUTO_COMPRESS=FALSE; PUT file://~/sql/scripts/insert-inventory.sql @my_stage/scripts/ AUTO_COMPRESS=FALSE;
Führen Sie das Skript
create-inventory.sql
aus, das sich inmy_stage
befindet:EXECUTE IMMEDIATE FROM @my_stage/scripts/create-inventory.sql;
Rückgabewerte:
+----------+-------+ | SKU | PRICE | |----------+-------| | XYZ81974 | 50 | | XYZ34985 | 30 | | XYZ15324 | 15 | | XYZ12345 | 10 | +----------+-------+
Ein einfaches Beispiel für eine Vorlage¶
Erstellen Sie eine Vorlagendatei
setup.sql
mit zwei Variablen und der Vorlagenrichtlinien:--!jinja CREATE SCHEMA {{env}}; CREATE TABLE RAW (COL OBJECT) DATA_RETENTION_TIME_IN_DAYS = {{retention_time}};
Erstellen Sie einen Stagingbereich – optional, wenn Sie bereits einen Stagingbereich haben, in den Sie Dateien hochladen können.
Erstellen Sie zum Beispiel einen internen Stagingbereich in Snowflake:
CREATE STAGE my_stage;
Laden Sie die Datei in Ihren Stagingbereich.
Verwenden Sie zum Beispiel den Befehl PUT aus Ihrer lokalen Umgebung, um die Datei
setup.sql
in den Stagingbereichmy_stage
hochzuladen:PUT file://path/to/setup.sql @my_stage/scripts/ AUTO_COMPRESS=FALSE;
Führen Sie die Datei
setup.sql
aus:EXECUTE IMMEDIATE FROM @my_stage/scripts/setup.sql USING (env=>'dev', retention_time=>0);
Vorlagenbeispiel mit einer Bedingung und einer Schleife¶
Erstellen Sie eine Vorlagendatei, und fügen Sie die Vorlagenrichtlinie hinzu.
Erstellen Sie zum Beispiel eine Datei
setup-env.sql
in Ihrer lokalen Umgebung:--!jinja2 {% if DEPLOYMENT_TYPE == 'prod' %} {% set environments = ['prod1', 'prod2'] %} {% else %} {% set environments = ['dev', 'qa', 'staging'] %} {% endif %} {% for environment in environments %} CREATE DATABASE {{ environment }}_db; USE DATABASE {{ environment }}_db; CREATE TABLE {{ environment }}_orders ( id NUMBER, item VARCHAR, quantity NUMBER); CREATE TABLE {{ environment }}_customers ( id NUMBER, name VARCHAR); {% endfor %}
Erstellen Sie einen Stagingbereich – optional, wenn Sie bereits einen Stagingbereich haben, in den Sie Dateien hochladen können.
Erstellen Sie zum Beispiel einen internen Stagingbereich in Snowflake:
CREATE STAGE my_stage;
Laden Sie die Datei in Ihren Stagingbereich.
Verwenden Sie zum Beispiel den Befehl PUT aus Ihrer lokalen Umgebung, um die Datei
setup-env.sql
in den Stagingbereichmy_stage
hochzuladen:PUT file://path/to/setup-env.sql @my_stage/scripts/ AUTO_COMPRESS=FALSE;
Führen Sie die Datei
setup-env.sql
aus:EXECUTE IMMEDIATE FROM @my_stage/scripts/setup-env.sql USING (DEPLOYMENT_TYPE => 'staging');