SnowConvert AI - BigQueryの機能の違い

注釈

変換範囲

SnowConvert AI for Google BigQuery は現在、TABLES と VIEWS の評価と変換をサポートしています。SnowConvert AI は他のタイプのステートメントも認識できますが、完全にはサポートしていません。

SSC-FDM-BQ0001

Snowflakeでは、配列にアクセスすると、範囲外の正のインデックスに対してエラーではなく NULL が生成されます。

説明

Snowflakeで ARRAY オブジェクトにインデックスを使用してアクセスする場合、配列のサイズよりも大きなインデックスを指定すると、 NULL 値が返されます。これは、関数 SAFE_OFFSET または SAFE_ORDINAL が使用されない限り、範囲外のインデックスを使用して ARRAY にアクセスするとエラーが発生する BigQuery の動作とは異なります。

この警告は、安全でない ARRAY アクセスに追加されます。

コード例

入力コード:
BigQuery
 SELECT ([40, 12, 30])[8];

SELECT ([40, 12, 30])[SAFE_OFFSET(8)];
Copy
生成されたコード:
Snowflake
 SELECT
--** SSC-FDM-BQ0001 - ACCESSING ARRAYS PRODUCES NULL INSTEAD OF AN ERROR FOR POSITIVE OUT OF BOUNDS INDEXES IN SNOWFLAKE **
([40, 12, 30])[8];

SELECT
PUBLIC.SAFE_OFFSET_UDF( ([40, 12, 30]), 8);
Copy

ベストプラクティス

  • コード内の配列アクセスの使われ方を分析します。元のコードで範囲外エラーが発生するリスクがなかった場合は、違いは見られず、この警告は無視しても問題ありません。

  • さらにサポートが必要な場合は、[snowconvert-support@snowflake.com](mailto:snowconvert-support@snowflake.com)までメールでお問い合わせください。

SSC-FDM-BQ0002

例外システム変数はSnowflakeではサポートされていません。

説明

この FDM は、ステートメントが[BigQuery 内の例外変数](https://cloud.google.com/bigquery/docs/reference/standard-sql/procedural-language#beginexceptionend)を参照する場合に追加されます。なぜなら、これらの変数はSnowflakeではサポートされておらず、これらの変数の内容はSnowflakeで許可されている例外変数とは大きく異なるためです。 詳細については、[Snowflakeにおける例外処理](https://docs.snowflake.com/en/developer-guide/snowflake-scripting/exceptions)をご参照ください。

コード例

入力コード:
BigQuery
 CREATE OR REPLACE PROCEDURE test.proc1()
BEGIN
  SELECT 1/0;
EXCEPTION WHEN ERROR THEN
  SELECT
    @@error.message as message,
    @@error.stack_trace as stack_trace,
    @@error.statement_text as statement_text,
    @@error.formatted_stack_trace as formatted_stack_trace;
END;
Copy
結果
 [{
  "message": "Query error: division by zero: 1 / 0 at [snowflake-snowconvert-team.test.proc1:2:3]",
  "stack_trace": [{
    "line": "2",
    "column": "3",
    "filename": null,
    "location": "snowflake-snowconvert-team.test.proc1"
  }, {
    "line": "1",
    "column": "1",
    "filename": null,
    "location": null
  }],
  "statement_text": "SELECT 1/0",
  "formatted_stack_trace": "At snowflake-snowconvert-team.test.proc1[2:3]\nAt [1:1]\n"
}]
Copy
生成されたコード:
Snowflake
 CREATE OR REPLACE PROCEDURE test.proc1 ()
RETURNS VARCHAR
LANGUAGE SQL
EXECUTE AS CALLER
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "bigquery",  "convertedOn": "04/09/2025",  "domain": "test" }}'
AS
$$
    BEGIN
    SELECT 1/0;
  EXCEPTION WHEN OTHER THEN
--      --** SSC-FDM-BQ0002 - EXCEPTION SYSTEM VARIABLES ARE NOT SUPPORTED IN SNOWFLAKE. **
--    SELECT
--      @@error.message as message,
--      @@error.stack_trace as stack_trace,
--      @@error.statement_text as statement_text,
--      @@error.formatted_stack_trace as formatted_stack_trace;
      RETURN OBJECT_CONSTRUCT('SQLERRM', SQLERRM, 'SQLCODE', SQLCODE, 'SQLSTATE', SQLSTATE);
    END;
