SnowConvert AI - Différences fonctionnelles BigQuery

Note

Portée de la conversion

SnowConvert AI pour Google BigQuery prend actuellement en charge l’évaluation et la traduction pour les TABLES et les VIEWS. Bien que SnowConvert AI puisse reconnaître d’autres types d’instructions, ces derniers ne sont pas complètement pris en charge.

SSC-FDM-BQ0001

L’accès aux tableaux produit NULL au lieu d’une erreur pour les index positifs hors limites dans Snowflake.

Description

Lors de l’accès à un objet ARRAY par index dans Snowflake, spécifier un index supérieur à la taille du tableau entraînera une valeur NULL. Cela diffère du comportement de BigQuery, où l’accès à un ARRAY avec un index hors limites produira une erreur, à moins que les fonctions SAFE_OFFSET ou SAFE_ORDINAL soient utilisées.

Cet avertissement sera ajouté à tout accès ARRAY qui n’est pas sûr.

Exemple de code

Code d’entrée :
BigQuery
 SELECT ([40, 12, 30])[8];

SELECT ([40, 12, 30])[SAFE_OFFSET(8)];
Copy
Code généré :
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

Meilleures pratiques

  • Analysez les utilisations de l’accès au tableau dans le code. Si le code d’origine ne présentait aucun risque d’erreur hors limites, aucune différence ne sera observée et cet avertissement peut être ignoré en toute sécurité.

  • Si vous avez besoin de plus d’assistance, vous pouvez nous envoyer un e-mail à snowconvert-support@snowflake.com.

SSC-FDM-BQ0002

Les variables système d’exception ne sont pas prises en charge dans Snowflake.

Description

Ce FDM est ajouté lorsqu’une instruction fait référence à des variables d’exception dans BigQuery, car elles ne sont pas prises en charge dans Snowflake, et le contenu de ces variables est tout à fait différent des variables d’exception autorisées dans Snowflake. Pour plus d’informations, veuillez vous référer à Traitement des exceptions dans Snowflake.

Exemple de code

