SnowConvert AI - Différences fonctionnelles générales

SSC-FDM-0001

Les vues qui sélectionnent toutes les colonnes d’une seule table ne sont pas requises dans Snowflake.

Note

Certaines parties du code de sortie sont omises pour des raisons de clarté.

Description

Les vues qui sélectionnent uniquement toutes les colonnes d’une seule table et qui ne comportent aucune clause de filtrage ne sont pas requises dans Snowflake et peuvent affecter les performances.

Exemple de code

Code d’entrée (Oracle) :
 CREATE OR REPLACE VIEW simpleView1
AS
SELECT
*
FROM
simpleTable;

CREATE OR REPLACE VIEW simpleView2
AS
SELECT
*
FROM
simpleTable GROUP BY col1;
Code généré :
 CREATE OR REPLACE VIEW simpleView1
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
AS
--** SSC-FDM-0001 - VIEWS SELECTING ALL COLUMNS FROM A SINGLE TABLE ARE NOT REQUIRED IN SNOWFLAKE AND MAY IMPACT PERFORMANCE. **
SELECT
*
FROM
simpleTable;

CREATE OR REPLACE VIEW simpleView2
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
AS
--** SSC-FDM-0001 - VIEWS SELECTING ALL COLUMNS FROM A SINGLE TABLE ARE NOT REQUIRED IN SNOWFLAKE AND MAY IMPACT PERFORMANCE. **
SELECT
*
FROM
simpleTable
GROUP BY col1;

Meilleures pratiques

SSC-FDM-0002

La sous-requête corrélée peut présenter des différences fonctionnelles.

Description

Ce message est émis lorsqu’une sous-requête corrélée (sous-requête qui fait référence à une colonne de la requête externe) est localisée. Ce type de sous-requête peut, dans certains cas, présenter certaines différences fonctionnelles dans Snowflake (Utilisation des sous-requêtes).

Exemple de code

Code d’entrée :
 CREATE TABLE schema1.table1(column1 NVARCHAR(50), column2 NVARCHAR(50));
CREATE TABLE schemaA.tableA(columnA NVARCHAR(50), columnB NVARCHAR(50));

--Correlated Subquery
SELECT columnA FROM schemaA.tableA ta WHERE columnA = (SELECT SUM(column1) FROM schema1.table1 t1 WHERE t1.column1 = ta.columnA);
Code généré :
 CREATE OR REPLACE TABLE schema1.table1 (
column1 VARCHAR(50),
column2 VARCHAR(50))
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "transact",  "convertedOn": "10/11/2024",  "domain": "test" }}'
;

CREATE OR REPLACE TABLE schemaA.tableA (
columnA VARCHAR(50),
columnB VARCHAR(50))
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "transact",  "convertedOn": "10/11/2024",  "domain": "test" }}'
;

--Correlated Subquery
SELECT
columnA
FROM
schemaA.tableA ta
WHERE
columnA =
          --** SSC-FDM-0002 - CORRELATED SUBQUERIES MAY HAVE SOME FUNCTIONAL DIFFERENCES. **
          (SELECT
          SUM(column1) FROM
          schema1.table1 t1
          WHERE
          t1.column1 = ta.columnA
          );

Meilleures pratiques

SSC-FDM-0003

Incohérence du taux de conversion

Description

Ce message est émis lorsqu’une incohérence du taux de conversion est détectée dans le champ d’évaluation spécifié. Ces situations sont résolues automatiquement par SnowConvert AI. Il ne s’agit donc que d’un avertissement à titre informatif.

Note

Cet avertissement à titre informatif ne sera visible que dans les documents d’évaluation, et non dans le code de sortie.

Meilleures pratiques

  • Bien que SnowConvert AI soit en mesure de résoudre automatiquement le problème, vous pouvez notifier l’équipe d’assistance de SnowConvert AI en envoyant un e-mail à snowconvert-support@snowflake.com et en spécifiant le problème.

SSC-FDM-0004

Table externe traduite en table ordinaire

Description

This warning is added to clauses related to external handling. Snowflake recommends that all data should be managed inside the Snowflake data storage. For more information on this subject, see the Snowflake data storage considerations.

Exemple de code

Code d’entrée :
 CREATE EXTERNAL TABLE ext_csv_file (
    id INT,
    name TEXT,
    age INT,
    city TEXT
)
LOCATION (
    'gpfdist://192.168.1.100:8080/data/my_data.csv'
)
FORMAT 'CSV' (DELIMITER ',' HEADER);
Code généré :
 --** SSC-FDM-0004 - EXTERNAL TABLE TRANSLATED TO REGULAR TABLE **
CREATE TABLE ext_csv_file (
       id INT,
       name TEXT,
       age INT,
       city TEXT
   )
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "greenplum",  "convertedOn": "07/09/2025",  "domain": "no-domain-provided" }}'
;

Meilleures pratiques

  • Les données stockées dans les fichiers des tables externes doivent être déplacées d’une manière ou d’une autre dans la base de données de Snowflake.

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

SSC-FDM-0005

TIME ZONE non pris en charge pour le type de données Time

Description

Le type de données Time dans Snowflake ne stocke pas les valeurs Timezone.

TIME internally stores “wallclock” time, and all operations on TIME values are performed without taking any time zone into consideration. For more information, see the Snowflake TIME data type documentation.

Exemple de code

Code d’entrée :
 CREATE TABLE TABLE_TIME_TYPE (
    COLNAME TIME (9) WITH TIME ZONE
);
Code généré :
 CREATE OR REPLACE TABLE TABLE_TIME_TYPE (
    COLNAME TIME(9) /*** SSC-FDM-0005 - TIME ZONE NOT SUPPORTED FOR TIME DATA TYPE ***/
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"teradata"}}'
;

Meilleures pratiques

  • Aucune action de la part de l’utilisateur final n’est requise.

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

SSC-FDM-0006

La colonne Number Type peut ne pas se comporter de la même manière dans Snowflake.

Description

Ce message de différence fonctionnelle apparaît lorsqu’une colonne NUMBER Type est en cours de création dans une table. Cela est dû à des différences arithmétiques lors de l’exécution d’opérations liées aux échelles des valeurs intermédiaires dans Snowflake, qui peuvent faire échouer certaines opérations. Pour plus d’informations, veuillez consulter l’article de Snowflake dédié aux nombres intermédiaires dans Snowflake et l’article dédié au Nombre en dehors de l’intervalle représentable.

To avoid these arithmetic issues, you can run data samplings to verify the needed precision and scales for these operations.

Exemples de codes

Table simple avec des colonnes numérotées

Code d’entrée (Oracle) :
 CREATE TABLE table1
(
column1 NUMBER,
column2 NUMBER (20, 4)
);
Code généré :
 CREATE OR REPLACE TABLE table1