$$;
Copy
結果
 {
  "SQLCODE": 100051,
  "SQLERRM": "Division by zero",
  "SQLSTATE": "22012"
}
Copy

ベストプラクティス

  • Snowflakeには、例外に関する情報を提供する3つの組み込み変数があります。

    1. SQLSTATE:これは、 ANSI SQL 標準[SQLSTATE](https://en.wikipedia.org/wiki/SQLSTATE)をモデルにした5文字のコードです。

    2. SQLERRM:これはエラーメッセージです。

    3. SQLCODE:これは5桁の符号付き整数です。

  • さらにサポートが必要な場合は、[snowconvert-support@snowflake.com](mailto:snowconvert-support@snowflake.com)までメールでお問い合わせください。

SSC-FDM-BQ0003

従属オブジェクト情報が欠落しているため、正しい戻りテーブル句を生成できません。

説明

Snowflakeでは、 CREATE TABLE FUNCTION ステートメントに対して有効なRETURNS TABLE 句が必要です。

SnowConvert AI では、元の BigQuery ソースコードに RETURNS TABLE 句がなく、新しい句を最初から作成しなければならないシナリオに遭遇することがあります。これを行うには、結果のテーブルの列の型を適切に推測するために、 CREATE TABLE FUNCTION クエリが分析されます。SnowConvert AI が必要な情報を収集できない場合、この EWI が追加されます。

コード例

入力コード:
BigQuery
 CREATE OR REPLACE TABLE FUNCTION function_name_noreturns_asterisk_join (parameter_name INTEGER)
AS
  SELECT * 
  FROM unknownTable1 t1 
  JOIN unknownTable2 t2 ON t1.col1 = t2.fk_col1;
Copy
生成されたコード:
Snowflake
 --** SSC-FDM-0007 - MISSING DEPENDENT OBJECTS "unknownTable1", "unknownTable2" **

CREATE OR REPLACE FUNCTION function_name_noreturns_asterisk_join (parameter_name INTEGER)
----** SSC-FDM-BQ0003 - UNABLE TO GENERATE CORRECT RETURNS TABLE CLAUSE DUE TO MISSING DEPENDENT OBJECT INFORMATION. **
--RETURNS TABLE (
--)
AS
    $$
      SELECT *
      FROM
      unknownTable1 t1
      JOIN
          unknownTable2 t2 ON t1.col1 = t2.fk_col1
    $$;
Copy

ベストプラクティス

  • SnowConvert AI 、重要な情報にアクセスできるように、依存オブジェクトの定義は常に入力コードに含めるようにしてください。 

  • さらにサポートが必要な場合は、[snowconvert-support@snowflake.com](mailto:snowconvert-support@snowflake.com)までメールでお問い合わせください。

SSC-FDM-BQ0004

INFER_SCHEMA 関数は、テーブルテンプレートを生成するためにワイルドカードを含まないファイルパスを必要とするので、FILE_PATH プレースホルダーをそれに置き換えます

警告

このFDM は非推奨です。この FDM の最新バージョンについては、[SSC-FDM-0035](generalFDM.md#ssc-fdm-0035)をご参照ください。

説明

[INFER_SCHEMA](https://docs.snowflake.com/en/sql-reference/functions/infer_schema)関数は、ファイルの構造に基づいてテーブルの列定義を生成するためにSnowflakeで使用されます。この関数は、テーブルの列を構築するために使用されるファイルまたはフォルダーのパスを指定する LOCATION パラメーターを必要とします。ただし、このパスは正規表現に対応していないため、ワイルドカード* 文字はサポートされません。

テーブルに列がない場合、 SnowConvert AI はすべての URIS をチェックして、ワイルドカードを使用していないものを見つけ、 INFER _SCHEMA 関数で使用する。このような条件を満たす URI がない場合、この FDM と、 FILE_PATH プレースホルダーが生成されます。このプレースホルダーは、テーブルの列を生成するために、外部テーブルによって参照されるいずれかのファイルのパスに置き換える必要があります。

コード例

入力コード:
BigQuery
 CREATE OR REPLACE EXTERNAL TABLE test.my_external_table_json2
OPTIONS(
  FORMAT='JSON',
  URIS=['gs://sc_external_table_bucket/folder_with_json/*']
);
Copy
生成されたコード:
Snowflake
 CREATE OR REPLACE TEMPORARY FILE FORMAT SC_TEST_MY_EXTERNAL_TABLE_JSON2_FORMAT
TYPE = JSON;


CREATE OR REPLACE EXTERNAL TABLE test.my_external_table_json2 USING TEMPLATE (
SELECT
  ARRAY_AGG(OBJECT_CONSTRUCT('COLUMN_NAME', COLUMN_NAME, 'TYPE', TYPE, 'NULLABLE', NULLABLE, 'EXPRESSION', EXPRESSION))
FROM
  --** SSC-FDM-BQ0004 - THE INFER_SCHEMA FUNCTION REQUIRES A FILE PATH WITHOUT WILDCARDS TO GENERATE THE TABLE TEMPLATE, REPLACE THE FILE_PATH PLACEHOLDER WITH IT **
  TABLE(INFER_SCHEMA(LOCATION => '@EXTERNAL_STAGE/FILE_PATH', FILE_FORMAT => 'SC_TEST_MY_EXTERNAL_TABLE_JSON2_FORMAT'))
)
!!!RESOLVE EWI!!! /*** SSC-EWI-BQ0015 - EXTERNAL TABLE REQUIRES AN EXTERNAL STAGE TO ACCESS gs://sc_external_table_bucket, DEFINE AND REPLACE THE EXTERNAL_STAGE PLACEHOLDER ***/!!!
LOCATION = @EXTERNAL_STAGE
AUTO_REFRESH = false
PATTERN = 'folder_with_json/.*'
FILE_FORMAT = (TYPE = JSON);
Copy

ベストプラクティス

  • さらにサポートが必要な場合は、[snowconvert-support@snowflake.com](mailto:snowconvert-support@snowflake.com)までメールでお問い合わせください。

SSC-FDM-BQ0005

外部テーブルでは CSV ヘッダーの解析はサポートされていないため、列の名前を元の名前と一致するように変更する必要があります

説明

現在、Snowflake外部テーブルは CSV ファイルのヘッダーの解析をサポートしていません。明示的な列リストと CSV ファイル形式のない外部テーブルが見つかった場合、 SnowConvert AI は実行時エラーを回避するために SKIP_HEADER ファイル形式オプションを生成しますが、この場合、テーブル列名は自動生成された名前c1、c2、...、cNが付きます。

この FDM は、ヘッダーを解析できず、元の列名を保持するためには手動で列名を変更する必要があることを通知するために生成されます。

コード例

入力コード:
BigQuery
 CREATE OR REPLACE EXTERNAL TABLE test.my_external_table_csv
OPTIONS(
  FORMAT='CSV',
  URIS=['gs://sc_external_table_bucket/folder_with_csv/Employees.csv']
);
Copy
生成されたコード:
Snowflake
 CREATE OR REPLACE TEMPORARY FILE FORMAT SC_TEST_MY_EXTERNAL_TABLE_CSV_FORMAT
TYPE = CSV
SKIP_HEADER = 1;

CREATE OR REPLACE EXTERNAL TABLE test.my_external_table_csv
--** SSC-FDM-BQ0005 - PARSING THE CSV HEADER IS NOT SUPPORTED IN EXTERNAL TABLES, COLUMNS MUST BE RENAMED TO MATCH THE ORIGINAL NAMES **
USING TEMPLATE (
SELECT
  ARRAY_AGG(OBJECT_CONSTRUCT('COLUMN_NAME', COLUMN_NAME, 'TYPE', TYPE, 'NULLABLE', NULLABLE, 'EXPRESSION', EXPRESSION))
FROM
  TABLE(INFER_SCHEMA(LOCATION => '@EXTERNAL_STAGE/folder_with_csv/Employees.csv', FILE_FORMAT => 'SC_TEST_MY_EXTERNAL_TABLE_CSV_FORMAT'))
)
!!!RESOLVE EWI!!! /*** SSC-EWI-0032 - EXTERNAL TABLE REQUIRES AN EXTERNAL STAGE TO ACCESS gs://sc_external_table_bucket, DEFINE AND REPLACE THE EXTERNAL_STAGE PLACEHOLDER ***/!!!
LOCATION = @EXTERNAL_STAGE
AUTO_REFRESH = false
PATTERN = 'folder_with_csv/Employees.csv'
FILE_FORMAT = (TYPE = CSV SKIP_HEADER = 1);
Copy

ベストプラクティス

  • 変換を完了するには、テーブル列の名前をファイルからの元の名前に変更してください。

  • さらにサポートが必要な場合は、[snowconvert-support@snowflake.com](mailto:snowconvert-support@snowflake.com)までメールでお問い合わせください。

SSC-FDM-BQ0006

Googleドライブからの読み込みはSnowflakeではサポートされていません。ファイルを外部の場所にアップロードし、 FILE_PATH プレースホルダーを置き換えてください。

説明

Snowflakeは、Google Driveにホストされているファイルからのデータの読み込みをサポートしていません。この FDM は、それを通知するために生成されます。外部ステージからアクセスできるように、Google Driveファイルを外部の場所にアップロードしてください。

PATTERN 句には、自動生成されたプレースホルダー FILE_PATH0、FILE_PATH1、...、FILE_PATHN が格納されます。このプレースホルダーは、ファイルが外部の場所に移動された後にファイル/フォルダーのパスに置き換えられます。

コード例

入力コード:
BigQuery
 CREATE OR REPLACE EXTERNAL TABLE test.my_external_table_drive_test
OPTIONS(
  FORMAT='JSON',
  URIS=['https://drive.google.com/open?id=someFileId']
);
Copy
生成されたコード:
Snowflake
 CREATE OR REPLACE TEMPORARY FILE FORMAT SC_TEST_MY_EXTERNAL_TABLE_DRIVE_TEST_FORMAT
TYPE = JSON;

CREATE OR REPLACE EXTERNAL TABLE test.my_external_table_drive_test USING TEMPLATE (
SELECT
  ARRAY_AGG(OBJECT_CONSTRUCT('COLUMN_NAME', COLUMN_NAME, 'TYPE', TYPE, 'NULLABLE', NULLABLE, 'EXPRESSION', EXPRESSION))
FROM
  --** SSC-FDM-0035 - THE INFER_SCHEMA FUNCTION REQUIRES A FILE PATH WITHOUT WILDCARDS TO GENERATE THE TABLE TEMPLATE, REPLACE THE FILE_PATH PLACEHOLDER WITH IT **
  TABLE(INFER_SCHEMA(LOCATION => '@EXTERNAL_STAGE/FILE_PATH', FILE_FORMAT => 'SC_TEST_MY_EXTERNAL_TABLE_DRIVE_TEST_FORMAT'))
)
!!!RESOLVE EWI!!! /*** SSC-EWI-0032 - EXTERNAL TABLE REQUIRES AN EXTERNAL STAGE TO ACCESS AN EXTERNAL LOCATION, DEFINE AND REPLACE THE EXTERNAL_STAGE PLACEHOLDER ***/!!!
LOCATION = @EXTERNAL_STAGE
AUTO_REFRESH = false
--** SSC-FDM-BQ0006 - READING FROM GOOGLE DRIVE IS NOT SUPPORTED IN SNOWFLAKE, UPLOAD THE FILES TO THE EXTERNAL LOCATION AND REPLACE THE FILE_PATH PLACEHOLDERS **
PATTERN = 'FILE_PATH0'
FILE_FORMAT = (TYPE = JSON);
Copy

ベストプラクティス

  • Googleドライブにホストされているファイルを外部ステージで参照される外部の場所にアップロードし、 FILE_PATH プレースホルダーを置き換えて変換を完了します。

  • さらにサポートが必要な場合は、[snowconvert-support@snowflake.com](mailto:snowconvert-support@snowflake.com)までメールでお問い合わせください。

SSC-FDM-BQ0007

Snowflakeではスプレッドシートからの読み込みはサポートされていません。代わりに CSV ファイルタイプを使用してください。

説明

Snowflakeはファイル形式としてGoogle Sheetsをサポートしていませんが、その構造はSnowflakeがサポートしている CSV ファイルに似ています。

SnowConvert AI が GOOGLE_SHEETS 形式の外部テーブルを検出すると、代わりに CSV ファイル形式の外部テーブルを生成します。

この FDM は、変換でGoogleシートではなく CSV ファイルが必要になることをユーザーに通知するために生成されます。

コード例

入力コード:
BigQuery
 CREATE OR REPLACE EXTERNAL TABLE test.spreadsheetTable
(
  Name STRING,
  Code INTEGER,
  Price INTEGER,
  Expiration_date DATE
)
OPTIONS(
  format="GOOGLE_SHEETS",
  skip_leading_rows = 1,
  uris=['https://docs.google.com/spreadsheets/d/someFileId/edit?usp=sharing']
);
Copy
生成されたコード:
Snowflake
--** SSC-FDM-BQ0007 - READING FROM SPREADSHEETS IS NOT SUPPORTED IN SNOWFLAKE, USE THE CSV FILE TYPE INSTEAD **
CREATE OR REPLACE EXTERNAL TABLE test.spreadsheetTable
(
  Name STRING AS CAST(GET_IGNORE_CASE($1, 'c1') AS STRING),
  Code INTEGER AS CAST(GET_IGNORE_CASE($1, 'c2') AS INTEGER),
  Price INTEGER AS CAST(GET_IGNORE_CASE($1, 'c3') AS INTEGER),
  Expiration_date DATE AS CAST(GET_IGNORE_CASE($1, 'c4') AS DATE)
)
!!!RESOLVE EWI!!! /*** SSC-EWI-0032 - EXTERNAL TABLE REQUIRES AN EXTERNAL STAGE TO ACCESS AN EXTERNAL LOCATION, DEFINE AND REPLACE THE EXTERNAL_STAGE PLACEHOLDER ***/!!!
LOCATION = @EXTERNAL_STAGE
AUTO_REFRESH = false
--** SSC-FDM-BQ0006 - READING FROM GOOGLE DRIVE IS NOT SUPPORTED IN SNOWFLAKE, UPLOAD THE FILES TO THE EXTERNAL LOCATION AND REPLACE THE FILE_PATH PLACEHOLDERS **
PATTERN = 'FILE_PATH0'
FILE_FORMAT = (TYPE = CSV SKIP_HEADER = 1)
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "bigquery",  "convertedOn": "07/16/2025",  "domain": "no-domain-provided" }}';
Copy

ベストプラクティス

  • さらにサポートが必要な場合は、[snowconvert-support@snowflake.com](mailto:snowconvert-support@snowflake.com)までメールでお問い合わせください。

SSC-FDM-BQ0008

Where句は STRUCT 型の列を参照します。

説明

Snowflakeオブジェクトにキー値形式がある場合、別のオブジェクトと比較するときに、Snowflakeはキーと値の両方を比較します。一方、 BigQuery が構造体間で比較する場合は、構造体にキーがあるかどうかに関係なく、値のみを比較します。

この比較の違いにより、同じ比較に対して SnowConvert 、 AI、 BigQuery で結果が異なる可能性があります。この FDM は、 BigQuery 構造体から作成されたSnowflakeオブジェクトで比較が行われるときに追加されます。

コード例

入力:
BigQuery
 CREATE OR REPLACE TABLE test.compExprTable
(
  COL1 STRUCT<sc1 INT64>,
  COL2 STRUCT<sc2 INT64>  
);

SELECT * FROM test.compExprTable WHERE COL1 <> (COL2);
Copy
出力:
Snowflake
 CREATE OR REPLACE TABLE test.compExprTable
(
  COL1 VARIANT /*** SSC-FDM-0034 - STRUCT<INT64> CONVERTED TO VARIANT. SOME OF ITS USAGES MIGHT HAVE FUNCTIONAL DIFFERENCES. ***/,
  COL2 VARIANT /*** SSC-FDM-0034 - STRUCT<INT64> CONVERTED TO VARIANT. SOME OF ITS USAGES MIGHT HAVE FUNCTIONAL DIFFERENCES. ***/
)
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "bigquery",  "convertedOn": "07/02/2025",  "domain": "no-domain-provided" }}';

