SnowConvert AI – Diferenças funcionais do BigQuery

Nota

Escopo de conversão

O SnowConvert AI para Google BigQuery atualmente é compatível com avaliação e tradução de TABLES e VIEWS. Embora o SnowConvert AI possa reconhecer outros tipos de instruções, elas não são totalmente compatíveis.

SSC-FDM-BQ0001

O acesso a matrizes produz NULL em vez de um erro para índices positivos fora dos limites no Snowflake.

Descrição

Ao acessar um objeto ARRAY por índice no Snowflake, especificar um índice maior que o tamanho da matriz resultará em um valor NULL. Isso difere do comportamento do BigQuery, em que acessar um ARRAY com um índice fora dos limites produzirá um erro, a menos que as funções SAFE_OFFSET ou SAFE_ORDINAL sejam utilizadas.

Este aviso será adicionado a qualquer acesso a ARRAY que não seja seguro.

Exemplo de código

Código de entrada:
BigQuery
 SELECT ([40, 12, 30])[8];

SELECT ([40, 12, 30])[SAFE_OFFSET(8)];
Copy
Código gerado:
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

Práticas recomendadas

  • Analise os usos de acesso à matriz no código. Se nunca houve o risco de obter um erro de índice fora dos limites no código original, nenhuma diferença será observada e este aviso poderá ser ignorado com segurança.

  • Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com

SSC-FDM-BQ0002

Variáveis de sistema de exceção não são compatíveis com o Snowflake.

Descrição

Esta FDM é adicionada quando uma instrução faz referência a variáveis de exceção no BigQuery porque elas não são compatíveis com o Snowflake, e o conteúdo dessas variáveis é bastante diferente das variáveis de exceção permitidas no Snowflake. Para obter mais informações, consulte Tratamento de exceções no Snowflake.

Exemplo de código