(
column1 NUMBER(38, 18) /*** SSC-FDM-0006 - NUMBER TYPE COLUMN MAY NOT BEHAVE SIMILARLY IN SNOWFLAKE. ***/,
column2 NUMBER(20, 4) /*** SSC-FDM-0006 - NUMBER TYPE COLUMN MAY NOT BEHAVE SIMILARLY IN SNOWFLAKE. ***/
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
;

Exemples de problèmes arithmétiques

Les exemples suivants montrent comment les problèmes arithmétiques peuvent survenir lors de l’utilisation de colonnes de nombres :

Code Snowflake avec erreur de division :
 CREATE OR REPLACE TABLE number_table( column1 NUMBER(38, 19) );

INSERT INTO number_table VALUES (1);

SELECT column1 / column1 FROM number_table;
Code Snowflake avec erreur de multiplication :
 CREATE OR REPLACE TABLE number_table( column1 NUMBER(38, 20) );

INSERT INTO number_table VALUES (1);

SELECT column1 * column1 FROM number_table;

Lors de l’exécution d’une instruction SELECT, Snowflake renverra une erreur :

Nombre en dehors de l’intervalle représentable : type FIXEDSB16 {nullable}, valeur 1.0000000000000000000

Cela est dû au fait que le résultat de l’opération intermédiaire dépasse la capacité maximale de Snowflake. Réduire les échelles numériques de 1 sur chaque exemple corrigera l’erreur et permettra un fonctionnement normal :

Code Snowflake avec division :
 CREATE OR REPLACE TABLE number_table( column1 NUMBER(38, 18) );

INSERT INTO number_table VALUES (1);

SELECT column1 / column1 FROM number_table;
Code Snowflake avec multiplication :
 CREATE OR REPLACE TABLE numbertable( column1 NUMBER(38, 19) );

INSERT INTO number_table VALUES (1);

SELECT column1 * column1 FROM number_table;

C’est pour cette raison que SnowConvert AI définit l’échelle par défaut des nombres à 18, réduisant ainsi le nombre d’erreurs lors de la migration.

Meilleures pratiques

  • Vérifiez que les valeurs intermédiaires de vos opérations ne dépassent pas une échelle de 37, car il s’agit de la valeur maximale pour Snowflake.

  • Exécutez des échantillonnages de données sur vos données afin de vous assurer de la précision et de l’échelle requises avant d’exécuter une opération.

  • Dans la plupart des cas, après avoir effectué des échantillonnages de données ou discuté avec l’entreprise, vous pouvez constater que la précision peut varier. Par exemple, pour les colonnes MONEY, une précision typique est NUMBER(20,4). Dans Snowflake, vous ne pouvez pas modifier facilement le type de données d’une colonne. Vous pouvez consulter cet article sur notre forum, qui fournit quelques conseils sur la manière de modifier les types de données de vos colonnes et de préserver vos données.

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

SSC-FDM-0007

Élément avec dépendances manquantes

Note

Certaines parties du code de sortie sont omises pour des raisons de clarté.

Description

Il manque une dépendance pour un objet. Snow Convert n’a pas pu résoudre certains types de données. Il existe également une possibilité d’erreur de déploiement si la dépendance ne figurait pas dans le code source.

Exemple de code

Code d’entrée :
 CREATE VIEW VIEW01 AS SELECT * FROM TABLE1;
Code généré :
 --** SSC-FDM-0007 - MISSING DEPENDENT OBJECT "TABLE1" **
CREATE OR REPLACE VIEW VIEW01
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"teradata"}}'
AS
--** SSC-FDM-0001 - VIEWS SELECTING ALL COLUMNS FROM A SINGLE TABLE ARE NOT REQUIRED IN SNOWFLAKE AND MAY IMPACT PERFORMANCE. **
SELECT
* FROM
TABLE1;

Note

Notez que la définition de la TABLE1 est manquante.

Meilleures pratiques

  • Assurez-vous que toutes les dépendances des objets figurent dans le code source.

  • Si ce n’est pas le cas, recherchez les références à l’objet dans le code et vérifiez si les opérations sont bien gérées.

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

SSC-FDM-0008

On Commit non pris en charge

Note

Certaines parties du code de sortie sont omises pour des raisons de clarté.

Description

Les clauses ON COMMIT dans votre instruction CREATE TABLE ont été commentées. Snowflake ne prend pas en charge la clause ON COMMIT, car elle est généralement utilisée pour les tables temporaires dans d’autres dialectes SQL. Si vous devez gérer un comportement spécifique à une transaction, pensez à utiliser les transactions ou les tables temporaires de Snowflake avec des instructions explicites TRUNCATE ou DROP à la place.

Exemple de code

Code d’entrée
CREATE TEMPORARY TABLE TABLE02 (COLNAME VARCHAR(20)) ON COMMIT DELETE ROWS
Code généré
CREATE OR REPLACE TEMPORARY TABLE TABLE02 (
COLNAME VARCHAR(20))
----** SSC-FDM-0008 - ON COMMIT (DELETE ROWS) IS NOT SUPPORTED **
--ON COMMIT DELETE ROWS
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "teradata",  "convertedOn": "09/22/2025",  "domain": "no-domain-provided" }}'
;

SSC-FDM-0009

Fonctionnalité GLOBAL TEMPORARY TABLE non prise en charge.

Description

Les tables temporaires globales sont considérées comme un modèle complexe en raison du fait qu’elles peuvent provenir de plusieurs variantes, comme indiqué dans la [documentation de Snowflake](https://docs.snowflake.com/fr/sql-reference/sql/create-table# variant-syntaxe).

Exemple de code

Code d’entrée
 CREATE OR REPLACE GLOBAL TEMPORARY TABLE GLOBAL_TEMP_TABLE
(
    col3 INTEGER,
    col4 VARCHAR(50)
);
Code généré
 --** SSC-FDM-0009 - GLOBAL TEMPORARY TABLE FUNCTIONALITY NOT SUPPORTED. **
CREATE OR REPLACE TABLE GLOBAL_TEMP_TABLE
    (
        col3 INTEGER,
        col4 VARCHAR(50)
    )
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
;

Meilleures pratiques

SSC-FDM-0010

Type modifié en Date.

Description

Ce message s’affiche lorsque SnowConvert AI trouve un SYSDATE DEFAULT et que le type de données n’est NOT un type de données DATE ou TIMESTAMP. Dans ce cas, le type de données est modifié en DATE.

Exemple de code

Code d’entrée
 CREATE TABLE "SYSDATE_DEFAULT_TEST_TABLE_1"( 
 "COLUMN1" VARCHAR2(30 BYTE) DEFAULT SYSDATE
);
Code généré
 CREATE OR REPLACE TABLE "SYSDATE_DEFAULT_TEST_TABLE_1" (
  "COLUMN1" TIMESTAMP DEFAULT CURRENT_TIMESTAMP() /*** SSC-FDM-0010 - CONVERTED FROM VARCHAR2 TO DATE FOR CURRENT_DATE DEFAULT ***/
 )
 COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
 ;

Meilleures pratiques

SSC-FDM-0011

Le nom de la colonne est un mot-clé réservé de Snowflake.

Note

Ce FDM est obsolète. Veuillez vous référer à la documentation SSC-EWI-0045.

Description

Les noms de colonnes sont valides pour la langue source, mais sont des mots-clés réservés dans Snowflake.

Exemple de code

Code d’entrée (Oracle) :
 CREATE TABLE T1
(
    LOCALTIME VARCHAR,
    CURRENT_USER VARCHAR
);
Code généré :
 CREATE OR REPLACE TABLE T1
    (
    --** SSC-FDM-0011 - COLUMN NAME 'LOCALTIME' IS A SNOWFLAKE RESERVED KEYWORD **
    "LOCALTIME" VARCHAR,
    --** SSC-FDM-0011 - COLUMN NAME 'CURRENT_USER' IS A SNOWFLAKE RESERVED KEYWORD **
    "CURRENT_USER" VARCHAR
    )
    COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
    ;

Meilleures pratiques

  • Envisagez de renommer les colonnes qui utilisent des noms qui ne sont pas pris en charge dans Snowflake.

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

SSC-FDM-0012

Le nom de la contrainte dans certaines contraintes n’est pas pris en charge.

Description

Ce message est ajouté lorsqu’une contrainte est de type Null, Not Null ou Default et a été définie avec un nom. Snowflake ne prend pas en charge le nom dans ces contraintes. Par conséquent, SnowConvert AI le supprimera et ajoutera le commentaire.

Exemple de code

Code d’entrée
 CREATE TABLE TABLE1 ( 
COL1 VARCHAR (10) CONSTRAINT constraintName DEFAULT ('0') NOT NULL 
);
Code généré
 CREATE OR REPLACE TABLE TABLE1 (
COL1 VARCHAR(10) DEFAULT ('0') /*** SSC-FDM-0012 - CONSTRAINT NAME 'constraintName' IN DEFAULT EXPRESSION CONSTRAINT IS NOT SUPPORTED IN SNOWFLAKE ***/ NOT NULL
)
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "transact",  "convertedOn": "07/02/2025",  "domain": "no-domain-provided" }}'
;

Meilleures pratiques

  • Aucune action de la part de l’utilisateur final n’est requise.

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

SSC-FDM-0013

L’expression du fuseau horaire n’a pas pu être mappée.

Description

This FDM message is added to indicate scenarios where the actual value of a timezone expression cannot be determined, and therefore, the translated results might be different. When the timezone value used is a literal string, SnowConvert AI can take it and map it to its corresponding timezone value in Snowflake. However, when this value is specified by an expression, SnowConvert AI cannot get the timezone value that will be used at runtime and, therefore, cannot map this value to its corresponding Snowflake equivalent.

