EXECUTE IMMEDIATE FROM

EXECUTE IMMEDIATE FROM は、ステージ内のファイルで指定された SQL ステートメントを実行します。ファイルには SQL ステートメントまたは Snowflakeスクリプトブロック を含めることができます。ステートメントは構文的に正しい SQL ステートメントにする必要があります。

EXECUTE IMMEDIATE FROM コマンドを使用すると、どのSnowflakeセッションからでもファイル内のステートメントを実行できます。

この機能は、Snowflakeオブジェクトとコードの展開と管理を制御するメカニズムを提供します。たとえば、ストアドスクリプトを実行して、すべてのアカウントに標準のSnowflake環境を作成することができます。構成スクリプトには、新しいアカウントごとにユーザー、ロール、データベース、スキーマを作成するステートメントが含まれる場合があります。

こちらもご参照ください。

EXECUTE IMMEDIATE

構文

EXECUTE IMMEDIATE
  FROM { absoluteFilePath | relativeFilePath }
Copy

条件:

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

絶対ファイルパス(absoluteFilePath

namespace

内部ステージまたは外部ステージが存在するデータベースまたはスキーマ、あるいはその両方で、 database_name.schema_name または schema_name の形式です。データベースとスキーマがユーザーセッション内で現在使用されている場合、名前空間は オプション です。それ以外の場合は必須です。

stage_name

内部または外部ステージの名前。

path

ステージ内にある、大文字と小文字を区別したファイルへのパス。

filename

実行するファイルの名前。構文的に正しく、有効な SQL ステートメントが含まれている必要があります。各ステートメントはコンマで区切る必要があります。

相対ファイルパス(relativeFilePath

path

ステージ内にある、大文字と小文字を区別したファイルへの相対パス。相対パスは、先頭の / でステージのファイルシステムのルートを示し、 ./ で現在のディレクトリ(親ファイルがあるディレクトリ)を参照し、 ../ で親ディレクトリを参照するなど、確立された規則をサポートします。詳細については、 使用上の注意 をご参照ください。

filename

実行するファイルの名前。構文的に正しく、有効な SQL ステートメントが含まれている必要があります。各ステートメントはコンマで区切る必要があります。

戻り値

EXECUTE IMMEDIATE FROM は次を返します。

  • すべてのステートメントが正常に実行された場合の、ファイルにある最後のステートメントの結果。

  • ファイル内のステートメントが失敗した場合のエラーメッセージ。

    ファイル内のステートメントにエラーがある場合、 EXECUTE IMMEDIATE FROM コマンドは失敗し、失敗したステートメントのエラーメッセージが返されます。

    注釈

    EXECUTE IMMEDIATE FROM コマンドが失敗してエラーメッセージを返した場合、ファイル内の失敗したステートメントより前のステートメントは正常に完了しています。

アクセス制御の要件

  • EXECUTE IMMEDIATE FROM コマンドの実行に使用される ロール には、ファイルがあるステージに対する USAGE (外部ステージ)または READ (内部ステージ)権限が必要です。

  • ファイルの実行に使用されるロールは、そのロールが権限を持つファイル内のステートメントのみを実行することができます。たとえば、ファイル内に CREATE TABLE ステートメントがある場合、ロールにはアカウントに テーブルを作成するための必要な権限 が求められます。必要な権限がないと、ステートメントは失敗します。

スキーマ内の任意のオブジェクトを操作するには、親データベースとスキーマに対する USAGE 権限も必要であることに注意してください。

指定された権限のセットを使用してカスタムロールを作成する手順については、 カスタムロールの作成 をご参照ください。

セキュリティ保護可能なオブジェクト に対して SQL アクションを実行するためのロールと権限付与に関する一般的な情報については、 アクセス制御の概要 をご参照ください。

使用上の注意

  • 実行されるファイルの SQL ステートメントには、 EXECUTE IMMEDIATE FROM ステートメントを含めることができます。

    • ネストされた EXECUTE IMMEDIATE FROM ステートメントでは、 相対ファイルパス使用できます

      相対パスは、親ファイルのステージとファイルパスを基準に評価されます。相対ファイルパスが / で始まる場合、パスは親ファイルを含むステージのルートディレクトリから始まります。

      例については、 をご参照ください。

    • 相対ファイルパスは、一重引用符(')または $$ で囲む必要があります。

    • ネストされたファイルの最大実行深度は5です。

  • 絶対ファイルパスは、オプションで一重引用符(')または $$ で囲むことができます。

  • 実行するファイルのサイズは 10MB を超過することはできません。

  • 実行するファイルは UTF-8 でエンコードする必要があります。

  • 実行するファイルは解凍されている必要があります。 PUT コマンドを使用して内部ステージにファイルをアップロードする場合は、 AUTO_COMPRESS パラメーター を明示的に FALSE に設定する必要があります。

    たとえば、 my_file.sqlmy_stage にアップロードします。

    PUT file://~/sql/scripts/my_file.sql @my_stage/scripts/
      AUTO_COMPRESS=FALSE;
    
    Copy
  • ディレクトリ内の全ファイルの実行はサポートされていません。例えば、 EXECUTE IMMEDIATE FROM @stage_name/scripts/ はエラーになります。

EXECUTE IMMEDIATE FROM エラーのトラブルシューティング

このセクションには、 EXECUTE IMMEDIATE FROM ステートメントに起因する一般的なエラーと、その解決方法が含まれています。

ファイルエラー

エラー

001501 (02000): File '<directory_name>' not found in stage '<stage_name>'.

原因

このエラーには複数の原因があります。

  • ファイルが存在しない。

  • ファイル名がディレクトリのルートである。例: @stage_name/scripts/

解決策

ファイル名を確認し、ファイルが存在することを確認します。ディレクトリ内の全ファイルの実行はサポートされていません。

エラー

001503 (42601): Relative file references like '<filename.sql>' cannot be used in top-level EXECUTE IMMEDIATE calls.

原因

ファイル実行の外部で、相対ファイルパスを使用してステートメントが実行された。

解決策

相対ファイルパスは、ファイル内の EXECUTE IMMEDIATE FROM ステートメントでのみ使用できます。ファイル用に ファイルの絶対パス を使用します。詳細については、 使用上の注意 をご参照ください。

エラー

001003 (42000): SQL compilation error: syntax error line <n> at position <m> unexpected '<string>'.

原因

ファイルに SQL 構文エラーがある。

解決策

ファイルの構文エラーを修正し、ステージにファイルを再アップロードします。

ステージエラー

エラー

002003 (02000): SQL compilation error: Stage '<stage_name>' does not exist or not authorized.

原因

ステージが存在しないか、ステージにアクセスできない。

解決策

  • ステージ名を確認し、ステージが存在することを確認します。

  • ステージへのアクセスに必要な権限を持つロールを使用してステートメントを実行します。詳細については、 アクセス制御の要件 をご参照ください。

アクセス制御エラー

エラー

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>'

原因

ステートメントの実行に使用されたロールに、ファイル内のステートメントの一部またはすべてを実行するために必要な権限がない。

解決策

ファイル内のステートメントを実行するために適切な権限を持つロールを使用します。詳細については、 アクセス制御の要件 をご参照ください。

ステージエラー もご参照ください。

この例では、ステージ my_stage にあるファイル create-inventory.sql を実行します。

  1. 次のステートメントを使用して、 create-inventory.sql という名前のファイルを作成します。

    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. 次のステートメントを使用して、 insert-inventory.sql という名前のファイルを作成します。

    INSERT INTO my_inventory
      VALUES ('XYZ12345', 10.00),
             ('XYZ81974', 50.00),
             ('XYZ34985', 30.00),
             ('XYZ15324', 15.00);
    
    Copy
  3. 内部ステージ my_stage を作成します。

    CREATE STAGE my_stage;
    
    Copy
  4. PUT コマンドを使用して、両方のローカルファイルをステージにアップロードします。

    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. my_stagecreate-inventory.sql スクリプトを実行します。

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

    戻り値:

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