Code d’entrée :
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
Résultat
 [{
  "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
Code généré :
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
Résultat
 {
  "SQLCODE": 100051,
  "SQLERRM": "Division by zero",
  "SQLSTATE": "22012"
}
Copy

Meilleures pratiques

  • Snowflake possède trois variables intégrées qui fournissent des informations sur l’exception :

    1. SQLSTATE : Il s’agit d’un code à 5 caractères calqué sur la norme ANSI SQL standard (SQLSTATE.

    2. SQLERRM : Il s’agit d’un message d’erreur.

    3. SQLCODE : Il s’agit d’un nombre entier signé de 5 chiffres.

  • Si vous avez besoin de plus d’assistance, vous pouvez nous envoyer un e-mail à snowconvert-support@snowflake.com.

SSC-FDM-BQ0003

Impossible de générer la clause de table de retour correcte en raison d’informations manquantes sur l’objet dépendant.

Description

Snowflake requiert une clause RETURNS TABLE valide pour les instructions CREATE TABLE FUNCTION.

SnowConvert AI peut rencontrer des scénarios où le code source BigQuery d’origine ne possède pas de clause RETURNS TABLE et doit en construire une nouvelle à partir de zéro. Pour ce faire, une analyse est effectuée sur la requête CREATE TABLE FUNCTION afin d’inférer correctement les types des colonnes de la table résultante. Lorsque SnowConvert AI ne peut pas collecter les informations requises, cet EWI est ajouté.

Exemple de code

Code d’entrée :
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
Code généré :
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

Meilleures pratiques

  • Essayez toujours d’inclure les définitions d’objets dépendants dans le code d’entrée, de sorte que SnowConvert AI ait accès aux informations importantes.

  • Si vous avez besoin de plus d’assistance, vous pouvez nous envoyer un e-mail à snowconvert-support@snowflake.com.

SSC-FDM-BQ0004

La fonction INFER_SCHEMA requiert un chemin de fichier sans caractères de remplacement pour générer le modèle de table. Remplacez l’espace réservé FILE_PATH par celui-ci.

Avertissement

Ce FDM est obsolète. Reportez-vous à SSC-FDM-0035 pour la dernière version de ce FDM.

Description

La fonction INFER_SCHEMA est utilisée dans Snowflake pour générer la définition des colonnes d’une table en fonction de la structure d’un fichier. Elle nécessite un paramètre LOCATION qui spécifie le chemin d’accès à un fichier ou à un dossier qui sera utilisé pour créer les colonnes de la table. Cependant, ce chemin d’accès ne prend pas en charge les expressions régulières, ce qui signifie que le caractère générique * n’est pas pris en charge.

Lorsque la table ne contient pas de colonnes, SnowConvert AI vérifiera tous les URIS afin d’en trouver un qui n’utilise pas de caractères génériques et de l’utiliser dans la fonction INFER_SCHEMA. Lorsqu’aucun URI ne répond à de tels critères, ce FDM et un espace réservé FILE_PATH seront générés. L’espace réservé doit être remplacé par le chemin de l’un des fichiers référencés par la table externe pour générer les colonnes de la table.

Exemple de code

Code d’entrée :
BigQuery
 CREATE OR REPLACE EXTERNAL TABLE test.my_external_table_json2
OPTIONS(
  FORMAT='JSON',
  URIS=['gs://sc_external_table_bucket/folder_with_json/*']
);
Copy
Code généré :
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

Meilleures pratiques

SSC-FDM-BQ0005

L’analyse de l’en-tête CSV n’est pas prise en charge dans les tables externes. Les colonnes doivent être renommées pour correspondre aux noms d’origine.

Description

Actuellement, les tables externes Snowflake ne prennent pas en charge l’analyse de l’en-tête des fichiers CSV. Lorsqu’une table externe sans liste de colonnes explicite et sans format de fichier CSV sera trouvée, SnowConvert AI produira l’option de format de fichier SKIP_HEADER pour éviter les erreurs d’exécution. Cependant, les noms des colonnes de la table auront les noms auto-générés c1, c2, …, cN.

Ce FDM est généré pour notifier que l’en-tête ne peut pas être analysé et que renommer manuellement les colonnes est nécessaire pour préserver les noms d’origine des colonnes.

Exemple de code

Code d’entrée :
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
Code généré :
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

Meilleures pratiques

  • Veuillez renommer les colonnes de la table en utilisant leurs noms d’origine dans le fichier pour terminer la transformation.

  • Si vous avez besoin de plus d’assistance, vous pouvez nous envoyer un e-mail à snowconvert-support@snowflake.com.

SSC-FDM-BQ0006

La lecture à partir de Google Drive n’est pas prise en charge dans Snowflake. Chargez les fichiers vers l’emplacement externe et remplacez les espaces réservés FILE_PATH.

Description

Snowflake ne prend pas en charge la lecture de données à partir de fichiers hébergés dans Google Drive. Ce FDM est généré pour le notifier. Veuillez charger les fichiers Google Drive vers l’emplacement externe afin qu’ils soient accessibles via la zone de préparation externe.

La clause PATTERN contiendra les espaces réservés auto-générés FILE_PATH0, FILE_PATH1, …, FILE_PATHN, qui doivent être remplacés par le chemin d’accès du fichier/dossier après le déplacement des fichiers vers l’emplacement externe.

Exemple de code

Code d’entrée :
BigQuery
 CREATE OR REPLACE EXTERNAL TABLE test.my_external_table_drive_test
OPTIONS(
  FORMAT='JSON',
  URIS=['https://drive.google.com/open?id=someFileId']
);
Copy
Code généré :
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

Meilleures pratiques

  • Terminez la transformation en chargeant les fichiers hébergés dans Google Drive vers l’emplacement externe référencé par la zone de préparation externe et remplacez les espaces réservés FILE_PATH.

  • Si vous avez besoin de plus d’assistance, vous pouvez nous envoyer un e-mail à snowconvert-support@snowflake.com.

SSC-FDM-BQ0007

La lecture à partir de feuilles de calcul n’est pas prise en charge dans Snowflake. Utilisez le type de fichier CSV à la place.

Description

Snowflake ne prend pas en charge Google Sheets en tant que format de fichier. Cependant, sa structure est similaire à celle des fichiers CSV, qui sont pris en charge par Snowflake.

Lorsque SnowConvert AI détectera une table externe utilisant le format GOOGLE_SHEETS, elle produira une table externe avec le format de fichier CSV à la place.

Ce FDM est généré pour notifier l’utilisateur que la transformation attend maintenant un fichier CSV à la place de Google Sheets.

Exemple de code

Code d’entrée :
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
Code généré :
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

Meilleures pratiques

SSC-FDM-BQ0008

Où la clause fait référence à une colonne de type STRUCT.

Description

Si un objet Snowflake possède un format de valeur clé, lorsqu’une comparaison est effectuée avec un autre objet, Snowflake compare à la fois la clé et la valeur. En revanche, lorsque BigQuery effectue une comparaison entre des structures, il ne compare que les valeurs, que la structure ait des clés ou non.

Cette différence entre les comparaisons peut entraîner des résultats différents dans SnowConvert AI et BigQuery pour une même comparaison. Ce FDM est ajouté lorsqu’une comparaison est effectuée sur un objet Snowflake créé à partir d’une structure BigQuery.

Exemple de code

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

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

Meilleures pratiques

SSC-FDM-BQ0010

La fonction géographique n’est pas requise dans Snowflake.

Description

Cet avertissement est ajouté en cas d’utilisation de fonctions géographiques dans la clause de valeurs pour insérer des données de ce type. Cela est dû au fait qu’elles ne sont pas nécessaires et que Snowflake détecte automatiquement que les données suivent le standard WGS 84.

Exemple de code

Entrée :
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
Sortie :
Requête
 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

Les paramètres nommés dans ce script ont été transformés en variables Snowflake CLI.

Description

Lorsque vous travaillez avec des requêtes BigQuery, il est possible de spécifier des paramètres nommés en utilisant la syntaxe @parameter_name. Chaque fois qu’une requête paramétrée est trouvée dans le code d’entrée, SnowConvert générera ce FDM au début du script pour indiquer à l’utilisateur que les paramètres nommés ont été transformés en variables Snowflake CLI.

Pour exécuter les scripts .sql transformés contenant des paramètres nommés, exécutez Snowflake CLI en utilisant la substitution de variables.

Pour plus d’informations sur la configuration et l’utilisation de la vérification Snowflake CLI, consultez Qu’est-ce que Snowflake CLI ?.

Exemple de code

Entrée :
BigQuery
SELECT column1 FROM test.parametersExample WHERE column2 = @searchValue;
Copy
Exemple d’exécution (avec la commande bq query)
bq query \
  --use_legacy_sql=false \
  --parameter=searchValue:Int64:80 \
  'SELECT column1 FROM test.parametersExample WHERE column2 = @searchValue'
Copy
Sortie :
Snowflake
--** SSC-FDM-BQ0011 - NAMED PARAMETERS IN THIS SCRIPT WERE TRANSFORMED TO SNOWFLAKE CLI VARIABLES. **
SELECT column1 FROM
test.parametersExample
WHERE column2 = <% searchValue %>;
Copy
Exemple d’exécution (Snowflake CLI)
snow sql -f output_file_path -D "searchValue=80"
Copy

Recommandations

  • L’utilisation de ces fonctions dans la clause des valeurs dans Snowflake n’est pas autorisée. Vous pouvez utiliser une sous-requête à la place.

  • Si vous avez besoin de plus d’assistance, vous pouvez nous envoyer un e-mail à snowconvert-support@snowflake.com.