Exemple de code

Code d’entrée (Oracle)
 SELECT TIMESTAMP '1998-12-25 09:26:50.12' AT TIME ZONE SESSIONTIMEZONE FROM DUAL;
SELECT TIMESTAMP '1998-12-25 09:26:50.12' AT TIME ZONE Expression FROM DUAL;
Code généré
 SELECT
--** SSC-FDM-0013 - TIMEZONE EXPRESSION COULD NOT BE MAPPED, RESULTS MAY BE DIFFERENT **
TO_TIMESTAMP_LTZ( TIMESTAMP '1998-12-25 09:26:50.12')
FROM DUAL;

SELECT
--** SSC-FDM-0013 - TIMEZONE EXPRESSION COULD NOT BE MAPPED, RESULTS MAY BE DIFFERENT **
CONVERT_TIMEZONE(Expression, TIMESTAMP '1998-12-25 09:26:50.12')
FROM DUAL;
Code d’entrée (Teradata)
 select TIMESTAMP '1998-12-25 09:26:50.12' AT TIME ZONE SESSIONTIMEZONE;
select current_timestamp at time zone CONCAT(' America ', ' Pacific'); 
select current_timestamp at time zone (SELECT COL1 FROM TABLE1 WHERE COL2 = 2);
Code généré
 SELECT
CONVERT_TIMEZONE(SESSIONTIMEZONE, TIMESTAMP '1998-12-25 09:26:50.12') /*** SSC-FDM-0013 - TIMEZONE EXPRESSION COULD NOT BE MAPPED, RESULTS MAY BE DIFFERENT ***/;

SELECT
CONVERT_TIMEZONE(CONCAT(' America ', ' Pacific'), CURRENT_TIMESTAMP) /*** SSC-FDM-0013 - TIMEZONE EXPRESSION COULD NOT BE MAPPED, RESULTS MAY BE DIFFERENT ***/;

SELECT
CONVERT_TIMEZONE((
SELECT
COL1 FROM
TABLE1
WHERE COL2 = 2), CURRENT_TIMESTAMP) /*** SSC-FDM-0013 - TIMEZONE EXPRESSION COULD NOT BE MAPPED, RESULTS MAY BE DIFFERENT ***/;

Note

Compatibilité des fuseaux horaires dans Oracle

La majorité des expressions de noms de fuseaux horaires dans Oracle sont directement prises en charge dans Snowflake. Le cas échéant, la migration s’exécutera sans problème. Par ailleurs, voici une liste de celles qui ne sont pas prises en charge par Snowflake pour le moment, et qui feront donc l’objet d’un message de différence fonctionnelle.

  • Afrique/Douala

  • Asie/Oulan-Bator

  • Asie/Iekaterinbourg

  • Canada/Saskatchewan de l’Est

  • CST

  • PST

  • US/Nouveau-Pacifique

Meilleures pratiques

  • Aucune action de la part de l’utilisateur final n’est requise.

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

SSC-FDM-0014

Instruction de vérification non prise en charge.

Note

Ce FDM est obsolète. Veuillez vous référer à la documentation SSC-EWI-0035.

Description

La contrainte CHECK n’est pas prise en charge par Snowflake, mais elle n’affecte pas le fonctionnement.

Exemple de code

Code d’entrée Oracle :
 CREATE TABLE "Schema"."BaseTable"(
  "COLUMN1" VARCHAR2(255),
  CHECK ( COLUMN1 IS NOT NULL )
);
Code généré:
 CREATE OR REPLACE TABLE "Schema"."BaseTable" (
    "COLUMN1" VARCHAR(255)
--                          ,
--    --** SSC-FDM-0014 - CHECK STATEMENT NOT SUPPORTED **
--    CHECK ( COLUMN1 IS NOT NULL )
  )
  COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"oracle"}}'
  ;
Code d’entrée Teradata:
 CREATE TABLE TABLE1,
    NO FALLBACK,
    NO BEFORE JOURNAL,
    NO AFTER JOURNAL
(
    COL0 BYTEINT,
    CONSTRAINT constraint_name CHECK (COL1 < COL2)
)
Code généré:
 CREATE TABLE TABLE1
(
    COL0 BYTEINT
--                ,
--    --** SSC-FDM-0014 - CHECK STATEMENT NOT SUPPORTED **
--    CONSTRAINT constraint_name CHECK (COL1 < COL2)
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"teradata"}}'
;
Code d’entrée SqlServer
 ALTER TABLE table_name2
ADD column_name VARCHAR(255)
CONSTRAINT constraint_name 
CHECK NOT FOR REPLICATION (column_name > 1);
Code généré :
 ALTER TABLE IF EXISTS table_name2
ADD column_name VARCHAR(255)
----** SSC-FDM-0014 - CHECK STATEMENT NOT SUPPORTED **
--CONSTRAINT constraint_name
--CHECK NOT FOR REPLICATION (column_name > 1)
                                           ;

Meilleures pratiques

SSC-FDM-0015

​Type personnalisé référencé dans la requête introuvable.

Description

Cette erreur se produit lorsque la définition d’un type personnalisé n’a pas été trouvée ou qu’un type de données intégré Oracle n’a pas été reconnu par SnowConvert.

Exemple de code

Code d’entrée (Oracle) :
 --Type was never defined
--CREATE TYPE type1;

CREATE TABLE table1
(
column1 type1
);
Code généré :
 --Type was never defined
--CREATE TYPE type1;

CREATE OR REPLACE TABLE table1
(
column1 VARIANT !!!RESOLVE EWI!!! /*** SSC-EWI-TS0015 - DATA TYPE TYPE1 IS NOT SUPPORTED IN SNOWFLAKE ***/!!! NOT NULL
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"transact"}}}'
;

Meilleures pratiques

  • Vérifiez que le type du type de données référencé a été défini dans le code d’entrée.

  • Consultez la [documentation] relative aux types de données de Snowflake(https://docs.snowflake.com/fr/sql-reference/data-types.html) pour trouver un équivalent pour le type de données.

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

SSC-FDM-0016

Les constantes ne sont pas prises en charge par l’Exécution de scripts Snowflake. Elles ont été transformées en variables.

Description

L’Exécution de scripts Snowflake ne prend pas en charge les constantes. Par conséquent, toutes les constantes dans les procédures sont transformées en variables lorsque l’indicateur de l’Exécution de scripts Snowflake est actif.

Exemple de code

Oracle :
 CREATE OR REPLACE PROCEDURE p_constants
AS
my_const1 CONSTANT NUMBER := 40;
my_const2 CONSTANT NUMBER NOT NULL := 40;
BEGIN
NULL;
END;
Snowflake Scripting :
 CREATE OR REPLACE PROCEDURE p_constants ()
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"oracle"}}'
EXECUTE AS CALLER
AS
$$
DECLARE
--** SSC-FDM-0016 - CONSTANTS ARE NOT SUPPORTED BY SNOWFLAKE SCRIPTING. IT WAS TRANSFORMED TO A VARIABLE **
my_const1 NUMBER(38, 18) := 40;
--** SSC-FDM-0016 - CONSTANTS ARE NOT SUPPORTED BY SNOWFLAKE SCRIPTING. IT WAS TRANSFORMED TO A VARIABLE **
--** SSC-FDM-OR0025 - NOT NULL CONSTRAINT IS NOT SUPPORTED BY SNOWFLAKE **
my_const2 NUMBER(38, 18) := 40;
BEGIN
NULL;
END;
$$;

Meilleures pratiques

  • Aucune action de la part de l’utilisateur final n’est requise.

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

SSC-FDM-0017

La clause WITH SYSTEM VERSIONING n’est pas prise en charge par Snowflake.

Description

La clause WITH SYSTEM VERSIONING dans ANSI SQL est utilisée pour activer la gestion des versions système d’une table, vous permettant de maintenir un historique des modifications apportées aux données de la table au fil du temps. Cette clause n’est pas prise en charge par Snowflake.

Exemple de code