Código de entrada:
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
Resultado
 [{
  "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
Código gerado:
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
Resultado
 {
  "SQLCODE": 100051,
  "SQLERRM": "Division by zero",
  "SQLSTATE": "22012"
}
Copy

Práticas recomendadas

  • O Snowflake tem três variáveis internas que fornecem informações sobre a exceção:

    1. SQLSTATE: Este é um código de 5 caracteres modelado no padrão ANSI SQL SQLSTATE.

    2. SQLERRM: Esta é uma mensagem de erro.

    3. SQLCODE: Este é um número inteiro de 5 dígitos com sinal.

  • Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com

SSC-FDM-BQ0003

Não foi possível gerar a cláusula de tabela de retorno correta devido à falta de informações sobre o objeto dependente.

Descrição

O Snowflake requer uma cláusula RETURNS TABLE válida para instruções CREATE TABLE FUNCTION.

O SnowConvert AI pode encontrar cenários em que o código-fonte do BigQuery original não tem uma cláusula RETURNS TABLE e precisa criar uma nova do zero. Para isso, é feita uma análise da consulta CREATE TABLE FUNCTION para inferir corretamente os tipos das colunas da tabela resultante. Quando o SnowConvert AI não consegue coletar as informações necessárias, esta EWI é adicionada.

Exemplo de código

Código de entrada:
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
Código gerado:
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

Práticas recomendadas

  • Sempre tente incluir as definições de objetos dependentes no código de entrada, para que o SnowConvert AI tenha acesso a informações importantes.

  • Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com

SSC-FDM-BQ0004

A função INFER_SCHEMA requer um caminho de arquivo sem curingas para gerar o modelo de tabela; substitua o espaço reservado FILE_PATH por ela.

Aviso

Esta FDM está obsoleta. Consulte SSC-FDM-0035 para obter a versão mais recente desta FDM.

Descrição

A função INFER_SCHEMA é utilizada no Snowflake para gerar a definição de colunas de uma tabela com base na estrutura de um arquivo. Ela requer um parâmetro LOCATION que especifica o caminho para um arquivo ou pasta que será utilizado para construir as colunas da tabela. No entanto, esse caminho não é compatível com regex, o que significa que o caractere curinga * não é compatível.

Quando a tabela não tem colunas, o SnowConvert AI verifica todas as URIS para encontrar uma que não use curingas e a usará na função INFER_SCHEMA. Quando nenhuma URI atender a esses critérios, esta FDM e um espaço reservado FILE_PATH serão gerados. O espaço reservado deve ser substituído pelo caminho de um dos arquivos referenciados pela tabela externa para gerar as colunas da tabela.

Exemplo de código

Código de entrada:
BigQuery
 CREATE OR REPLACE EXTERNAL TABLE test.my_external_table_json2
OPTIONS(
  FORMAT='JSON',
  URIS=['gs://sc_external_table_bucket/folder_with_json/*']
);
Copy
Código gerado:
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

Práticas recomendadas

SSC-FDM-BQ0005

A análise do cabeçalho CSV não é compatível em tabelas externas; as colunas devem ser renomeadas para corresponder aos nomes originais.

Descrição

Atualmente, as tabelas externas do Snowflake não são compatíveis com a análise do cabeçalho de arquivos CSV. Quando uma tabela externa sem uma lista de colunas explícita e com formato de arquivo CSV é encontrada, o SnowConvert AI produz a opção de formato de arquivo SKIP_HEADER para evitar erros de tempo de execução; no entanto, isso faz com que os nomes das colunas da tabela tenham os nomes c1, c2, …, cN gerados automaticamente.

Esta FDM é gerada para notificar que o cabeçalho não pode ser analisado e que a renomeação manual das colunas é necessária para preservar os nomes originais das colunas.

Exemplo de código

Código de entrada:
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
Código gerado:
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

Práticas recomendadas

  • Renomeie as colunas da tabela para seus nomes originais do arquivo para concluir a transformação.

  • Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com

SSC-FDM-BQ0006

A leitura do Google Drive não é compatível com o Snowflake. Carregue os arquivos para a localização externa e substitua os espaços reservados FILE_PATH.

Descrição

O Snowflake não é compatível com a leitura de dados de arquivos hospedados no Google Drive. Esta FDM é gerada para notificar isso. Carregue dos arquivos do Google Drive para a localização externa para que possam ser acessados por meio da área de preparação externa.

A cláusula PATTERN conterá espaços reservados FILE_PATH0, FILE_PATH1, …, FILE_PATHN gerados automaticamente que devem ser substituídos pelo caminho do arquivo/pasta após os arquivos serem movidos para a localização externa.

Exemplo de código

Código de entrada:
BigQuery
 CREATE OR REPLACE EXTERNAL TABLE test.my_external_table_drive_test
OPTIONS(
  FORMAT='JSON',
  URIS=['https://drive.google.com/open?id=someFileId']
);
Copy
Código gerado:
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

Práticas recomendadas

  • Conclua a transformação carregando os arquivos hospedados no Google Drive para a localização externa referenciada pela área de preparação externa e substitua os espaços reservados FILE_PATH

  • Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com

SSC-FDM-BQ0007

A leitura de planilhas não é compatível com o Snowflake; use o tipo de arquivo CSV em vez disso

Descrição

O Snowflake não é compatível com o Planilhas Google como formato de arquivo; no entanto, a estrutura dele é semelhante aos arquivos CSV, que são compatíveis com o Snowflake.

Quando o SnowConvert AI detecta uma tabela externa que usa o formato GOOGLE_SHEETS, ele produz uma tabela externa com o formato de arquivo CSV.

Esta FDM é gerada para notificar o usuário de que a transformação agora espera um arquivo CSV em vez de um do Planilhas Google.

Exemplo de código

Código de entrada:
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
Código gerado:
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

Práticas recomendadas

SSC-FDM-BQ0008

A cláusula WHERE referencia uma coluna do tipo STRUCT.

Descrição

Se um objeto do Snowflake tiver um formato de chave-valor, quando uma comparação for feita com outro objeto, o Snowflake vai comparar tanto a chave quanto o valor. Por outro lado, quando o BigQuery compara entre estruturas, ele compara apenas valores, independentemente de a estrutura ter chaves ou não.

Essa diferença entre as comparações pode fazer com que os resultados não sejam os mesmos no SnowConvert AI e no BigQuery para a mesma comparação. Esta FDM é adicionada quando uma comparação é feita em um objeto do Snowflake criado a partir de uma estrutura do BigQuery.

Exemplo de código

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

SELECT * FROM test.compExprTable WHERE COL1 <> (COL2);
Copy
Saída:
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

Práticas recomendadas

SSC-FDM-BQ0010

A função de geografia não é necessária no Snowflake.

Descrição

Este aviso é adicionado para o uso de funções geográficas na cláusula de valores para inserir dados desse tipo. Isso ocorre porque elas não são necessárias e o Snowflake detecta automaticamente que os dados seguem o padrão WGS 84.

Exemplo de código

Entrada:
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
Saída:
Consulta
 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

Os parâmetros nomeados neste script foram transformados em variáveis da CLI do Snowflake.

Descrição

Ao trabalhar com consultas do BigQuery, é possível especificar parâmetros nomeados usando a sintaxe @parameter_name. Sempre que uma consulta parametrizada for encontrada no código de entrada, o SnowConvert gerará esta FDM no início do script para indicar ao usuário que os parâmetros nomeados foram transformados em variáveis da CLI do Snowflake.

Para executar os scripts .sql transformados que contêm parâmetros nomeados, execute a CLI do Snowflake usando substituição de variáveis.

Para obter mais informações sobre como configurar e usar a CLI do Snowflake, consulte O que é a CLI do Snowflake?

Exemplo de código

Entrada:
BigQuery
SELECT column1 FROM test.parametersExample WHERE column2 = @searchValue;
Copy
Exemplo de execução (usando o comando bq query)
bq query \
  --use_legacy_sql=false \
  --parameter=searchValue:Int64:80 \
  'SELECT column1 FROM test.parametersExample WHERE column2 = @searchValue'
Copy
Saída:
Snowflake
--** SSC-FDM-BQ0011 - NAMED PARAMETERS IN THIS SCRIPT WERE TRANSFORMED TO SNOWFLAKE CLI VARIABLES. **
SELECT column1 FROM
test.parametersExample
WHERE column2 = <% searchValue %>;
Copy
Exemplo de execução (CLI do Snowflake)
snow sql -f output_file_path -D "searchValue=80"
Copy

Recomendações

  • O uso dessas funções na cláusula de valores do Snowflake não é permitido; você pode usar uma subconsulta.

  • Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com