SnowConvert AI - BigQuery 기능적 차이

참고

변환 범위

Google BigQuery용 SnowConvert AI는 현재 TABLES 및 VIEWS에 대한 평가 및 변환을 지원합니다. SnowConvert AI는 다른 유형의 문을 인식할 수 있지만, 이러한 문 유형이 완전히 지원되지는 않습니다.

SSC-FDM-BQ0001

Snowflake에서 배열에 액세스할 때 범위를 벗어난 양수 인덱스의 경우 오류 대신 NULL이 반환됩니다.

설명

Snowflake에서 인덱스로 ARRAY 오브젝트에 액세스할 때 배열 크기보다 큰 인덱스를 지정하면 NULL 값이 반환됩니다. 이는 BigQuery의 동작에 따라 다릅니다. SAFE_OFFSET 또는 SAFE_ORDINAL 함수를 사용하지 않는 한, 범위를 벗어난 인덱스로 ARRAY에 액세스하면 오류가 발생합니다.

이 경고는 안전하지 않은 모든 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으로 이메일을 보내주세요.

SSC-FDM-BQ0002

예외 시스템 변수는 Snowflake에서 지원되지 않습니다.

설명

이 FDM은 BigQuery에서 예외 변수를 참조하는 문이 있는 경우에 추가됩니다. 이러한 변수는 Snowflake에서 지원되지 않으며 이러한 변수의 내용이 Snowflake에서 허용되는 예외 변수와 상당히 다르기 때문입니다. 자세한 내용은 Snowflake에서 예외 처리하기를 참조하세요.

코드 예제

입력 코드:
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를 모델로 한 5자 코드입니다.

    2. SQLERRM: 오류 메시지입니다.

    3. SQLCODE: 부호 있는 5자리 정수입니다.

  • 추가 지원이 필요한 경우 snowconvert-support@snowflake.com으로 이메일을 보내주세요.

SSC-FDM-BQ0003

종속 오브젝트 정보가 누락되어 올바른 returns table 절을 생성할 수 없습니다.

설명

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으로 이메일을 보내주세요.

SSC-FDM-BQ0004

INFER_SCHEMA 함수는 테이블 템플릿을 생성하고 FILE_PATH 자리 표시자로 교체하기 위해 와일드카드가 없는 파일 경로가 필요합니다.

경고

이 FDM은 더 이상 사용되지 않습니다. FDM의 최신 버전은 SSC-FDM-0035를 참조하세요.

설명

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

모범 사례

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으로 이메일을 보내주세요.

SSC-FDM-BQ0006

Google Drive에서 읽기 기능은 Snowflake에서 지원되지 않습니다. 외부 위치에 파일을 업로드하고 FILE_PATH 자리 표시자를 바꿉니다

설명

Snowflake는 Google Drive에 호스팅된 파일에서 데이터 읽기를 지원하지 않으므로, 이 FDM은 이에 대해 알리기 위해 생성됩니다. 외부 스테이지를 통해 액세스할 수 있도록 Google 드라이브 파일을 외부 위치에 업로드합니다.

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 Drive에 호스팅된 파일을 외부 스테이지에서 참조하는 외부 위치에 업로드하여 변환을 완료하고 FILE_PATH 자리 표시자를 바꿉니다.

  • 추가 지원이 필요한 경우 snowconvert-support@snowflake.com으로 이메일을 보내주세요.

SSC-FDM-BQ0007

스프레드시트에서 읽기 기능은 Snowflake에서 지원되지 않으며, 대신 CSV 파일 형식을 사용합니다.

설명

Snowflake는 Google Sheets를 파일 형식으로 지원하지 않지만, 해당 구조는 Snowflake에서 지원하는 CSV 파일과 유사합니다.

SnowConvert AI가 GOOGLE_SHEETS 형식을 사용하여 외부 테이블을 감지하는 경우 대신 CSV 파일 형식으로 외부 테이블을 생성합니다.

이 FDM는 이제 변환에 Google Sheets 대신 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

모범 사례

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

모범 사례

SSC-FDM-BQ0010

Snowflake에는 geographic 함수가 필요하지 않습니다.

설명

이 경고는 values 절에서 geographic 함수를 사용하여 이 유형의 데이터를 삽입하는 경우에 추가됩니다. 해당 함수가 필요하지 않으며 Snowflake에서는 데이터가 WGS84 표준을 따르는 것을 자동으로 감지하기 때문입니다.

코드 예제

입력:
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란?을 확인하세요

코드 예제

입력:
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의 values 절에서는 이러한 함수를 사용할 수 없으며, 대신 하위 쿼리를 사용할 수 있습니다.

  • 추가 지원이 필요한 경우 snowconvert-support@snowflake.com으로 이메일을 보내주세요.