Code d’entrée :
 CREATE TABLE t1 (
    ID INT PRIMARY KEY,
    Name VARCHAR(50),
    SysStartTime TIMESTAMP,
    SysEndTime TIMESTAMP
) WITH SYSTEM VERSIONING;
Code généré :
 CREATE TABLE t1 (
    ID INT PRIMARY KEY,
    Name VARCHAR(50),
    SysStartTime TIMESTAMP,
    SysEndTime TIMESTAMP
)
----** SSC-FDM-0017 - WITH SYSTEM VERSIONING CLAUSE IS NOT SUPPORTED BY SNOWFLAKE. **
--WITH SYSTEM VERSIONING
                      ;

Meilleures pratiques

  • You can use Time Travel in Snowflake, Time Travel enables accessing historical data (that is, data that has been changed or deleted) at any point within a defined period. It serves as a powerful tool for performing the following tasks:

    • Restaurer des objets liés aux données (tables, schémas et bases de données) qui peuvent avoir été supprimés accidentellement ou intentionnellement.

    • Dupliquer et sauvegarder des données à partir de points clés dans le passé.

    • Analyser l’utilisation et la manipulation des données sur des périodes de temps précises.

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

SSC-FDM-0018

La clause CHARACTER SET n’est pas prise en charge par Snowflake.

Description

L’option de colonne CHARACTER SET détermine l’ensemble de caractères autorisé pouvant être stocké dans la colonne. Cette clause n’est pas prise en charge par Snowflake.

Exemple de code

Code d’entrée :
 CREATE TABLE TABLE01(
    COLNAME VARCHAR(20) CHARACTER SET character_specification
);
Code généré :
 CREATE TABLE TABLE01 (
    COLNAME VARCHAR(20)
--                        --** SSC-FDM-0018 - CHARACTER SET CLAUSE IS NOT SUPPORTED BY SNOWFLAKE. **
--                        CHARACTER SET character_specification
);

Meilleures pratiques

SSC-FDM-0019

Semantic information could not be loaded.

Description

Cet avertissement indique à l’utilisateur que SnowConvert AI n’a pas pu charger les informations sémantiques pour un objet spécifique. Cela est très probablement dû à la présence d’un objet dupliqué portant le même nom, qui a empêché SnowConvert AI de charger les informations sémantiques de cet objet et de terminer l’analyse.

Exemple de code

Code d’entrée :
 CREATE TABLE T1
(
    COL1 INTEGER
);


CREATE TABLE T1
(
    COL2 INTEGER
);
Code généré:
 CREATE OR REPLACE TABLE T1
(
    COL1 INTEGER
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"teradata"}}'
;

--** SSC-FDM-0019 - SEMANTIC INFORMATION COULD NOT BE LOADED FOR T1. CHECK IF THE NAME IS INVALID OR DUPLICATED. **
CREATE TABLE T1
(
    COL2 INTEGER
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"teradata"}}'
;

Meilleures pratiques

  • Vérifiez la présence d’objets dupliqués dans le code d’entrée, car cela peut affecter le chargement des informations sémantiques.

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

SSC-FDM-0020

Les jeux de résultats multiples sont renvoyés dans des tables temporaires

Description

Les procédures d’Exécution de scripts Snowflake ne permettent de renvoyer qu’un seul jeu de résultats par procédure.

Pour répliquer le comportement de Teradata, lorsqu’il existe au moins deux jeux de résultats à renvoyer, ils sont stockés dans des tables temporaires. La procédure d’Exécution de scripts Snowflake renverra un tableau contenant le nom des tables temporaires.

Exemple de code

Code d’entrée (Teradata) :
 REPLACE MACRO sampleMacro AS 
(
    SELECT CURRENT_DATE AS DT;
    SELECT CURRENT_DATE AS DT_TWO;
);
Code généré :
 CREATE OR REPLACE PROCEDURE sampleMacro ()
RETURNS ARRAY
LANGUAGE SQL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"teradata"}}'
EXECUTE AS CALLER
AS
$$
    DECLARE
        return_arr ARRAY := array_construct();
        tbl_nm VARCHAR;
    BEGIN
        tbl_nm := 'RESULTSET_' || REPLACE(UPPER(UUID_STRING()), '-', '_');
        CREATE OR REPLACE TEMPORARY TABLE IDENTIFIER(:tbl_nm) AS
            SELECT
                CURRENT_DATE() AS DT;
        return_arr := array_append(return_arr, :tbl_nm);
        tbl_nm := 'RESULTSET_' || REPLACE(UPPER(UUID_STRING()), '-', '_');
        CREATE OR REPLACE TEMPORARY TABLE IDENTIFIER(:tbl_nm) AS
            SELECT
                CURRENT_DATE() AS DT_TWO;
        return_arr := array_append(return_arr, :tbl_nm);
        --** SSC-FDM-0020 - MULTIPLE RESULT SETS ARE RETURNED IN TEMPORARY TABLES **
        RETURN return_arr;
    END;
$$;

Meilleures pratiques

  • Pour obtenir les jeux de résultats, il est nécessaire d’exécuter une requête SELECT avec le nom des tables temporaires renvoyées par la procédure.

  • Dans la mesure du possible, évitez les procédures qui renvoient plusieurs jeux de résultats. Au lieu de cela, attribuez-leur une seule responsabilité pour des résultats plus directs.

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

SSC-FDM-0021

Create Index non pris en charge

Description

Pour des raisons architecturales, Snowflake ne prend pas en charge les index. Par conséquent, SnowConvert AI commentera tout le code lié à la création d’index. Snowflake crée automatiquement des micro-partitions pour chaque table, ce qui permet d’accélérer les performances des opérations DML. L’utilisateur n’a pas à se soucier de créer ou de gérer ces micro-partitions.

En règle générale, cela est suffisant pour obtenir de très bonnes performances des requêtes. Cependant, il existe d’autres moyens d’améliorer les performances en créant des clés de clustering de données. La page officielle de Snowflake fournit plus d’informations sur les micro-partitions et le clustering de données.

Exemple de code

Code d’entrée (Oracle) :
 CREATE INDEX index1
ON table1(column1);
Code généré :
 ----** SSC-FDM-0021 - CREATE INDEX IS NOT SUPPORTED BY SNOWFLAKE **
----** SSC-FDM-0007 - MISSING DEPENDENT OBJECT "table1" **
--CREATE INDEX index1
--ON table1(column1)
                  ;

Meilleures pratiques

  • Le clustering de données peut constituer un moyen d’accélérer les performances des requêtes sur les tables.

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

SSC-FDM-0022

L’unité de cadre de fenêtre a été modifiée en lignes.

Gravité

Faible

Description

Cet avertissement est ajouté lorsqu’une unité de cadre de fenêtre non prise en charge a été modifiée en lignes, entraînant des différences de sortie. Un exemple de ceci est l’unité GROUPS, qui n’est pas prise en charge par Snowflake.

Veuillez noter que ce message est également utilisé dans les cas où une unité de cadre de fenêtre est partiellement non prise en charge, ce qui entraîne sa modification, comme l’unité RANGE.

Exemple de code

Prenons les données suivantes à titre d’exemple pour expliquer cela.

C_NAME

C_BIRTH_DAY

USA

1

USA

4

Pologne

9

Canada

10

USA

5

Canada

12

Costa Rica

3

Pologne

4

USA

2

Costa Rica

7

Costa Rica

10

Oracle :
Code
SELECT
    C_NAME,
    SUM(C_BIRTH_DAY)
    OVER (ORDER BY C_BIRTH_DAY
    RANGE BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING) AS MAX1
FROM WINDOW_TABLE;
Résultat

C_NAME

MAX1

USA

-

USA

1

Costa Rica

3

USA

6

Pologne

6

USA

14

Costa Rica

19

Pologne

26

Canada

35

Costa Rica

35

Canada

55

Snowflake :
Code
 SELECT
    C_NAME,
    SUM(C_BIRTH_DAY)
    OVER (ORDER BY C_BIRTH_DAY ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING /*** SSC-FDM-0022 - WINDOW FRAME UNIT 'RANGE' WAS CHANGED TO ROWS ***/) AS MAX1
    FROM
