📃

SnowflakeのStageをデータベース名から指定する

2025/02/26に公開

前置き

こんにちは。さすらいのデータエンジニア、こみぃです。

みなさんSnowflakeのStage使ってますか?
昨日Stageを使ったシステムを触っていて、何故かググっても記事が見つからなくて少し迷った件について簡単にまとめます。

Stageの通常の使い方

StageへのSQLの打ち方は公式のドキュメントにも記載されている通りこんな感じです。
https://docs.snowflake.com/ja/user-guide/querying-stage

SELECT t.$1, t.$2 FROM @mystage1 (file_format => 'myformat', pattern=>'.*data.*[.]csv.gz') t;

しかし、Stageはスキーマの下にあるオブジェクトなので、このSQLはデータベース名とスキーマ名をuseで事前に指定しているのが前提になります。
※myformatも同じ場所にある前提

先にこういうのが必要

USE DATABASE komiyama_test;
USE SCHEMA stage_test;

StageへのSQLでデータベース名から指定する

今回の用途ではデータベース名とスキーマ名を事前に指定していない状況でデータベースから指定する方法です。
先にuse打ってからやればいいじゃんと思うかもしれませんが、できないこともあります。ツールを使っててSQL一つで指定しなきゃいけなくてかつ接続設定が共通だからデータベースやスキーマを事前に指定できないとか(めっちゃ具体的事例がありそうなフラグ)!!!

結論としてはSQL内で指定できます。具体的にはこう!!

SELECT t.$1, t.$2 FROM @komiyama_test.stage_test.mystage1 (file_format => 'komiyama_test.stage_test.myformat', pattern=>'.*data.*[.]csv.gz') t;

stage、file_formatともにdatabase.schemaをつければいいだけですが、stageが@の後ろに書かないと行けなかったり、file_formatはシングルクオートの中に書かないといけないなど、ちょっと直感的には違和感のある記述になりますね。

本日のまとめ

そんなわけで本日のまとめはこちらです。

StageへのSQLでデータベース名は指定できる

結びの言葉

使っているツールの仕様などで使えるSQLが制限されることはあるのですが、諦めてはいけないという良い例ですね。
今回はサポートに問い合わせようかと思ってましたが、雰囲気で数パターン試したらできたので事なきを得ました。

本日はこのあたりで。
それじゃあ、バイバイ!

Snowflake Data Heroes

Discussion