SELECT * FROM
  test.compExprTable
--** SSC-FDM-BQ0008 - WHERE CLAUSE REFERENCES A COLUMN OF STRUCT TYPE. COMPARISON OPERATIONS MAY PRODUCE DIFFERENT RESULTS IN SNOWFLAKE. **
WHERE COL1 <> (COL2);
Copy

ベストプラクティス

  • さらにサポートが必要な場合は、[snowconvert-support@snowflake.com](mailto:snowconvert-support@snowflake.com)までメールでお問い合わせください。

SSC-FDM-BQ0010

地理機能はSnowflakeでは必要ありません。

説明

この警告は、値句で地理関数を使用してこのタイプのデータを挿入する場合に追加されます。これは、これらが不要であり、Snowflakeがデータが[WGS 84標準](https://spatialreference.org/ref/epsg/wgs-84/)に準拠していることを自動的に検出するためです。

コード例

入力:
BigQuery
 CREATE OR REPLACE TABLE test.geographyType
(
  COL1 GEOGRAPHY
);

INSERT INTO test.geographyType VALUES
(ST_GEOGFROMTEXT('POINT(-122.35 37.55)')), 
(ST_GEOGFROMTEXT('LINESTRING(-124.20 42.00, -120.01 41.99)'));

SELECT * FROM test.geographyType;
Copy
出力:
クエリ
 CREATE OR REPLACE TABLE test.geographyType
(
  COL1 GEOGRAPHY
);

INSERT INTO test.geographyType
VALUES
    (
     --** SSC-FDM-BQ0010 - THE FUNCTION 'ST_GEOGFROMTEXT' IS NOT REQUIRED IN SNOWFLAKE. **
     'POINT(-122.35 37.55)'), (
     --** SSC-FDM-BQ0010 - THE FUNCTION 'ST_GEOGFROMTEXT' IS NOT REQUIRED IN SNOWFLAKE. **
     'LINESTRING(-124.20 42.00, -120.01 41.99)');

ALTER SESSION SET GEOGRAPHY_OUTPUT_FORMAT = 'WKT';
SELECT * FROM
test.geographyType;
Copy

SSC-FDM-BQ0011

このスクリプトの名前付きパラメーターは、Snowflake CLI 変数に変換されました。

説明

BigQuery クエリを使用する場合、 @parameter_name 構文を使用して名前付きパラメーターを指定することができます。パラメータ化されたクエリが入力コードで見つかると、 SnowConvert はスクリプトの最初にこの FDM を生成し、名前付きパラメーターがSnowflake CLI 変数に変換されたことをユーザーに示します。

名前付きパラメーターを含む変換済みの.sqlスクリプトを実行するには、変数置換を使用して Snowflake CLI を実行します。

Snowflake CLI の設定と使用方法の詳細については、[Snowflake CLI とは](../../../../../../developer-guide/snowflake-cli/index.rst)をご参照ください。

コード例

入力:
BigQuery
SELECT column1 FROM test.parametersExample WHERE column2 = @searchValue;
Copy
実行例(bqクエリコマンドを使用)
bq query \
  --use_legacy_sql=false \
  --parameter=searchValue:Int64:80 \
  'SELECT column1 FROM test.parametersExample WHERE column2 = @searchValue'
Copy
出力:
Snowflake
--** SSC-FDM-BQ0011 - NAMED PARAMETERS IN THIS SCRIPT WERE TRANSFORMED TO SNOWFLAKE CLI VARIABLES. **
SELECT column1 FROM
test.parametersExample
WHERE column2 = <% searchValue %>;
Copy
実行例(Snowflake CLI )
snow sql -f output_file_path -D "searchValue=80"
Copy

推奨事項

  • Snowflakeのvalue句ではこれらの関数の使用は許可されていませんが、代わりにサブクエリを使用できます。

  • さらにサポートが必要な場合は、[snowconvert-support@snowflake.com](mailto:snowconvert-support@snowflake.com)までメールでお問い合わせください。