WINDOW_TABLE;
Résultat

C_NAME

MAX1

USA

-

USA

1

Costa Rica

3

USA

6

Pologne

10

USA

14

Costa Rica

19

Pologne

26

Canada

35

Costa Rica

45

Canada

55

Meilleures pratiques

  • Assurez un ordre déterministe pour les lignes afin de garantir des sorties déterministes lors de l’exécution dans Snowflake.

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

SSC-FDM-0023

Une table temporaire globale est en cours de référence.

Gravité

Medium

Description

SnowConvert AI transforme les tables temporaires globales en création de tables ordinaires. Les références à ces tables peuvent se comporter différemment de ce qui est attendu.

Exemple de code

Entrée
 create global temporary table t1 
    (col1 varchar); 
create view view1 as 
    select col1 from t1;
Sortie
 --** SSC-FDM-0009 - GLOBAL TEMPORARY TABLE FUNCTIONALITY NOT SUPPORTED. **
CREATE OR REPLACE TABLE t1
    (col1 varchar)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"oracle"}}'
;

CREATE OR REPLACE VIEW view1
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"oracle"}}'
AS
select col1 from
    --** SSC-FDM-0023 - A Global Temporary Table is being referenced **
    t1;

Meilleures pratiques

SSC-FDM-0024

La fonctionnalité n’est actuellement pas prise en charge par l’Exécution de scripts Snowflake.

Note

Ce FDM est obsolète. Veuillez vous référer à la documentation SSC-EWI-0058.

Description

Cette erreur se produit lorsqu’une instruction utilisée dans une procédure de création n’est actuellement pas prise en charge par l’Exécution de scripts Snowflake.

Exemple de code

Code d’entrée (Oracle) :
 CREATE OR REPLACE PROCEDURE PROC01
IS
  number_variable INTEGER;
BEGIN
  EXECUTE IMMEDIATE 'SELECT 1 FROM DUAL' INTO number_variable;
END;
Code généré :
 CREATE OR REPLACE PROCEDURE PROC01 ()
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
EXECUTE AS CALLER
AS
$$
  DECLARE
    number_variable INTEGER;
  BEGIN
    EXECUTE IMMEDIATE 'SELECT 1 FROM DUAL'
--                                           --** SSC-FDM-0024 - FUNCTIONALITY FOR 'EXECUTE IMMEDIATE RETURNING CLAUSE' IS NOT CURRENTLY SUPPORTED BY SNOWFLAKE SCRIPTING **
--                                           INTO number_variable
                                                               ;
  END;
$$;

Meilleures pratiques

  • Aucune action de la part de l’utilisateur final n’est requise.

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

SSC-FDM-0025

Unexpected end of statement

Description

This message is reported when SnowConvert AI encounters an unexpected end of statement during conversion. This typically occurs when the parser reaches the end of the source code while still expecting additional tokens to complete a statement. The EWI includes the line number of the original source code where the issue was detected.

Exemple de code

Code d’entrée :
 UPDATE orders
SET total = 100
WHERE order_id = 1
Code généré :
 --** SSC-FDM-0025 - UNEXPECTED END OF STATEMENT. PLEASE CHECK THE LINE 5 OF ORIGINAL SOURCE CODE. **
UPDATE orders
SET total = 100
WHERE order_id = 1;

Meilleures pratiques

  • Check the specified line in the original source code for missing semicolons or incomplete statements.

  • Ensure all statements are properly terminated.

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

SSC-FDM-0026

Type non pris en charge par Snowflake

Note

Ce FDM est obsolète. Veuillez vous référer à la documentation SSC-EWI-0028.

Description

Ce message apparaît lorsqu’un type n’est pas pris en charge dans Snowflake.

Exemple

Code d’entrée (Oracle) :
 CREATE TABLE MYTABLE
(
    COL1 SYS.ANYDATASET
);
Code généré :
 CREATE OR REPLACE TABLE MYTABLE
    (
    --** SSC-FDM-0026 - TYPE NOT SUPPORTED BY SNOWFLAKE **
        COL1 SYS.ANYDATASET
    )
    COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"oracle"}}'
    ;

Meilleures pratiques

SSC-FDM-0027

Removed next statement, not applicable in Snowflake.

Note

Certaines parties du code de sortie sont omises pour des raisons de clarté.

Description

Ce message apparaît lorsqu’une instruction spécifique n’est pas applicable dans Snowflake. Cela signifie qu’il n’existe pas d’équivalent Snowflake pour cette instruction et qu’elle n’est plus nécessaire. Pour cette raison, elle est supprimée du code source. Cependant, SnowConvert AI conserve l’instruction d’origine dans le commentaire de fin.

Exemple de code

Code d’entrée:�
 .LOGTABLE tduser.Employee_log;  
   .BEGIN MLOAD TABLES Employee_Stg;  
      .LAYOUT Employee;  
      .FIELD in_EmployeeNo * VARCHAR(10);  
      .FIELD in_FirstName * VARCHAR(30); 
      .FIELD in_LastName * VARCHAR(30);  
      .FIELD in_BirthDate * VARCHAR(10); 
      .FIELD in_JoinedDate * VARCHAR(10);  
      .FIELD in_DepartmentNo * VARCHAR(02);

      .dml label EmpLabel
  IGNORE DUPLICATE INSERT ROWS; 
      INSERT INTO Employee_Stg (
         EmployeeNo,
         FirstName,
         LastName,
         BirthDate,
         JoinedDate,
         DepartmentNo
      )  
      VALUES (
         :in_EmployeeNo,
         :in_FirstName,
         :in_Lastname,
         :in_BirthDate,
         :in_JoinedDate,
         :in_DepartmentNo
      );
      .IMPORT INFILE employee.txt  
      FORMAT VARTEXT ','
      LAYOUT Employee
      APPLY EmpLabel;  
   .END MLOAD;  
LOGOFF;
Code généré:
 #*** Generated code is based on the SnowConvert AI Python Helpers version 2.0.6 ***
// SnowConvert AI Helpers Code section is omitted.
 
import os
import sys
import snowconvert.helpers
from snowconvert.helpers import Export
from snowconvert.helpers import exec
from snowconvert.helpers import BeginLoading
con = None
def main():
  snowconvert.helpers.configure_log()
  con = snowconvert.helpers.log_on()
  #** SSC-FDM-0027 - REMOVED NEXT STATEMENT, NOT APPLICABLE IN SNOWFLAKE.  **
  #.LOGTABLE tduser.Employee_log
   
  #** SSC-FDM-0027 - REMOVED NEXT STATEMENT, NOT APPLICABLE IN SNOWFLAKE.  **
  #.BEGIN MLOAD TABLES Employee_Stg
   
  Employee_TableName = "Employee_TEMP_TABLE"
  Employee_Columns = """in_EmployeeNo VARCHAR(10), 
in_FirstName VARCHAR(30), 
in_LastName VARCHAR(30), 
in_BirthDate VARCHAR(10), 
in_JoinedDate VARCHAR(10), 
in_DepartmentNo VARCHAR(02)"""
  Employee_Conditions = """in_EmployeeNo AS in_EmployeeNo, in_FirstName AS in_FirstName, in_LastName AS in_LastName, in_BirthDate AS in_BirthDate, in_JoinedDate AS in_JoinedDate, in_DepartmentNo AS in_DepartmentNo"""
  def EmpLabel(tempTableName, queryConditions = ""):
    exec(f"""INSERT INTO Employee_Stg (EmployeeNo, FirstName, LastName, BirthDate, JoinedDate, DepartmentNo)
SELECT
   SRC.in_EmployeeNo,
   SRC.in_FirstName,
   :in_Lastname,
   SRC.in_BirthDate,
   SRC.in_JoinedDate,
   SRC.in_DepartmentNo
FROM {tempTableName} SRC {queryConditions}""")
  #** SSC-FDM-0027 - REMOVED NEXT STATEMENT, NOT APPLICABLE IN SNOWFLAKE. TRANSLATED BELOW **
  #.IMPORT INFILE employee.txt FORMAT VARTEXT ',' LAYOUT Employee APPLY EmpLabel
   
  snowconvert.helpers.import_file_to_temptable(fr"employee.txt", Employee_TableName, Employee_Columns, Employee_Conditions, ',')
  EmpLabel(Employee_TableName)
  exec(f"""DROP TABLE {Employee_TableName}""")

  if con is not None:
    con.close()
    con = None
  snowconvert.helpers.quit_application()

