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
Copy

Optional können Sie auch die alternative Richtlinie verwenden:

#!jinja
Copy

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:

EXECUTE IMMEDIATE

Syntax

EXECUTE IMMEDIATE
  FROM { absoluteFilePath | relativeFilePath }
  [ USING ( <key> => <value> [ , <key> => <value> [ , ... ] ]  )  ]
Copy

Wobei:

absoluteFilePath ::=
   @[ <namespace>. ]<stage_name>/<path>/<filename>
Copy
relativeFilePath ::=
  '[ / | ./ | ../ ]<path>/<filename>'
Copy

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 oder schema_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 nach my_stage hoch:

    PUT file://~/sql/scripts/my_file.sql @my_stage/scripts/
      AUTO_COMPRESS=FALSE;
    
    Copy
  • 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:

  • Die Datei ist nicht vorhanden.

  • Der Dateiname ist der Name des Stammverzeichnisses. Beispiel: @stage_name/scripts/.

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

  • Überprüfen Sie den Namen des Stagingbereichs, und stellen Sie sicher, dass der Stagingbereich vorhanden ist.

  • Führen Sie die Anweisung mit einer Rolle aus, die über die erforderlichen Berechtigungen für den Zugriff auf den Stagingbereich verfügt. Weitere Informationen dazu finden Sie unter Anforderungen an die Zugriffssteuerung.

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. {{ table_name }}), wird aber nicht mit der Vorlagen-Engine gerendert. Wenn die Vorlage nicht gerendert wird, werden die Textzeilen in der Vorlage als SQL-Anweisungen ausgeführt. Die Vorlagenkonstrukte in der Datei führen höchstwahrscheinlich zu SQL-Syntaxfehlern.

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 key ist ein nicht unterstützter Typ.

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.

  1. 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;
    
    Copy
  2. 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);
    
    Copy
  3. Erstellen Sie einen internen Stagingbereich my_stage:

    CREATE STAGE my_stage;
    
    Copy
  4. 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;
    
    Copy
  5. Führen Sie das Skript create-inventory.sql aus, das sich in my_stage befindet:

    EXECUTE IMMEDIATE FROM @my_stage/scripts/create-inventory.sql;
    
    Copy

    Rückgabewerte:

    +----------+-------+
    | SKU      | PRICE |
    |----------+-------|
    | XYZ81974 |    50 |
    | XYZ34985 |    30 |
    | XYZ15324 |    15 |
    | XYZ12345 |    10 |
    +----------+-------+
    

Ein einfaches Beispiel für eine Vorlage

  1. 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}};
    
    Copy
  2. 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;
    
    Copy
  3. 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 Stagingbereich my_stage hochzuladen:

    PUT file://path/to/setup.sql @my_stage/scripts/
      AUTO_COMPRESS=FALSE;
    
    Copy
  4. Führen Sie die Datei setup.sql aus:

    EXECUTE IMMEDIATE FROM @my_stage/scripts/setup.sql
        USING (env=>'dev', retention_time=>0);
    
    Copy

Vorlagenbeispiel mit einer Bedingung und einer Schleife

  1. 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 %}
    
    Copy
  2. 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;
    
    Copy
  3. 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 Stagingbereich my_stage hochzuladen:

    PUT file://path/to/setup-env.sql @my_stage/scripts/
      AUTO_COMPRESS=FALSE;
    
    Copy
  4. Führen Sie die Datei setup-env.sql aus:

    EXECUTE IMMEDIATE FROM @my_stage/scripts/setup-env.sql
      USING (DEPLOYMENT_TYPE => 'staging');
    
    Copy