if __name__ == "__main__":
  main()

Meilleures pratiques

SSC-FDM-0028

Non pris en charge.

Note

Ce FDM est obsolète. Veuillez vous référer à la documentation SSC-EWI-0021.

Description

Ce message apparaît lorsqu’un nœud spécifique ou une instruction du code source n’est pas pris en charge dans Snowflake.

Exemple de code

Code d’entrée:�
 WITH my_av ANALYTIC VIEW AS
(USING sales_av HIERARCHIES(time_hier) ADD MEASURES(lag_sales AS (LAG(sales) OVER (HIERARCHY time_hier OFFSET 1 )))) 
SELECT aValue from my_av;
Code généré :
 ----** SSC-FDM-0028 - SubavFactoring NOT SUPPORTED IN SNOWFLAKE **
--WITH my_av ANALYTIC VIEW AS
--(USING sales_av HIERARCHIES(time_hier) ADD MEASURES(lag_sales AS (LAG(sales) OVER (HIERARCHY time_hier OFFSET 1 ))))
--SELECT aValue from my_av
                        ;

Meilleures pratiques

  • If this error happens, it is because there is no Snowflake equivalent for the node that is being converted.

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

SSC-FDM-0029

La fonction définie par l’utilisateur a été transformée en procédure Snowflake.

Avertissement

Cet EWI est obsolète. Veuillez vous référer à la documentation SSC-EWI-0068.

Gravité

Faible

Description

Les fonctions définies par l’utilisateur de Snowflake ne prennent pas en charge les mêmes fonctionnalités qu’Oracle ou SQL Server. Pour maintenir l’équivalence fonctionnelle, la fonction est transformée en procédure stockée Snowflake. Cela affectera leur utilisation dans les requêtes.

Exemple de code

SQL Server :
Code d’entrée
 CREATE OR ALTER FUNCTION PURCHASING.FOO()
RETURNS INT
AS
BEGIN
    DECLARE @i int = 0, @p int;
    Select @p = COUNT(*) FROM PURCHASING.VENDOR
    
    WHILE (@p < 1000)
    BEGIN
        SET @i = @i + 1
        SET @p = @p + @i
    END
        
    IF (@i = 6)
        RETURN 1
    
    RETURN @p
END;
Code généré
 --** SSC-FDM-0029 - USER DEFINED FUNCTION WAS TRANSFORMED TO SNOWFLAKE PROCEDURE **
CREATE OR REPLACE PROCEDURE PURCHASING.FOO ()
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"transact"}}'
EXECUTE AS CALLER
AS
$$
    DECLARE
        I INT := 0;
        P INT;
    BEGIN
         
        Select
            COUNT(*)
        INTO
            :P
 FROM
            PURCHASING.VENDOR;
        WHILE (:P < 1000) LOOP
            I := :I + 1;
            P := :P + :I;
        END LOOP;
        IF ((:I = 6)) THEN
            RETURN 1;
        END IF;
        RETURN :P;
    END;
$$;
Oracle :
Code d’entrée
 CREATE FUNCTION employee_function (param1 in NUMBER) RETURN NUMBER is
  var1    employees.employee_ID%TYPE;
  var2    employees.manager_ID%TYPE;
  var3    employees.title%TYPE;
BEGIN
  SELECT employee_ID, manager_ID, title
  INTO var1, var2, var3
  FROM employees
    START WITH manager_ID = param1
    CONNECT BY manager_ID = PRIOR employee_id;
  RETURN var1;
EXCEPTION
   WHEN no_data_found THEN RETURN param1;
END employee_function;
Code généré
 --** SSC-FDM-0029 - USER DEFINED FUNCTION WAS TRANSFORMED TO SNOWFLAKE PROCEDURE **
CREATE OR REPLACE PROCEDURE employee_function (param1 NUMBER(38, 18))
RETURNS NUMBER(38, 18)
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "oracle",  "convertedOn": "11/14/2024",  "domain": "test" }}'
EXECUTE AS CALLER
AS
$$
  DECLARE
    var1    employees.employee_ID%TYPE;
    var2    employees.manager_ID%TYPE;
    var3    employees.title%TYPE;
  BEGIN
    SELECT employee_ID, manager_ID, title
    INTO
      :var1,
      :var2,
      :var3
    FROM
      employees
      START WITH manager_ID = :param1
    CONNECT BY
      manager_ID = PRIOR employee_id;
    RETURN :var1;
  EXCEPTION
     WHEN no_data_found THEN
      RETURN :param1;
  END;
$$;

Meilleures pratiques

  • Séparez les requêtes internes pour conserver la même logique.

  • Le code source peut avoir besoin d’être restructuré pour s’adapter à l’[approche] des fonctions définies par l’utilisateur de Snowflake (https://docs.snowflake.com/fr/sql-reference/user-defined-functions.html#udfs-user-defined-functions).

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

SSC-FDM-0030

Remplacement des caractères non valides pour le nouvel identificateur

Description

L’identificateur donné contient des caractères non valides pour le langage de sortie. Ces caractères ont été remplacés par leurs codes UTF-8.

Exemple de code

Code d’entrée (Oracle) :
 CREATE PROCEDURE PROC1
AS
    "VAR0" INT;
    "VAR`/1ͷ" VARCHAR(20);
    "o*/o" FLOAT;
    " . " INT;
    ". ." INT;
    "123Name" INT;
    "return" INT;
    yield INT;
    ident#10 INT;
BEGIN
    NULL;
END;
Code généré :
 CREATE OR REPLACE PROCEDURE PROC1 ()
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"oracle"}}'
EXECUTE AS CALLER
AS
$$
    DECLARE
        "VAR0" INT;
        --** SSC-FDM-0030 - IDENTIFIER '"VAR`/1ͷ"' HAS INVALID CHARACTERS. CHARACTERS WERE REPLACED WITH THEIR UTF-8 CODES **
        VAR_u60_u2F1_uCD_B7 VARCHAR(20);
        --** SSC-FDM-0030 - IDENTIFIER '"o*/o"' HAS INVALID CHARACTERS. CHARACTERS WERE REPLACED WITH THEIR UTF-8 CODES **
        o_u2A_u2Fo FLOAT;
        --** SSC-FDM-0030 - IDENTIFIER '" . "' HAS INVALID CHARACTERS. CHARACTERS WERE REPLACED WITH THEIR UTF-8 CODES **
        _u20_u2E_u20 INT;
        --** SSC-FDM-0030 - IDENTIFIER '". ."' HAS INVALID CHARACTERS. CHARACTERS WERE REPLACED WITH THEIR UTF-8 CODES **
        _u2E_u20_u2E INT;
        "123Name" INT;
        "return" INT;
        yield INT;
        IDENT_HASHTAG_10 INT;
    BEGIN
        NULL;
    END;
$$;

Meilleures pratiques

  • Aucune action de la part de l’utilisateur final n’est requise.

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

SSC-FDM-0031

Paramètres des tables dynamiques requis définis par défaut

Description

Les vues matérialisées (et les index de jointure dans le cas de Teradata) sont migrées vers des tables dynamiques dans Snowflake. Les tables dynamiques nécessitent de définir deux paramètres : TARGET_LAG et WAREHOUSE.

Si ces paramètres ne sont pas définis dans les options de configuration, ils sont définis par défaut lors de la conversion.

Découvrez-en plus sur les paramètres des tables dynamiques requis ici.

Exemple de code

Code d’entrée (Oracle) :
 CREATE MATERIALIZED VIEW mv1
AS SELECT * FROM table1;
Code généré :
 CREATE OR REPLACE DYNAMIC TABLE mv1
--** SSC-FDM-0031 - DYNAMIC TABLE REQUIRED PARAMETERS SET BY DEFAULT **
TARGET_LAG='1 day'
WAREHOUSE=UPDATE_DUMMY_WAREHOUSE
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"oracle"}}'
AS
--** SSC-FDM-0001 - VIEWS SELECTING ALL COLUMNS FROM A SINGLE TABLE ARE NOT REQUIRED IN SNOWFLAKE AND MAY IMPACT PERFORMANCE. **
SELECT * FROM
table1;

Meilleures pratiques

  • Configurez les paramètres des tables dynamiques requis en fonction de vos besoins.

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

SSC-FDM-0032

Le paramètre n’est pas une valeur littérale. La transformation n’a pas pu être entièrement appliquée.

Description

Pour les transformations multiples, SnowConvert AI exige parfois que le contenu d’un paramètre soit validé, ce qui n’est possible que si ce paramètre est une valeur littérale.

Ce message est généré pour avertir l’utilisateur que SnowConvert AI n’a pas pu récupérer la valeur du paramètre, car elle a été transmise par référence, ce qui a entraîné l’interruption de la transformation de la fonction ou de l’instruction.

Exemple de code

Code d’entrée (Redshift) :
 SELECT TO_CHAR(DATE '2001-01-01', 'YYY/MM/DD'),
TO_CHAR(DATE '2001-01-01', f)
FROM (SELECT 'YYY/MM/DD' as f);
Code généré :
 SELECT
PUBLIC.YEAR_PART_UDF(DATE '2001-01-01', 3) || TO_CHAR(DATE '2001-01-01', '/MM/DD'),
--** SSC-FDM-0032 - PARAMETER 'format_string' IS NOT A LITERAL VALUE, TRANSFORMATION COULD NOT BE FULLY APPLIED **
TO_CHAR(DATE '2001-01-01', f)
FROM (SELECT 'YYY/MM/DD' as f);

Meilleures pratiques

  • Essayez de fournir le paramètre spécifié sous forme de valeur littérale.

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

SSC-FDM-0033

La clause d’exemple se comporte différemment dans Snowflake.

Description

This message is generated to showcase the functional difference while sampling rows in Snowflake. The differences are related to the quantity of rows retrieved. When in Teradata there is the same quantity of rows in the non-deterministic output, it may change in Snowflake and return a few rows more or less. This is because a probability related topic and it is expected to behaves like that in Snowflake.

If there is a requirement of retrieving the same values and the same quantity, a deterministic output, it is recommended to use a seed in the Snowflake query.

Exemple de code

Code d’entrée (Teradata) :
 SELECT * FROM Employee SAMPLE 2;
SELECT * FROM Employee SAMPLE 0.25;
Code généré :
 SELECT
    * FROM
    Employee
--** SSC-FDM-0033 - SAMPLE CLAUSE BEHAVES DIFFERENTLY IN SNOWFLAKE **
SAMPLE(2 ROWS);

SELECT
    * FROM
    Employee
--** SSC-FDM-0033 - SAMPLE CLAUSE BEHAVES DIFFERENTLY IN SNOWFLAKE **
SAMPLE(25);

Meilleures pratiques

  • Essayez d’utiliser la partie graine de la requête lorsqu’une sortie déterministe est requise.

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

SSC-FDM-0034

Structure convertie en VARIANT. Certaines de ses utilisations peuvent présenter des différences fonctionnelles.

Description

Snowflake ne prend pas en charge le type de données STRUCT de façon native. SnowConvert AI convertit automatiquement STRUCT en VARIANT. Lorsqu’elles seront utilisées dans des instructions INSERT, les données STRUCT seront traitées à l’aide de OBJECT_CONSTRUCT. Notez que cette conversion peut introduire des différences fonctionnelles dans certains cas d’utilisation.

Exemple de code

Code d’entrée :
BigQuery
 CREATE OR REPLACE TABLE test.structTypes
(
  COL1 STRUCT<sc1 INT64>,
  COL2 STRUCT<sc2 STRING(10)>,
  COL3 STRUCT<sc3 STRUCT<sc31 INT64, sc32 INT64>>,
  COL4 STRUCT<sc4 ARRAY<INT64>>,
  COL5 STRUCT<sc5 INT64, sc51 INT64>,
  COL7 STRUCT<sc7 INT64 OPTIONS(description = "A repeated STRING field"), sc71 BOOL>,
  COL8 STRUCT<sc8 INT64 NOT NULL, sc81 BOOL NOT NULL OPTIONS(description = "A repeated STRING field")>
);
Code généré :
Snowflake
 CREATE OR REPLACE TABLE test.structTypes
(
  COL1 VARIANT /*** SSC-FDM-0034 - STRUCT<INT64> CONVERTED TO VARIANT. SOME OF ITS USAGES MIGHT HAVE FUNCTIONAL DIFFERENCES. ***/,
    COL2 VARIANT /*** SSC-FDM-0034 - STRUCT<STRING(10)> CONVERTED TO VARIANT. SOME OF ITS USAGES MIGHT HAVE FUNCTIONAL DIFFERENCES. ***/,
    COL3 VARIANT /*** SSC-FDM-0034 - STRUCT<STRUCT<INT64, INT64>> CONVERTED TO VARIANT. SOME OF ITS USAGES MIGHT HAVE FUNCTIONAL DIFFERENCES. ***/,
    COL4 VARIANT /*** SSC-FDM-0034 - STRUCT<ARRAY<INT64>> CONVERTED TO VARIANT. SOME OF ITS USAGES MIGHT HAVE FUNCTIONAL DIFFERENCES. ***/,
    COL5 VARIANT /*** SSC-FDM-0034 - STRUCT<INT64, INT64> CONVERTED TO VARIANT. SOME OF ITS USAGES MIGHT HAVE FUNCTIONAL DIFFERENCES. ***/,
    COL7 VARIANT /*** SSC-FDM-0034 - STRUCT<INT, BOOL> CONVERTED TO VARIANT. SOME OF ITS USAGES MIGHT HAVE FUNCTIONAL DIFFERENCES. ***/,
    COL8 VARIANT /*** SSC-FDM-0034 - STRUCT<INT64, BOOLEAN> 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": "05/30/2025",  "domain": "no-domain-provided" }}';

Meilleures pratiques

SSC-FDM-0035

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.

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 pour en trouver un qui n’utilise pas de caractères génériques et 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/*']
);
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-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_JSON2_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_json/.*'
FILE_FORMAT = (TYPE = JSON);

Meilleures pratiques

SSC-FDM-0036

Le format numérique/date transformé peut avoir un comportement différent dans Snowflake.

Description

Les formats numériques transformés vers Snowflake utilisent des formats de position fixes. Le format transformé peut échouer et générer une sortie différente lorsqu’il y a plus de chiffres dans la partie entière du nombre qu’il n’y a de positions de chiffres dans le format. Tous les chiffres sont imprimés sous la forme # pour indiquer un dépassement.

Note

For SQL Server migrations: If you are converting SQL Server code that uses custom single-character date format specifiers (for example, %y, %M, %d, %H, %h, %m, %s) or advanced numeric format specifiers (for example, P, N, %), consider enabling the --enableFormatSpecifiersPreview preview flag. This flag enables access to new Snowflake format specifiers that provide more accurate translations of these formats. See Preview Features Settings for more details.

Note: This requires requesting preview access in your Snowflake account through this form.

Exemple de code

Code d’entrée :
SQL Server
SELECT
 FORMAT(value, '00.00') as formatted, 
 FORMAT(value, '#,##0') as formatSource
 FROM MY_TABLE;
Code généré :
Snowflake
SELECT
 TO_CHAR(value, 'FM9999999999900.00') /*** SSC-FDM-0036 - TRANSFORMATION OF '00.00' FORMAT MAY HAVE A DIFFERENT BEHAVIOR IN SNOWFLAKE. ***/ as formatted,
 TO_CHAR(value, 'FM9,999,999,999,990') /*** SSC-FDM-0036 - TRANSFORMATION OF '#,##0' FORMAT MAY HAVE A DIFFERENT BEHAVIOR IN SNOWFLAKE. ***/ as formatSource
 FROM
 MY_TABLE;
Résultat
#############

Meilleures pratiques

  • Si le chiffre numérique ne correspond pas au format, veuillez mettre à jour le format en ajoutant des chiffres supplémentaires en fonction des valeurs possibles des données d’entrée.

SSC-FDM-0037

La fonction de statistiques n’est pas nécessaire dans Snowflake.

Description

Les statistiques DROP, COLLECT ou HELP ne sont pas nécessaires dans Snowflake. Snowflake collecte déjà des statistiques utilisées pour l’optimisation automatique des requêtes.

Exemple de code

Code d’entrée :
  HELP STATISTICS TestName;
Code généré
  ----** SSC-FDM-0037 - HELP STATISTICS NOT NEEDED. SNOWFLAKE AUTOMATICALLY COLLECTS STATISTICS. **
  --HELP STATISTICS TestName

Meilleures pratiques

SSC-FDM-0038

Le micro-partitionnement est automatiquement effectué sur toutes les tables Snowflake.

Description

Ce message est ajouté à l’instruction CREATE TABLE lorsqu’une clause PARTITION BY est présente. La clause PARTITION BY, qui contrôle le partitionnement des tables dans certaines bases de données, n’est pas prise en charge dans Snowflake.

Dans Snowflake, toutes les tables sont automatiquement divisées en micro-partitions, c’est-à-dire en des unités de stockage contiguës allant de 50 MB à 500 MB de données non compressées. Cette architecture permet un nettoyage très granulaire des grandes tables, qui peuvent consister en des millions de micro-partitions.

Snowflake stocke automatiquement les métadonnées pour chaque micro-partition, y compris :

  • La plage de valeurs pour chaque colonne dans la micro-partition.

  • Le nombre de valeurs distinctes.

  • Les propriétés supplémentaires utilisées à la fois pour l’optimisation et le traitement efficace des requêtes.

Les tables sont partitionnées de manière transparente en fonction de l’ordre des données à mesure qu’elles sont insérées ou chargées. Pour plus de détails, consultez les Avantages du micro-partitionnement.

Exemple de code

Code d’entrée :
 CREATE TABLE orders 
    (
      storeid INTEGER NOT NULL,
      productid INTEGER NOT NULL,
      orderdate DATE FORMAT 'yyyy-mm-dd' NOT NULL,
      totalorders INTEGER NOT NULL)
      PRIMARY INDEX (storeid, productid) 
      PARTITION BY (RANGE_N(totalorders BETWEEN *, 100, 1000 AND *),RANGE_N(orderdate BETWEEN *, '2005-12-31' AND *) );
Code généré
CREATE OR REPLACE TABLE orders
(
 storeid INTEGER NOT NULL,
 productid INTEGER NOT NULL,
 orderdate DATE NOT NULL,
 totalorders INTEGER NOT NULL)
-- --** SSC-FDM-0038 - MICRO-PARTITIONING IS AUTOMATICALLY HANDLED ON ALL SNOWFLAKE TABLES **
-- PARTITION BY (RANGE_N(totalorders BETWEEN *, 100, 1000 AND *)
--              ,RANGE_N(orderdate BETWEEN *, '2005-12-31' AND *) )
 COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "teradata",  "convertedOn": "09/17/2025",  "domain": "no-domain-provided" }}'
;

Meilleures pratiques

SSC-FDM-0039

SQLWARNING may not be captured as an exception in Snowflake.

Description

In source databases such as Teradata, SQLWARNING can be caught in exception handlers. Snowflake’s exception handling may not capture SQLWARNING in the same way. When a handler is configured to catch SQLWARNING, SnowConvert AI translates it, but the behavior in Snowflake may differ.

Exemple de code

Code d’entrée :
 UPDATE orders SET status = 'processed';
DECLARE sqlwarning CONDITION FOR SQLSTATE '01000';
DECLARE EXIT HANDLER FOR sqlwarning
  INSERT INTO log_table VALUES ('Warning occurred');
Code généré :
 UPDATE orders SET status = 'processed';
DECLARE sqlwarning CONDITION FOR SQLSTATE '01000';
DECLARE EXIT HANDLER FOR
  --** SSC-FDM-0039 - SQLWARNING MAY NOT BE CAPTURED AS AN EXCEPTION IN SNOWFLAKE. **
  sqlwarning
  INSERT INTO log_table VALUES ('Warning occurred');

Meilleures pratiques

  • Review exception handling logic that catches SQLWARNING; the handler may not be invoked in Snowflake for the same conditions.

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

SSC-FDM-0040

REGEXP_SUBSTR / REGEXP_INSTR function may fail if regex argument is not POSIX

Description

When translating regex-based functions (such as REGEXP_SUBSTR, REGEXP_INSTR) from source dialects to Snowflake, the regex argument must be valid POSIX syntax. Source dialects may support extended regex features that Snowflake does not. If the regex pattern uses non-POSIX syntax, the function may fail at runtime or produce different results.

Exemple de code

Code d’entrée :
 SELECT REGEXP_INSTR(product_name, format_pattern) FROM products;
Code généré :
 SELECT
  --** SSC-FDM-0040 - REGEXP_INSTR FUNCTION MAY FAIL IF REGEX ARGUMENT IS NOT POSIX **
  REGEXP_INSTR(product_name, format_pattern)
FROM products;

Meilleures pratiques

  • Ensure regex patterns use POSIX-compliant syntax.

  • Test regex functions with sample data after conversion.

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

SSC-FDM-0041

Default parameters were reordered to the end of the parameter list.

Description

Snowflake requires all parameters with default values to appear after all non-default parameters. When SnowConvert AI detects a procedure whose default parameters are not at the end of the parameter list, it automatically reorders them. Code not provided to SnowConvert AI that uses positional arguments may need to be updated to match the new parameter order.

Note

This FDM replaces the deprecated SSC-EWI-0002, which previously only warned about the issue without performing the reorder.

Exemple de code

Input Code (SQL Server):
 CREATE PROCEDURE dbo.TestProc (@Param1 INT = 10, @Param2 VARCHAR(50))
AS
BEGIN
   SET @Param1 = @Param1;
END
Generated Code (SQL Server):
 CREATE OR REPLACE PROCEDURE dbo.TestProc
--** SSC-FDM-0041 - DEFAULT PARAMETERS WERE REORDERED TO THE END OF THE PARAMETER LIST TO MATCH SNOWFLAKE REQUIREMENTS. CALLERS USING POSITIONAL ARGUMENTS MAY NEED TO BE UPDATED **
(PARAM2 STRING, PARAM1 INT DEFAULT 10)
RETURNS VARCHAR
LANGUAGE SQL
EXECUTE AS CALLER
AS
$$
  BEGIN
    PARAM1 := :PARAM1;
  END;
$$;
Code d’entrée (Oracle) :
 CREATE OR REPLACE PROCEDURE TestProc (param1 IN NUMBER DEFAULT 10, param2 IN VARCHAR2)
IS
BEGIN
   param1 := param1;
END;
Generated Code (Oracle):
 CREATE OR REPLACE PROCEDURE TestProc
--** SSC-FDM-0041 - DEFAULT PARAMETERS WERE REORDERED TO THE END OF THE PARAMETER LIST TO MATCH SNOWFLAKE REQUIREMENTS. CALLERS USING POSITIONAL ARGUMENTS MAY NEED TO BE UPDATED **
(param2 VARCHAR, param1 NUMBER(38, 18) DEFAULT 10)
RETURNS VARCHAR
LANGUAGE SQL
EXECUTE AS CALLER
AS
$$
  BEGIN
    param1 := :param1;
  END;
$$;
Positional Call Site Conversion

When callers use positional arguments and the parameters have been reordered, SnowConvert AI automatically converts them to named arguments:

 CREATE PROCEDURE dbo.CallerProc
AS
BEGIN
   EXEC dbo.TestProc 5, 'hello';
END
 CREATE OR REPLACE PROCEDURE dbo.CallerProc ()
RETURNS VARCHAR
LANGUAGE SQL
EXECUTE AS CALLER
AS
$$
  BEGIN
    CALL dbo.TestProc(PARAM1 => 5, PARAM2 => 'hello');
  END;
$$;

Meilleures pratiques

  • Review all callers of the affected procedure. If positional arguments are used, update them to match the new parameter order or convert them to named arguments.

  • Consider using named arguments (e.g., param1 => value) instead of positional arguments to avoid issues with parameter ordering.

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