SnowConvert AI - Problèmes généraux

SSC-EWI-0001

Jeton non reconnu sur la ligne du code source.

Note

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

Gravité

Critique

Description

Ce problème se produit lorsqu’il y a une erreur lors de l’analyse du code source en cours de conversion. Cela signifie qu’il y a une erreur de syntaxe dans le code source ou qu’une instruction spécifique du code n‘est pas encore reconnue.

Exemple de code

L’exemple suivant illustre différents scénarios d’erreur d’analyse où une syntaxe non valide est placée dans l’entrée. Notez dans quelle mesure le message varie d’un scénario à l’autre. Ces contenus peuvent être utiles pour isoler et résoudre le problème. Pour plus d’informations, consultez « Contenus des messages » ci-dessous.

Code d’entrée:
 CRATE;

CREATE TABLE someTable(col1 INTEGER, !);

CREATE TABRE badTable(col1 INTEGER);

CREATE PROCEDURE proc1()
BEGIN
    CREATE TABLE badEmbeddedTable(col1 INTEGER);
END;
Copy
Code généré:
 -- ** SSC-EWI-0001 - UNRECOGNIZED TOKEN ON LINE '1' COLUMN '1' OF THE SOURCE CODE STARTING AT 'CRATE'. EXPECTED 'STATEMENT' GRAMMAR. LAST MATCHING TOKEN WAS 'CRATE' ON LINE '1' COLUMN '1'. **
--CRATE
     ;

CREATE OR REPLACE TABLE someTable (
    col1 INTEGER
--                ,
                 
-- ** SSC-EWI-0001 - UNRECOGNIZED TOKEN ON LINE '3' COLUMN '37' OF THE SOURCE CODE STARTING AT '!'. EXPECTED 'Column Definition' GRAMMAR. LAST MATCHING TOKEN WAS ',' ON LINE '3' COLUMN '35'. FAILED TOKEN WAS '!' ON LINE '3' COLUMN '37'. **
--                  !
                   )
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "teradata",  "convertedOn": "07/04/2024" }}'
;

-- ** SSC-EWI-0001 - UNRECOGNIZED TOKEN ON LINE '5' COLUMN '1' OF THE SOURCE CODE STARTING AT 'CREATE'. EXPECTED 'STATEMENT' GRAMMAR. LAST MATCHING TOKEN WAS 'CREATE' ON LINE '5' COLUMN '1'. **
--CREATE TABRE badTable(col1 INTEGER)
                                   ;

CREATE OR REPLACE PROCEDURE proc1 ()
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "teradata",  "convertedOn": "07/04/2024" }}'
EXECUTE AS CALLER
AS
$$
    BEGIN
        CREATE OR REPLACE TABLE badEmbeddedTable (
            col1 INTEGER);
    END;
$$;
Copy

Contenu des messages

  1. Clause de départ : Spécifie l’emplacement de départ (ligne, colonne et « texte ») du code non reconnu. Le code sera commenté à partir de l’élément « texte » pour chaque élément non reconnu, jusqu’à ce que l’analyseur localise un point de récupération possible.

  2. Clause grammaticale attendue : Spécifie le type de grammaire attendu par l’analyseur. Vérifiez si le code commenté correspond à un type de grammaire attendu.

  3. Clause du dernier jeton correspondant (OPTIONAL) : Peut apparaître si le code non reconnu a été partiellement reconnu. Cette clause indique jusqu’où l’analyseur a reconnu des éléments valides. Vérifiez donc les jetons suivants dans le code commenté pour vous assurer qu’ils sont valides.

  4. Clause d’échec du jeton (OPTIONAL) : Ne peut être présente que lorsqu’une « clause du dernier jeton correspondant » est également présente. Cette clause représente le moment où l’analyseur a finalement déterminé que le code n’était pas valide ou reconnu. Assurez-vous que cet élément peut être placé à cet emplacement syntaxique.

Contenus des messages obsolètes

Note

Les éléments de cette liste ne sont pas activement utilisés et sont conservés ici à des fins historiques.

  1. Code de récupération (DEPRECATED) : Ce code est destiné à être utilisé comme code d’erreur, et il peut être fourni pour une meilleure prise en charge lors des demandes de mise à niveau de l’analyseur. Il représente la manière dont l’analyseur a déclenché son mécanisme de récupération.

Meilleures pratiques

  • Vérifiez si le code source contient la bonne syntaxe.

  • Le message peut être utilisé pour isoler et résoudre le problème.

  • Si la syntaxe n’est pas prise en charge, elle peut être remplacée manuellement par une syntaxe prise en charge.

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

SSC-EWI-0002

Il peut être nécessaire de réorganiser les paramètres par défaut.

Gravité

Medium

Description

Il peut être nécessaire de réorganiser les paramètres par défaut. Snowflake ne prend en charge les paramètres par défaut qu’à l’issue des déclarations de paramètres.

Exemple de code

Code d’entrée :
 CREATE PROCEDURE MySampleProc
    @Param1 NVARCHAR(50) = NULL,
    @Param2 NVARCHAR(10),
    @Param3 NVARCHAR(10) = NULL,
    @Param4 NVARCHAR(10)
AS   
    SELECT 1;
Copy
Code généré :
 CREATE OR REPLACE PROCEDURE MySampleProc
!!!RESOLVE EWI!!! /*** SSC-EWI-0002 - DEFAULT PARAMETERS MAY NEED TO BE REORDERED. SNOWFLAKE ONLY SUPPORTS DEFAULT PARAMETERS AT THE END OF THE PARAMETERS DECLARATIONS ***/!!!
(PARAM1 STRING DEFAULT NULL, PARAM2 STRING, PARAM3 STRING DEFAULT NULL, PARAM4 STRING)
RETURNS TABLE()
LANGUAGE SQL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"transact"}}'
EXECUTE AS CALLER
AS
$$
    DECLARE
        ProcedureResultSet RESULTSET;
    BEGIN
        ProcedureResultSet := (
        SELECT 1);
        RETURN TABLE(ProcedureResultSet);
    END;
$$;
Copy

Meilleures pratiques

SSC-EWI-0003

La colonne système de l’objet intégré n’a pas été traduite.

Sévérité

Medium

Description

Cet EWI est généré lorsque SnowConvert AI mappe un objet système intégré (table, vue) vers l’objet Snowflake équivalent, mais qu’il n’y a pas de mappage pour l’une de ses colonnes internes.

Exemple de code 

Code d’entrée :

select name, 
       parent_object_id
    from sys.tables;
Copy

Code de sortie :

Snowflake
select
    TABLE_NAME,
       parent_object_id !!!RESOLVE EWI!!! /*** SSC-EWI-0003 - SYSTEM COLUMN 'parent_object_id' FOR BUILT-IN OBJECT 'SYS.TABLES' HAS NOT BEEN TRANSLATED. ***/!!!
    from
    INFORMATION_SCHEMA.TABLES;
Copy

SSC-EWI-0005

Gravité

Critique

Description

Ce problème survient lorsque la tentative de conversion du code source entraîne une erreur de transformation inattendue et que le fichier de code de sortie ne peut pas être généré.

Meilleures pratiques

  • Consultez le fichier de journalisation des erreurs pour obtenir plus d’informations sur le problème.

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

SSC-EWI-0006

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

Gravité

Medium

Description

Cette erreur est ajoutée, car Snowflake ne prend pas en charge les formats date/numérique dans certaines fonctions, contrairement au langage source.

Les éléments de format suivants sont ceux qui peuvent se comporter différemment dans Snowflake.:

Date/heure Redshift

Format ElementDescription
HHHour of day (01–12).
MSMillisecond (000–999).
USMicrosecond (000000–999999).
SSSS, SSSSSSeconds past midnight (0–86399).
Y,YYYYear (4 or more digits) with comma.
YYYLast 3 digits of year.
YLast digit of year.
IYYYISO 8601 week-numbering year(4 or more digits).
IYYLast 3 digits of ISO 8601 week-numbering year.
IYLast 2 digits of ISO 8601 week-numbering year.
ILast digit of ISO 8601 week-numbering year.
BC, bc, AD or adEra indicator (without periods).
B.C., b.c., A.D. or a.d.Era indicator (with periods).
MONTHFull upper case month name (blank-padded to 9 chars).
MonthFull capitalized month name (blank-padded to 9 chars).
monthFull lower case month name (blank-padded to 9 chars).
DAYFull upper case day name (blank-padded to 9 chars).
DayFull capitalized day name (blank-padded to 9 chars).
dayFull lower case day name (blank-padded to 9 chars).
DDDDay of year (001–366).
IDDDDay of ISO 8601 week-numbering year (001–371; day 1 of the year is Monday of the first ISO week).
DDay of the week, Sunday (1) to Saturday (7).
IDISO 8601 day of the week, Monday (1) to Sunday (7).
WWeek of month (1–5) (the first week starts on the first day of the month).
WWWeek number of year (1–53) (the first week starts on the first day of the year).
IWWeek number of ISO 8601 week-numbering year (01–53; the first Thursday of the year is in week 1).
CCCentury (2 digits) (the twenty-first century starts on 2001-01-01).
JJulian Date.
QQuarter.
RMMonth in upper case Roman numerals (I–XII; I=January).
rmMonth in lower case Roman numerals (i–xii; i=January).
TZUpper case time-zone abbreviation (only supported in to_char).
tzLower case time-zone abbreviation (only supported in to_char).
TZHTime-zone hours.
TZMTime-zone minutes.
OFTime-zone offset from UTC (only supported in to_char).
FM prefixFill mode (suppress leading zeroes and padding blanks).
TH suffixUpper case ordinal number suffix.
th suffixLower case ordinal number suffix.
FX prefixFixed format global option (see usage notes).
TM prefixTranslation mode (use localized day and month names based on lc_time).
SP suffixSpell mode.

Note

Pour plus d’informations, veuillez vous référer aux formats date/heure PostgreSQL.

Note

La transformation de la fonction TO_CHAR prend en charge la plupart de ces éléments de format. Pour une liste complète des éléments de format pris en charge et de leurs mappages équivalents, veuillez vous référer à la spécification de traduction.

Format BigQuery

Veuillez examiner la liste détaillée ici.

Numérique

Modèle

Description

PR

valeur négative entre crochets d’angle

RN

Chiffre romain (entrée entre 1 et 3999)

TH ou th

suffixe du nombre ordinal

V

décaler le nombre de chiffres spécifié (voir notes)

EEEE

exposant pour la notation scientifique

Note

Pour plus d’informations, veuillez vous référer aux formats numériques PostgreSQL.

Exemple de code

Code d’entrée :
PostgreSQL
 SELECT 
   DATE_TRUNC('decade', TIMESTAMP '2017-03-17 02:09:30'),
   DATE_TRUNC('century', TIMESTAMP '2017-03-17 02:09:30'),
   DATE_TRUNC('millennium', TIMESTAMP '2017-03-17 02:09:30');
Copy
Code généré :
Snowflake
 SELECT
      !!!RESOLVE EWI!!! /*** SSC-EWI-PG0005 - DECADE FORMAT IS NOT SUPPORTED IN SNOWFLAKE. ***/!!!
      DATE_TRUNC('decade', TIMESTAMP '2017-03-17 02:09:30'),
      !!!RESOLVE EWI!!! /*** SSC-EWI-PG0005 - CENTURY FORMAT IS NOT SUPPORTED IN SNOWFLAKE. ***/!!!
      DATE_TRUNC('century', TIMESTAMP '2017-03-17 02:09:30'),
      !!!RESOLVE EWI!!! /*** SSC-EWI-PG0005 - MILLENNIUM FORMAT IS NOT SUPPORTED IN SNOWFLAKE. ***/!!!
      DATE_TRUNC('millennium', TIMESTAMP '2017-03-17 02:09:30');
Copy

Meilleures pratiques

SSC-EWI-0007

Gravité

Critique

Description

Cette erreur apparaît lorsqu’une erreur se produit lors de l’écriture du fichier de sortie.

Meilleures pratiques

SSC-EWI-0008

La clause COLLATE peut avoir un comportement différent dans Snowflake.

Gravité

Medium

Description

Cet avertissement est ajouté lorsque la clause de classement est utilisée comme option de colonne, car elle est prise en charge dans Snowflake, mais elle peut se comporter différemment dans la spécification de classement. Veuillez examiner la documentation relative au classement afin de vérifier quels spécificateurs sont pris en charge dans Snowflake.

Exemple de code

Code d’entrée :
 CREATE TABLE TABLE01 (
    col1 text COLLATE "C"
);
Copy
Code généré:
 CREATE TABLE TABLE01 (
    col1 text
              !!!RESOLVE EWI!!! /*** SSC-EWI-0008 - COLLATE CLAUSE MAY HAVE A DIFFERENT BEHAVIOR IN SNOWFLAKE. ***/!!! COLLATE "C"
);
Copy

Meilleures pratiques

SSC-EWI-0009

La fonction Regexp_Substr prend uniquement en charge les expressions régulières POSIX.

Gravité

Faible

Description

Actuellement, Snowflake ne prend pas en charge l’expression régulière étendue au-delà de la syntaxe d’expressions régulières de base POSIX.

Cet EWI est ajouté chaque fois qu’un appel de fonction à REGEX_SUBSTR, REGEX_REPLACE, ou REGEX_INSTR est transformé dans SnowFlake pour avertir l’utilisateur des éventuelles expressions régulières non prises en charge. Certaines des fonctionnalités non prises en charge sont les groupes lookahead, lookbehind et non-capturing.

Exemple de code

Code d’entrée:
 SELECT REGEXP_SUBSTR('qaqequ','q(?=u)', 1, 1);
Copy
Code généré :
 SELECT
!!!RESOLVE EWI!!! /*** SSC-EWI-0009 - REGEXP_SUBSTR FUNCTION ONLY SUPPORTS POSIX REGULAR EXPRESSIONS ***/!!!
REGEXP_SUBSTR('qaqequ','q(?=u)', 1, 1);
Copy

Meilleures pratiques

  • Vérifiez l’expression régulière utilisée dans chaque cas pour déterminer si une intervention manuelle est nécessaire. Vous trouverez plus d’informations sur la prise en charge étendue des expressions regex et sur les alternatives dans SnowFlake ici.

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

SSC-EWI-0010

Gravité

Critique

Description

Cette erreur apparaît lorsqu’il n’y a pas de règle de transformation pour une instruction de procédure spécifique.

Meilleures pratiques

  • Vérifiez si l’instruction de la procédure est correcte.

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

SSC-EWI-0011

Gravité

Élevé

Description

Cette erreur apparaît lorsqu’il y a une fin inattendue de l’instruction dans le code source et que l’erreur ne peut pas être traitée correctement.

Meilleures pratiques

  • Vérifiez si le code source est incomplet ou si l’instruction en cours de conversion se termine correctement.

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

SSC-EWI-0012

Gravité

Élevé

Description

Cette erreur apparaît lorsqu’il y a une fin inattendue de l’instruction dans le code source.

Exemple de code

Code d’entrée :
 CREATE VOLATILE SET TABLE VOLATILETABLE
(
    COL1                    INTEGER,
    COL2                    INTEGER,
    COL3                    INTEGER
)
ON COMMIT PRESERVE ROWS;
UPDATE TABLE2 as T2
SET T2.COL1 + VOLATILETABLE.COL1
WHERE T2.COL2 = VOLATILETABLE.COL2
    AND T2.COL3 = VOLATILETABLE.COL3
    AND     T2.COL4 = ( SELECT MAX(T3.COL1) 
                                   FROM
                                   TABLE3 T3
                                   WHERE T3.COL1 = T2.COL1);
Copy
Code généré:
 --** SSC-FDM-TD0024 - SET TABLE FUNCTIONALITY NOT SUPPORTED. TABLE MIGHT HAVE DUPLICATE ROWS **
CREATE OR REPLACE TEMPORARY TABLE VOLATILETABLE
(
    COL1 INTEGER,
    COL2 INTEGER,
    COL3 INTEGER
)
--    --** SSC-FDM-0008 - ON COMMIT NOT SUPPORTED **
--ON COMMIT PRESERVE ROWS
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"teradata"}}'
;

--** SSC-FDM-0007 - MISSING DEPENDENT OBJECTS "TABLE2", "TABLE3" **
UPDATE TABLE2 AS T2
    SET
        --** SSC-FDM-0025 - UNEXPECTED END OF STATEMENT. PLEASE CHECK THE LINE 9 OF ORIGINAL SOURCE CODE. **
        T2.COL1 + VOLATILETABLE.COL1
    FROM
        VOLATILETABLE
        WHERE T2.COL2 = _VOLATILETABLE.COL2
            AND T2.COL3 = _VOLATILETABLE.COL3
            AND     T2.COL4 = (
                SELECT
                    MAX(T3.COL1)
                                                  FROM
                    TABLE3 T3
                                                  WHERE T3.COL1 = T2.COL1);
Copy

Recommandation

  • Vérifiez si le code source est incomplet ou si l’instruction en cours de conversion se termine correctement.

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

SSC-EWI-0013

Gravité

Critique

Description

Cette erreur apparaît lorsqu’une exception est levée lors de la conversion d’un élément du code source.

Recommandation

SSC-EWI-0014

Gravité

Critique

Description

Cette erreur apparaît lorsque le corps d’une instruction de procédure spécifique n’est pas généré.

Meilleures pratiques

SSC-EWI-0015

Fonction multiple Pivot/Unpivot non prise en charge.

Note

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

Gravité

Medium

Description

Cette section décrit les différents problèmes qui pourraient être déclenchés par les clauses PIVOT et UNPIVOT. Les scénarios non pris en charge sont présentés dans le tableau suivant.

PIVOT

UNPIVOT

ORACLE

TERADATA

MULTIPLE COLUMN

X

X

X

X

RENAME COLUMN

X

X

X

X

MULTIPLE FUNCTION

X

X

X

WITH CLAUSE

X

X

XML OUTPUT FORMAT

X

X

IN CLAUSE SUBQUERY

X

X

X

IN CLAUSE ANY SEQUENCE

X

X

INCLUDE/EXCLUDE NULLS

X

X

X

MULTIPLE COLUMN

Les colonnes multiples ne sont pas prises en charge par les clauses PIVOT et UNPIVOT.

Exemple de code
Code d’entrée :
 SELECT * FROM star1p UNPIVOT ((sales,cogs)  FOR  yr_qtr
    IN ((Q101Sales, Q101Cogs) AS 'Q101A',
        (Q201Sales, Q201Cogs) AS 'Q201A', 
        (Q301Sales, Q301Cogs) AS 'Q301A')) AS Tmp;
Copy
Code généré :
 // SnowConvert AI Helpers Code section is omitted.
SELECT * FROM
    star1p
           !!!RESOLVE EWI!!! /*** SSC-EWI-0015 - PIVOT/UNPIVOT MULTIPLE COLUMN NOT SUPPORTED ***/!!!
           UNPIVOT ((sales,cogs)  FOR  yr_qtr
    !!!RESOLVE EWI!!! /*** SSC-EWI-0015 - PIVOT/UNPIVOT MULTIPLE COLUMN NOT SUPPORTED ***/!!!
    IN ((Q101Sales, Q101Cogs) AS 'Q101A',
        (Q201Sales, Q201Cogs) AS 'Q201A',
        (Q301Sales, Q301Cogs) AS 'Q301A')) AS Tmp;
Copy

RENAME COLUMN

Le renommage de colonnes avec des alias n’est pas pris en charge dans les clauses UNPIVOT de Snowflake. Snow Convert va supprimer les alias des fonctions ou des colonnes afin de créer une requête valide et vérifier que cette modification n’affecte pas la fonctionnalité d’origine.

Pour PIVOT, l’utilisation des alias de colonnes n’est prise en charge que dans SnowConvert AI pour Teradata si les deux conditions suivantes sont vraies : toutes les expressions à l’intérieur des clauses IN ont un alias associé, et SnowConvert AI dispose d’informations sur les colonnes qui seront générées en conséquence, soit en fournissant la définition de la table, soit en utilisant une sous-requête avec une liste explicite de colonnes en tant qu’entrée de la clause.

Exemple de code
Code d’entrée :
CREATE TABLE star1(
	country VARCHAR(20),
	state VARCHAR(10), 
	yr INTEGER,
	qtr VARCHAR(3),
	sales INTEGER,
	cogs INTEGER
);

--SAMPLE 1
SELECT * FROM db1.star1p UNPIVOT (column1  FOR  for_column 
    IN (col1 AS 'as_col1', col2 AS 'as_col2')) Tmp;

--SAMPLE 2
SELECT *
FROM star1 PIVOT (
	SUM(sales) as ss1 FOR qtr                                                                                               
    IN ('Q1' AS Quarter1,                                                                                                     
    	'Q2' AS Quarter2, 
        'Q3' AS Quarter3)
)Tmp;

--SAMPLE 3
SELECT 
	* 
FROM (
	SELECT 
		country,
		state, 
		yr,
		qtr,
		sales,
		cogs
	FROM star1 ) A
PIVOT (
	SUM(sales) as ss1 FOR qtr                                                                                               
    IN ('Q1' AS Quarter1,                                                                                                     
    	'Q2' AS Quarter2, 
        'Q3' AS Quarter3)
)Tmp;
Code généré :
 CREATE OR REPLACE TABLE star1 (
	country VARCHAR(20),
	state VARCHAR(10),
	yr INTEGER,
	qtr VARCHAR(3),
	sales INTEGER,
	cogs INTEGER
)
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "teradata",  "convertedOn": "08/14/2024" }}'
;

--SAMPLE 1
--** SSC-FDM-0007 - MISSING DEPENDENT OBJECT "db1.star1p" **
SELECT
	* FROM db1.star1p UNPIVOT (column1  FOR  for_column
	    IN (col1 AS 'as_col1', col2 AS 'as_col2')) Tmp !!!RESOLVE EWI!!! /*** SSC-EWI-0073 - PENDING FUNCTIONAL EQUIVALENCE REVIEW FOR 'PivotUnpivotTableReference' NODE ***/!!!;

--SAMPLE 2
SELECT
	*
FROM
	star1 PIVOT (
	SUM(sales) FOR qtr IN ('Q1',
	   	'Q2',
	       'Q3')) Tmp (
		country,
		state,
		yr,
		cogs,
		Quarter1_ss1,
		Quarter2_ss1,
		Quarter3_ss1
	);

--SAMPLE 3
	SELECT
		*
	FROM (
		SELECT
				country,
				state,
				yr,
				qtr,
				sales,
				cogs
			FROM
				star1
	) A
	PIVOT (
		SUM(sales) FOR qtr IN ('Q1',
	    'Q2',
	        'Q3')) Tmp (
		country,
		state,
		yr,
		cogs,
		Quarter1_ss1,
		Quarter2_ss1,
		Quarter3_ss1
	);
Copy

MULTIPLE FUNCTION

La fonction multiple n’est pas prise en charge pour les clauses PIVOT. Parfois, les requêtes de fonctions multiples peuvent être réécrites à l’aide d’instructions de casse. Consultez l’exemple de Teradata suivant pour plus d’informations(https://docs.teradata.com/r/756LNiPSFdY~4JcCCcR5Cw/L0kKSOrOeu_68mcW3o8ilw](https://docs.teradata.com/r/756LNiPSFdY~4JcCCcR5Cw/L0kKSOrOeu_68mcW3o8ilw).

Exemple de code
Code d’entrée :
 SELECT *
FROM STAR1 PIVOT(SUM(COL1), SUM(COL2) FOR YR IN ('Y1', 'Y2', 'Y3'))TMP;
Copy
Code généré :
 // SnowConvert AI Helpers Code section is omitted.
SELECT
*
FROM
STAR1
      !!!RESOLVE EWI!!! /*** SSC-EWI-0015 - PIVOT/UNPIVOT MULTIPLE FUNCTION NOT SUPPORTED ***/!!!
      PIVOT(SUM(COL1), SUM(COL2) FOR YR IN ('Y1', 'Y2', 'Y3'))TMP;
Copy

WITH CLAUSE

PIVOT de Teradata dispose d’une clause WITH facultative. Celle-ci n’est pas autorisée dans la clause PIVOT de Snowflake.

Exemple de code
Code d’entrée :
 SELECT *
FROM STAR1 PIVOT(SUM(COL1) FOR YR IN ('Y1', 'Y2', 'Y3') WITH SUM(*) AS withalias)TMP;
Copy
Code généré :
 // SnowConvert AI Helpers Code section is omitted.
SELECT
*
FROM
STAR1 PIVOT(SUM(COL1) FOR YR IN ('Y1', 'Y2', 'Y3')
                                                   !!!RESOLVE EWI!!! /*** SSC-EWI-0015 - PIVOT/UNPIVOT WITH CLAUSE NOT SUPPORTED ***/!!!
 WITH SUM(*) AS withalias)TMP;
Copy

XML OUTPUT FORMAT

La sortie XML pour la clause PIVOT n’est pas prise en charge par Snowflake.

Exemple de code
Code d’entrée :
 SELECT * FROM   (SELECT product_code, quantity FROM pivot_test)
PIVOT XML (SUM(quantity) 
FOR (product_code) IN ('A','B','C'));
Copy
Code généré :
 // SnowConvert AI Helpers Code section is omitted.
SELECT * FROM
(
SELECT product_code, quantity FROM
pivot_test)
!!!RESOLVE EWI!!! /*** SSC-EWI-0015 - PIVOT/UNPIVOT XML OUTPUT FORMAT NOT SUPPORTED ***/!!!
PIVOT (SUM(quantity) FOR product_code IN ( 'A', 'B', 'C'));
Copy

IN CLAUSE SUBQUERY

Les sous-requêtes pour la clause IN ne sont pas prises en charge.

Exemple de code
Code d’entrée :
 SELECT * FROM s1 PIVOT(SUM(COL1) FOR FORCOL IN (SELECT SELCOL FROM S2))DT;
Copy
Code généré :
 // SnowConvert AI Helpers Code section is omitted.
SELECT * FROM
s1 PIVOT (SUM(COL1) FOR FORCOL
                               !!!RESOLVE EWI!!! /*** SSC-EWI-0015 - PIVOT/UNPIVOT IN CLAUSE SUBQUERY NOT SUPPORTED ***/!!! IN (SELECT SELCOL FROM
                               S2));
Copy

IN CLAUSE ANY SEQUENCE

Cette erreur se déclenche lorsque le mot-clé ANY est utilisé dans la clause IN. Celui-ci n’est actuellement pas pris en charge.

Exemple de code
Code d’entrée :
 SELECT * FROM (SELECT product_code, quantity FROM pivot_test)
PIVOT (SUM(quantity)
FOR product_code IN (ANY, ANY, ANY));
Copy
Code généré :
 // SnowConvert AI Helpers Code section is omitted.
SELECT * FROM (SELECT product_code, quantity FROM
pivot_test)
PIVOT (SUM(quantity)
FOR product_code
                 !!!RESOLVE EWI!!! /*** SSC-EWI-0015 - PIVOT/UNPIVOT IN CLAUSE ANY SEQUENCE NOT SUPPORTED ***/!!!
 IN (ANY, ANY, ANY));
Copy

INCLUDE/EXCLUDE NULLS

INCLUDE NULLS ou EXCLUDE NULLS ne sont pas des options valides pour les clauses UNPIVOT dans Snowflake.

Exemple de code
Code d’entrée :
 SELECT * FROM db1.star1p UNPIVOT INCLUDE NULLS (column1  FOR  for_column IN (col1, col2)) Tmp;
Copy
Code généré :
 // SnowConvert AI Helpers Code section is omitted.
SELECT * FROM
db1.star1p
!!!RESOLVE EWI!!! /*** SSC-EWI-0015 - PIVOT/UNPIVOT INCLUDE NULLS NOT SUPPORTED ***/!!!
UNPIVOT ( column1 FOR for_column IN (
col1,
col2)) Tmp;
Copy

Meilleures pratiques

  • Si possible, réécrivez la requête. Sinon, aucune action supplémentaire de la part de l’utilisateur n’est requise.

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

SSC-EWI-0016

Snowflake ne prend pas en charge la clause d’options.

Sévérité

Medium

Description

Cet EWI est ajouté aux instructions DDLs lorsque les OPTIONS comprennent des options non prises en charge par Snowflake.

Exemple de code 

Code d’entrée :

BigQuery
 CREATE VIEW my_view
OPTIONS (
  expiration_timestamp=TIMESTAMP "2026-01-01 00:00:00 UTC",
  privacy_policy='{"aggregation_threshold_policy": {"threshold": 50, "privacy_unit_columns": "ID"}}'
) AS
SELECT column1, column2
FROM my_table;
Copy

Code de sortie :

Snowflake
 CREATE VIEW my_view
!!!RESOLVE EWI!!! /*** SSC-EWI-0016 - SNOWFLAKE DOES NOT SUPPORT THE OPTIONS: EXPIRATION_TIMESTAMP, PRIVACY_POLICY. ***/!!!
OPTIONS(
  expiration_timestamp=TIMESTAMP "2026-01-01 00:00:00 UTC",
  privacy_policy='{"aggregation_threshold_policy": {"threshold": 50, "privacy_unit_columns": "ID"}}'
)
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "bigquery",  "convertedOn": "07/10/2025",  "domain": "no-domain-provided" }}'
AS
SELECT column1, column2
FROM
  my_table;
Copy

SSC-EWI-0020

CUSTOM UDF INSERTED.

Gravité

Faible

Résumé

Il existe plusieurs fonctions définies par l’utilisateur (UDF) fournies par SnowConvert AI utilisées pour reproduire les comportements du langage source qui ne sont pas prises en charge par Snowflake. Ces fonctionnalités et leurs descriptions sont détaillées ci-dessous.

Les UDFs peuvent être trouvées dans le dossier « Aides UDF » créé dans le chemin de sortie après la migration.

Meilleures pratiques

  • Vérifiez si le dossier Aides UDF est en cours de création avec des fichiers à l’intérieur.

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

SSC-EWI-0021

Non pris en charge.

Gravité

Medium

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;
Copy
Code généré :
 !!!RESOLVE EWI!!! /*** SSC-EWI-0021 - 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;
Copy

Meilleures pratiques

  • Si cette erreur se produit, cela signifie qu’il n’existe pas d’équivalent Snowflake pour le nœud en cours de conversion.

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

SSC-EWI-0022

Un ou plusieurs identificateurs dans une instruction spécifique sont considérés comme des paramètres par défaut.

Avertissement

L’EWI n’est généré que lorsque Javascript est le langage cible pour les procédures stockées. Il s’agit d’une fonctionnalité de traduction obsolète, car l’Exécution de scripts Snowflake est le langage cible recommandé pour les procédures stockées.

Note

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

Gravité

Medium

Description

Cette erreur est utilisée pour signaler qu’un ou plusieurs identificateurs dans une instruction spécifique sont considérés comme des paramètres par défaut.

Exemple de code

Code d’entrée:
 -- Additional Params: -t javascript
CREATE MACRO SAME_MACRO_COLUMN_AND_PARAMATERS (
LOAD_USER_ID (VARCHAR (32), CHARACTER SET LATIN),
UPDATE_USER_ID (VARCHAR (32), CHARACTER SET LATIN)
) AS (
UPDATE TABLE1 SET LOAD_USER_ID = :LOAD_USER_ID, UPDATE_USER_ID = :UPDATE_USER_ID;
INSERT INTO TABLE1 (LOAD_USER_ID, UPDATE_USER_ID) VALUES (:LOAD_USER_ID, :UPDATE_USER_ID);
DELETE FROM TABLE1 WHERE :LOAD_USER_ID = LOAD_USER_ID;
);
Copy
Code généré :
-- Additional Params: -t javascript
--** SSC-FDM-0007 - MISSING DEPENDENT OBJECT "TABLE1" **
CREATE OR REPLACE PROCEDURE SAME_MACRO_COLUMN_AND_PARAMATERS (LOAD_USER_ID VARCHAR (32), UPDATE_USER_ID VARCHAR (32))
RETURNS STRING
LANGUAGE JAVASCRIPT
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "teradata",  "convertedOn": "07/16/2025",  "domain": "no-domain-provided" }}'
EXECUTE AS CALLER
AS
$$
// REGION SnowConvert AI Helpers Code
var HANDLE_NOTFOUND;
var _RS, ROW_COUNT, _ROWS, MESSAGE_TEXT, SQLCODE = 0, SQLSTATE = '00000', ERROR_HANDLERS, ACTIVITY_COUNT = 0, INTO, _OUTQUERIES = [], DYNAMIC_RESULTS = -1;
var formatDate = (arg) => (new Date(arg - (arg.getTimezoneOffset() * 60000))).toISOString().slice(0,-1);
var fixBind = function (arg) {
arg = arg == undefined ? null : arg instanceof Date ? formatDate(arg) : arg;
return arg;
};
var EXEC = function (stmt,binds,noCatch,catchFunction,opts) {
try {
binds = binds ? binds.map(fixBind) : binds;
_RS = snowflake.createStatement({
sqlText : stmt,
binds : binds
});
_ROWS = _RS.execute();
ROW_COUNT = _RS.getRowCount();
ACTIVITY_COUNT = _RS.getNumRowsAffected();
HANDLE_NOTFOUND && HANDLE_NOTFOUND(_RS);
if (INTO) return {
INTO : function () {
return INTO();
}
};
if (_OUTQUERIES.length < DYNAMIC_RESULTS) _OUTQUERIES.push(_ROWS.getQueryId());
if (opts && opts.temp) return _ROWS.getQueryId();
} catch(error) {
MESSAGE_TEXT = error.message;
SQLCODE = error.code;
SQLSTATE = error.state;
var msg = `ERROR CODE: ${SQLCODE} SQLSTATE: ${SQLSTATE} MESSAGE: ${MESSAGE_TEXT}`;
if (catchFunction) catchFunction(error);
if (!noCatch && ERROR_HANDLERS) ERROR_HANDLERS(error); else throw new Error(msg);
}
};
// END REGION

EXEC(`UPDATE TABLE1
   SET
      LOAD_USER_ID = :1,
      UPDATE_USER_ID = :2`,[LOAD_USER_ID,UPDATE_USER_ID]);
// ** SSC-EWI-0022 - ONE OR MORE IDENTIFIERS IN THIS STATEMENT WERE CONSIDERED PARAMETERS BY DEFAULT. REFERENCED TABLE NOT FOUND. **
EXEC(`INSERT INTO TABLE1 (LOAD_USER_ID, UPDATE_USER_ID)
VALUES (:1, :2)`,[LOAD_USER_ID,UPDATE_USER_ID]);
!!!RESOLVE EWI!!! /*** SSC-EWI-0073 - PENDING FUNCTIONAL EQUIVALENCE REVIEW FOR 'Delete' NODE ***/!!!
//DELETE FROM
//   TABLE1
//WHERE
//   UPPER(RTRIM(:LOAD_USER_ID)) = UPPER(RTRIM(LOAD_USER_ID))
null
$$;
Copy

Meilleures pratiques

  • Assurez-vous que toutes les dépendances (tables et vues) liées à l’instruction de procédure sont en cours de migration.

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

SSC-EWI-0023

Examen des performances - Une boucle contient une instruction Insert, Delete ou Update.

Avertissement

L’EWI n’est généré que lorsque Javascript est le langage cible pour les procédures stockées. Il s’agit d’une fonctionnalité de traduction obsolète, car l’Exécution de scripts Snowflake est le langage cible recommandé pour les procédures stockées.

Note

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

Gravité

Faible

Description

Cet avertissement signale un élément que l’utilisateur devrait peut-être prendre en compte en ce qui concerne les performances.

Exemple de code

Code d’entrée:
 -- Additional Params: -t javascript
REPLACE PROCEDURE Database1.Proc1()
BEGIN
    DECLARE lNumber INTEGER DEFAULT 1;
    FOR class1 AS class2 CURSOR FOR 
      SELECT COL0,
      TRIM(COL1) AS COL1ALIAS,
      TRIM(COL2),
      COL3
      FROM someDb.prefixCol
    DO
      INSERT INTO TempDB.Table1 (:lgNumber, :lNumber, (',' || :class1.ClassCD || '_Ind CHAR(1) NOT NULL'));
      SET lNumber = lNumber + 1;
    END FOR;
END;
Copy
Code généré :
 CREATE OR REPLACE PROCEDURE Database1.Proc1 ()
RETURNS STRING
LANGUAGE JAVASCRIPT
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"teradata"}}'
EXECUTE AS CALLER
AS
$$
    // SnowConvert AI Helpers Code section is omitted.

    var LNUMBER = 1;
    /*** SSC-EWI-0023 - PERFORMANCE REVIEW - THIS LOOP CONTAINS AN INSERT, DELETE OR UPDATE STATEMENT ***/
    for(var CLASS2 = new CURSOR(`SELECT
   COL0,
   TRIM(COL1) AS COL1ALIAS,
   TRIM(COL2),
   COL3
FROM
   someDb.prefixCol`,[],false).OPEN();CLASS2.NEXT();) {
        let CLASS1 = CLASS2.CURRENT;
        EXEC(`INSERT INTO TempDB.Table1
VALUES (:lgNumber, :1, (',' || :
!!!RESOLVE EWI!!! /*** SSC-EWI-0026 - THE  VARIABLE class1.ClassCD MAY REQUIRE A CAST TO DATE, TIME OR TIMESTAMP ***/!!!
:2 || '_Ind CHAR(1) NOT NULL'))`,[LNUMBER,CLASS1.CLASSCD]);
        LNUMBER = LNUMBER + 1;
    }
    CLASS2.CLOSE();
$$;
Copy

Meilleures pratiques

SSC-EWI-0025

Les variables temporelles de liaison peuvent nécessiter un changement dans la requête.

Avertissement

L’EWI n’est généré que lorsque Javascript est le langage cible pour les procédures stockées. Il s’agit d’une fonctionnalité de traduction obsolète, car l’Exécution de scripts Snowflake est le langage cible recommandé pour les procédures stockées.

Note

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

Gravité

Faible

Description

L’action des variables temporelles de liaison peut nécessiter des modifications dans la requête qui les contient.

Exemple de code

Code d’entrée:
 -- Additional Params: -t javascript
CREATE PROCEDURE P_1025()
BEGIN
  DECLARE LN_EMP_KEY_NO_PARAM NUMERIC DEFAULT -1;
  DECLARE FLOATVARNAME FLOAT DEFAULT 12.1;
  DECLARE hErrorMsg CHARACTER(30) DEFAULT 'NO ERROR';
  DECLARE CurrTs TIME DEFAULT CURRENT_TIME;
  DECLARE CurrTs2 TIME DEFAULT CURRENT_TIMESTAMP;
END;
Copy
Code généré :
 CREATE OR REPLACE PROCEDURE P_1025 ()
RETURNS STRING
LANGUAGE JAVASCRIPT
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"teradata"}}'
EXECUTE AS CALLER
AS
$$
  // SnowConvert AI Helpers Code section is omitted.

  var LN_EMP_KEY_NO_PARAM = -1;
  var FLOATVARNAME = 12.1;
  var HERRORMSG = `NO ERROR`;
  var CURRTS = new Date() /*** SSC-EWI-0025 - BINDING TIME VARIABLE MIGHT REQUIRE CHANGE IN QUERY. ***/;
  var CURRTS2 = new Date();
$$;
Copy

Meilleures pratiques

  • Aucune autre action de l’utilisateur n’est requise.

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

SSC-EWI-0026

Les variables qualifiées peuvent nécessiter une conversion.

Avertissement

L’EWI n’est généré que lorsque Javascript est le langage cible pour les procédures stockées. Il s’agit d’une fonctionnalité de traduction obsolète, car l’Exécution de scripts Snowflake est le langage cible recommandé pour les procédures stockées.

Note

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

Gravité

Faible

Description

Cet avertissement est ajouté lorsqu’il existe une requête avec une variable comportant un membre qualifié, comme un enregistrement Oracle ou une variable For Loop Teradata. Selon l’endroit où la variable est utilisée et le type de valeur, une conversion peut être nécessaire pour assurer un bon fonctionnement.

Exemple de code

Code d’entrée:
 CREATE TABLE TABLE1 (COL1 DATE);
CREATE TABLE TABLE2 (COL1 VARCHAR(25));

CREATE OR REPLACE PROCEDURE EXAMPLE
IS
    CURSOR C1 IS SELECT * FROM TABLE1;
BEGIN
    FOR REC1 IN C1 LOOP
		    insert into TABLE2 values (TO_CHAR(REC1.COL1, 'DD-MM-YYYY'));
    END LOOP;
END;
Copy
Code généré :
 -- Additional Params: -t javascript
CREATE OR REPLACE TABLE TABLE1 (COL1 TIMESTAMP /*** SSC-FDM-OR0042 - DATE TYPE COLUMN HAS A DIFFERENT BEHAVIOR IN SNOWFLAKE. ***/
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"oracle"}}'
;

CREATE OR REPLACE TABLE TABLE2 (COL1 VARCHAR(25))
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"oracle"}}'
;

CREATE OR REPLACE PROCEDURE EXAMPLE ()
RETURNS STRING
LANGUAGE JAVASCRIPT
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"oracle"}}'
EXECUTE AS CALLER
AS
$$
	// SnowConvert AI Helpers Code section is omitted.

	let C1 = new CURSOR(`SELECT * FROM
      TABLE1`,() => []);
	C1.OPEN();
	// ** SSC-EWI-0023 - PERFORMANCE REVIEW - THIS LOOP CONTAINS AN INSERT, DELETE OR UPDATE STATEMENT **
	while ( C1.NEXT() ) {
		let REC1 = C1.CURRENT;
		EXEC(`insert into TABLE2
		    values (TO_CHAR(
		    !!!RESOLVE EWI!!! /*** SSC-EWI-0026 - THE  VARIABLE REC1.COL1 MAY REQUIRE A CAST TO DATE, TIME OR TIMESTAMP ***/!!!
		    ?, 'DD-MM-YYYY'))`,[REC1.COL1]);
	}
	C1.CLOSE();
$$;
Copy
Code généré avec ajustements:
 CREATE OR REPLACE TABLE TABLE1 (COL1 TIMESTAMP
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
;

CREATE OR REPLACE TABLE TABLE2 (COL1 VARCHAR(25))
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
;

CREATE OR REPLACE PROCEDURE EXAMPLE ()
RETURNS STRING
LANGUAGE JAVASCRIPT
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
EXECUTE AS CALLER
AS
$$
	// SnowConvert AI Helpers Code section is omitted.

	let C1 = new CURSOR(`SELECT * FROM
      TABLE1`,() => []);
	C1.OPEN();
	// ** SSC-EWI-0023 - PERFORMANCE REVIEW - THIS LOOP CONTAINS AN INSERT, DELETE OR UPDATE STATEMENT **
	while ( C1.NEXT() ) {
		let REC1 = C1.CURRENT;
		EXEC(`insert into TABLE2
		    values (TO_CHAR(REC1.COL1::DATE, 'DD-MM-YYYY'))`,[REC1.COL1]);
	}
	C1.CLOSE();
$$;
Copy

Meilleures pratiques

  • Vérifiez si une conversion en date, heure ou horodatage est nécessaire pour la liaison. Certains cas ne sont pas nécessaires, car une conversion implicite est effectuée sur la valeur.

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

SSC-EWI-0027

L’instruction suivante utilise une variable/un littéral avec une requête non valide et elle ne sera pas exécutée.

Note

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

Gravité

Medium

Description

Cet avertissement est utilisé pour signaler qu’une instruction spécifique utilise une variable ou un littéral avec une requête non valide et que, pour cette raison, elle ne sera pas exécutée.

Exemple de code

Code d’entrée:
 REPLACE PROCEDURE TEST.COLLECT_STATS () 
BEGIN
  COLLECT STATS ON DBC.AccessRights COLUMN(COLNAME);

  SET STATS_STATEMENT = 'COLLECT STATS ON ' || OUT_DB || '.' || OUT_TBL || ' COLUMN(' || C4.ColumnName || ');';

  EXECUTE IMMEDIATE STATS_STATEMENT;

  EXECUTE IMMEDIATE 'COLLECT STATS ON DBC.AccessRights COLUMN(COLNAME);';

  SET STATS_STATEMENT_NOT_DYNAMIC = 'COLLECT STATS ON DBC.AccessRights COLUMN(COLNAME);';

  EXECUTE IMMEDIATE STATS_STATEMENT_NOT_DYNAMIC;

END;
;
Copy
Code généré :
 CREATE OR REPLACE PROCEDURE TEST.COLLECT_STATS ()
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"teradata"}}'
EXECUTE AS CALLER
AS
$$
  BEGIN
--    --** SSC-FDM-0027 - REMOVED NEXT STATEMENT, NOT APPLICABLE IN SNOWFLAKE. COLLECT **
--    COLLECT STATS ON DBC.AccessRights COLUMN(COLNAME);
    STATS_STATEMENT := 'COLLECT STATS ON ' || OUT_DB || '.' || OUT_TBL || ' COLUMN(' || C4.ColumnName || ')';
    !!!RESOLVE EWI!!! /*** SSC-EWI-0027 - THE FOLLOWING STATEMENT USES A VARIABLE/LITERAL WITH AN INVALID QUERY AND IT WILL NOT BE EXECUTED ***/!!!!!!RESOLVE EWI!!! /*** SSC-EWI-0030 - THE STATEMENT BELOW HAS USAGES OF DYNAMIC SQL. ***/!!!

    EXECUTE IMMEDIATE STATS_STATEMENT;
    !!!RESOLVE EWI!!! /*** SSC-EWI-0027 - THE FOLLOWING STATEMENT USES A VARIABLE/LITERAL WITH AN INVALID QUERY AND IT WILL NOT BE EXECUTED ***/!!!!!!RESOLVE EWI!!! /*** SSC-EWI-0030 - THE STATEMENT BELOW HAS USAGES OF DYNAMIC SQL. ***/!!!

    EXECUTE IMMEDIATE 'COLLECT STATS ON DBC.AccessRights COLUMN(COLNAME)';
    STATS_STATEMENT_NOT_DYNAMIC := 'COLLECT STATS ON DBC.AccessRights COLUMN(COLNAME)';
    !!!RESOLVE EWI!!! /*** SSC-EWI-0027 - THE FOLLOWING STATEMENT USES A VARIABLE/LITERAL WITH AN INVALID QUERY AND IT WILL NOT BE EXECUTED ***/!!!!!!RESOLVE EWI!!! /*** SSC-EWI-0030 - THE STATEMENT BELOW HAS USAGES OF DYNAMIC SQL. ***/!!!

    EXECUTE IMMEDIATE STATS_STATEMENT_NOT_DYNAMIC;
  END;
$$;
Copy

Meilleures pratiques

  • Vérifiez si une conversion en date, heure ou horodatage est nécessaire pour la liaison. Certains cas ne sont pas nécessaires, car une conversion implicite est effectuée sur la valeur.

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

SSC-EWI-0028

Type non pris en charge par Snowflake

Gravité

Medium

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
);
Copy
Code généré :
 CREATE OR REPLACE TABLE MYTABLE
    (
    !!!RESOLVE EWI!!! /*** SSC-EWI-0028 - TYPE NOT SUPPORTED BY SNOWFLAKE ***/!!!
        COL1 SYS.ANYDATASET
    )
    COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"oracle"}}'
    ;
Copy

Meilleures pratiques

SSC-EWI-0029

Le format de données de tables externes n’est pas pris en charge dans Snowflake.

Gravité

Medium

Description

Snowflake prend en charge les formats de tables externes suivants :

BigQuery

Snowflake

AVRO

AVRO

CSV
GOOGLE_SHEETS

CSV

NEWLINE_DELIMITED_JSON
JSON

JSON

ORC

ORC

PARQUET

PARQUET

Lorsqu’une table externe comprend un autre FORMAT non spécifié dans le tableau ci-dessus, cet EWI sera généré pour informer l’utilisateur que ce FORMAT n’est pas pris en charge.

Exemple de code

Code d’entrée :
BigQuery
 CREATE OR REPLACE EXTERNAL TABLE test.backup_restore_table
OPTIONS (
  format = 'DATASTORE_BACKUP',
  uris = ['gs://backup_bucket/backup_folder/*']
);
Copy
Code généré :
Snowflake
 !!!RESOLVE EWI!!! /*** SSC-EWI-0029 - EXTERNAL TABLE DATA FORMAT NOT SUPPORTED IN SNOWFLAKE ***/!!!
CREATE OR REPLACE EXTERNAL TABLE test.backup_restore_table 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_BACKUP_RESTORE_TABLE_FORMAT'))
)
!!!RESOLVE EWI!!! /*** SSC-EWI-0032 - EXTERNAL TABLE REQUIRES AN EXTERNAL STAGE TO ACCESS gs://backup_bucket, DEFINE AND REPLACE THE EXTERNAL_STAGE PLACEHOLDER ***/!!!
LOCATION = @EXTERNAL_STAGE
AUTO_REFRESH = false
PATTERN = 'backup_folder/.*'
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-EWI-0030

L’instruction ci-dessous possède des utilisations du SQL dynamique.

Note

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

Gravité

Medium

Description

Cette erreur est utilisée pour indiquer que l’instruction possède des utilisations du SQL dynamique. Chaque langage source spécifique possède son propre ensemble d’instructions pouvant exécuter du SQL dynamique. Le SQL dynamique fait référence au code qui est construit sous forme de texte à l’aide des outils de manipulation de chaînes fournis par le langage du moteur de base de données.

Ce scénario est considéré comme un modèle complexe, car le SQL dynamique est construit et exécuté lors de l’exécution, ce qui rend plus difficile le suivi et le débogage des erreurs. Cette erreur est destinée à aider à détecter certains problèmes qu’un analyseur de code statique comme Snow Convert ne peut pas détecter.

Exemple de code

Teradata

Entrée
 REPLACE PROCEDURE teradata_dynamic_sql()
BEGIN
  DECLARE str_sql VARCHAR(20);
  SET str_sql = 'UPDATE TABLE
                    SET COLA = 0,
                        COLB = ''test''';

  EXECUTE IMMEDIATE str_sql;
  EXECUTE IMMEDIATE 'INSERT INTO TABLE1(COL1) VALUES(1)';
  EXECUTE str_sql;
  CALL DBC.SysExecSQL('INSERT INTO TABLE1(COL1) VALUES(1)');
END;
Copy
Sortie
 CREATE OR REPLACE PROCEDURE teradata_dynamic_sql ()
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "teradata",  "convertedOn": "07/04/2024" }}'
EXECUTE AS CALLER
AS
$$
  DECLARE
    str_sql VARCHAR(20);
  BEGIN
     
    str_sql := 'UPDATE "TABLE"
   SET COLA = 0,
       COLB = ''test''';
    !!!RESOLVE EWI!!! /*** SSC-EWI-0030 - THE STATEMENT BELOW HAS USAGES OF DYNAMIC SQL. ***/!!!
    EXECUTE IMMEDIATE str_sql;
    !!!RESOLVE EWI!!! /*** SSC-EWI-0030 - THE STATEMENT BELOW HAS USAGES OF DYNAMIC SQL. ***/!!!
    EXECUTE IMMEDIATE 'INSERT INTO TABLE1 (COL1)
VALUES (1);';
    !!!RESOLVE EWI!!! /*** SSC-EWI-0030 - THE STATEMENT BELOW HAS USAGES OF DYNAMIC SQL. ***/!!!
    EXECUTE IMMEDIATE str_sql;
    !!!RESOLVE EWI!!! /*** SSC-EWI-0030 - THE STATEMENT BELOW HAS USAGES OF DYNAMIC SQL. ***/!!!
    EXECUTE IMMEDIATE 'INSERT INTO TABLE1 (COL1)
VALUES (1);';
  END;
$$;
Copy

Oracle

Entrée
 CREATE OR REPLACE PROCEDURE oracle_dynamic_sql
AS
    dynamic_statement VARCHAR(100);
    numeric_variable INTEGER;
    dynamic_statement VARCHAR(100);
    column_variable VARCHAR(100);
    cursor_variable SYS_REFCURSOR;
    c INTEGER;
    dynamic_statement VARCHAR(100);
BEGIN
    dynamic_statement := 'INSERT INTO sample_table(col1) VALUES(1)';
    numeric_variable := 3;
    column_variable := 'col1';

    EXECUTE IMMEDIATE dynamic_statement;
    EXECUTE IMMEDIATE 'INSERT INTO sample_table(col1) VALUES(' || numeric_variable || ')';

    OPEN cursor_variable FOR dynamic_statement;
    OPEN cursor_variable FOR 'SELECT ' || column_variable || ' FROM sample_table';
    OPEN cursor_variable FOR 'SELECT col1 FROM sample_table';

    
    c := DBMS_SQL.OPEN_CURSOR;
    dynamic_statement := 'SELECT * FROM sample_table';
    DBMS_SQL.PARSE(c, dynamic_statement);
END;
Copy
Sortie
 CREATE OR REPLACE PROCEDURE oracle_dynamic_sql ()
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"oracle"}}'
EXECUTE AS CALLER
AS
$$
    DECLARE
        dynamic_statement VARCHAR(100);
        numeric_variable INTEGER;
        dynamic_statement VARCHAR(100);
        column_variable VARCHAR(100);
        cursor_variable_res RESULTSET;
        c INTEGER;
        dynamic_statement VARCHAR(100);
    BEGIN
        dynamic_statement := 'INSERT INTO sample_table(col1) VALUES(1)';
        numeric_variable := 3;
        column_variable := 'col1';
        !!!RESOLVE EWI!!! /*** SSC-EWI-0030 - THE STATEMENT BELOW HAS USAGES OF DYNAMIC SQL. ***/!!!
        EXECUTE IMMEDIATE :dynamic_statement;
        !!!RESOLVE EWI!!! /*** SSC-EWI-0030 - THE STATEMENT BELOW HAS USAGES OF DYNAMIC SQL. ***/!!!
    EXECUTE IMMEDIATE 'INSERT INTO sample_table(col1) VALUES(' || NVL(:numeric_variable :: STRING, '') || ')';
        !!!RESOLVE EWI!!! /*** SSC-EWI-0030 - THE STATEMENT BELOW HAS USAGES OF DYNAMIC SQL. ***/!!!
        cursor_variable_res := (
            EXECUTE IMMEDIATE :dynamic_statement
        );
        LET cursor_variable CURSOR
        FOR
            cursor_variable_res;
        OPEN cursor_variable;
        !!!RESOLVE EWI!!! /*** SSC-EWI-0030 - THE STATEMENT BELOW HAS USAGES OF DYNAMIC SQL. ***/!!!
        cursor_variable_res := (
            EXECUTE IMMEDIATE 'SELECT ' || NVL(:column_variable :: STRING, '') || ' FROM
   sample_table'
        );
        !!!RESOLVE EWI!!! /*** SSC-EWI-OR0133 - THE CURSOR VARIABLE NAMED 'cursor_variable' HAS ALREADY BEEN ASSIGNED IN ANOTHER CURSOR ***/!!!
        LET cursor_variable CURSOR
        FOR
            cursor_variable_res;
        OPEN cursor_variable;
        !!!RESOLVE EWI!!! /*** SSC-EWI-0030 - THE STATEMENT BELOW HAS USAGES OF DYNAMIC SQL. ***/!!!
        cursor_variable_res := (
            EXECUTE IMMEDIATE 'SELECT col1 FROM
   sample_table'
        );
        !!!RESOLVE EWI!!! /*** SSC-EWI-OR0133 - THE CURSOR VARIABLE NAMED 'cursor_variable' HAS ALREADY BEEN ASSIGNED IN ANOTHER CURSOR ***/!!!
        LET cursor_variable CURSOR
        FOR
            cursor_variable_res;
        OPEN cursor_variable;
        c :=
        !!!RESOLVE EWI!!! /*** SSC-EWI-OR0076 - TRANSLATION FOR BUILT-IN PACKAGE 'DBMS_SQL.OPEN_CURSOR' IS NOT CURRENTLY SUPPORTED. ***/!!!
        '' AS OPEN_CURSOR;
        dynamic_statement := 'SELECT * FROM
   sample_table';
        !!!RESOLVE EWI!!! /*** SSC-EWI-OR0076 - TRANSLATION FOR BUILT-IN PACKAGE 'DBMS_SQL.PARSE' IS NOT CURRENTLY SUPPORTED. ***/!!!!!!RESOLVE EWI!!! /*** SSC-EWI-0030 - THE STATEMENT BELOW HAS USAGES OF DYNAMIC SQL. ***/!!!
    DBMS_SQL.PARSE(:c, :dynamic_statement);
    END;
$$;
Copy

SQL Server

Entrée
 CREATE OR ALTER PROCEDURE transact_dynamic_sql
AS
BEGIN
    DECLARE @dynamicStatement AS VARCHAR(200);
    DECLARE @numericVariable AS VARCHAR(200);

    SET @dynamicStatement = 'INSERT INTO sample_table(col1) VALUES(1);';
    SET @numericVariable = '3';

    EXECUTE (@dynamicStatement);
    EXEC ('INSERT INTO sampleTable(col1) VALUES (' + @numericVariable + ');');
    EXECUTE ('INSERT INTO sampleTable(col1) VALUES(10);') AS USER = 'DbAdmin';
    
    INSERT INTO sampleTable EXECUTE sp_executesql @statement = 'SELECT * FROM sampleTable;';
    INSERT INTO sampleTable EXECUTE ('SELECT * FROM sampleTable;');
END;
Copy
Sortie
 CREATE OR REPLACE PROCEDURE transact_dynamic_sql ()
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "transact",  "convertedOn": "11/13/2024",  "domain": "test" }}'
EXECUTE AS CALLER
AS
$$
    DECLARE
        DYNAMICSTATEMENT VARCHAR(200);
        NUMERICVARIABLE VARCHAR(200);
    BEGIN
         
         
        DYNAMICSTATEMENT := 'INSERT INTO sample_table (col1) VALUES(1);';
        NUMERICVARIABLE := '3';
        !!!RESOLVE EWI!!! /*** SSC-EWI-0030 - THE STATEMENT BELOW HAS USAGES OF DYNAMIC SQL. ***/!!!
        EXECUTE IMMEDIATE :DYNAMICSTATEMENT;
        !!!RESOLVE EWI!!! /*** SSC-EWI-0030 - THE STATEMENT BELOW HAS USAGES OF DYNAMIC SQL. ***/!!!
        EXECUTE IMMEDIATE 'INSERT INTO sampleTable (col1) VALUES (' || :NUMERICVARIABLE || ');';
        !!!RESOLVE EWI!!! /*** SSC-EWI-0030 - THE STATEMENT BELOW HAS USAGES OF DYNAMIC SQL. ***/!!!!!!RESOLVE EWI!!! /*** SSC-EWI-0021 - EXECUTE AS USER/LOGIN NOT SUPPORTED IN SNOWFLAKE ***/!!!
        EXECUTE IMMEDIATE 'INSERT INTO sampleTable (col1) VALUES(10);';
        !!!RESOLVE EWI!!! /*** SSC-EWI-0030 - THE STATEMENT BELOW HAS USAGES OF DYNAMIC SQL. ***/!!!!!!RESOLVE EWI!!! /*** SSC-EWI-0073 - PENDING FUNCTIONAL EQUIVALENCE REVIEW FOR 'INSERT WITH EXECUTE' NODE ***/!!!
        INSERT INTO sampleTable EXECUTE IMMEDIATE 'SELECT
   *
FROM
   sampleTable;';
        !!!RESOLVE EWI!!! /*** SSC-EWI-0030 - THE STATEMENT BELOW HAS USAGES OF DYNAMIC SQL. ***/!!!!!!RESOLVE EWI!!! /*** SSC-EWI-0073 - PENDING FUNCTIONAL EQUIVALENCE REVIEW FOR 'INSERT WITH EXECUTE' NODE ***/!!!
    INSERT INTO sampleTable EXECUTE IMMEDIATE 'SELECT
   *
FROM
   sampleTable;';
    END;
$$;
Copy

Questions relatives à SQL dynamique

Un point important à prendre en compte est que lors de la migration du code SQL dynamique, SnowConvert AI ne signalera aucun type de problème à l’intérieur du SQL dynamique dans le code de sortie ou dans les rapports d’évaluation. Cela se produira même lorsque la documentation d’un problème ou la spécification de traduction indique qu’un problème sera toujours ajouté au code de sortie. Voici un exemple de migration dans Oracle où cette situation peut être rencontrée :

Oracle
 SELECT dbms_random.value() FROM dual;

CREATE OR REPLACE PROCEDURE dynamic_sql_procedure
AS
  result VARCHAR(100) := 'SELECT dbms_random.value() from dual';
BEGIN
  NULL;  
END;
Copy
Snowflake
 SELECT
  --** SSC-FDM-OR0033 - DBMS_RANDOM.VALUE DIGITS OF PRECISION ARE LOWER IN SNOWFLAKE **
  DBMS_RANDOM.VALUE_UDF() FROM dual;

CREATE OR REPLACE PROCEDURE dynamic_sql_procedure ()
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
EXECUTE AS CALLER
AS
$$
  DECLARE
    result VARCHAR(100) := 'SELECT
   DBMS_RANDOM.VALUE_UDF() from dual';
  BEGIN
    NULL;
  END;
$$;
Copy

Dans l’exemple précédent, la requête et l’affectation de la variable à l’intérieur de la procédure seront converties exactement de la même manière. La différence est que dans le code SQL dynamique, les problèmes de conversion ne seront pas indiqués dans le code de sortie et dans les rapports d’évaluation.

Meilleures pratiques

  • Utilisez cette balise pour suivre chaque instruction construite dynamiquement et examiner son exactitude lors du dépannage.

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

SSC-EWI-0031

Fonction non prise en charge.

Note

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

Sévérité

Medium

Description

Cet avertissement est utilisé pour signaler qu’une fonction intégrée Teradata, Oracle ou SQL Server n’est pas prise en charge.

Exemple de code

Code d’entrée (Oracle) :
 SELECT VALUE(ST) FROM SampleTable ST;
Copy
Code de sortie :
 // SnowConvert AI Helpers Code section is omitted.
SELECT
!!!RESOLVE EWI!!! /*** SSC-EWI-0031 - VALUE FUNCTION NOT SUPPORTED ***/!!!
 VALUE(ST) FROM
 SampleTable ST;
Copy

Bonnes pratiques

SSC-EWI-0032

Une table externe nécessite une zone de préparation externe pour accéder à un emplacement externe, définir et remplacer l‘espace réservé EXTERNAL_STAGE.

Description

Lors de la transformation de l’instruction CREATE EXTERNAL TABLE, SnowConvert AI générera un espace réservé EXTERNAL_STAGE devant être remplacé par la zone de préparation externe créée pour la connexion avec l’emplacement externe de Snowflake.

Veuillez vous référer aux guides suivants pour configurer l’intégration de stockage et la zone de préparation externe nécessaires dans votre compte Snowflake :

Exemple de code

Code d’entrée :
BigQuery
 CREATE OR REPLACE EXTERNAL TABLE test.Employees_test
(
  Employee_id INTEGER,
  Name STRING,
  Mail STRING,
  Position STRING,
  Salary INTEGER
)
OPTIONS(
  FORMAT='CSV',
  SKIP_LEADING_ROWS=1,
  URIS=['gs://sc_external_table_bucket/folder_with_csv/Employees.csv']
);
Copy
Code généré :
Snowflake
CREATE OR REPLACE EXTERNAL TABLE test.Employees_test
(
  Employee_id INTEGER AS CAST(GET_IGNORE_CASE($1, 'c1') AS INTEGER),
  Name STRING AS CAST(GET_IGNORE_CASE($1, 'c2') AS STRING),
  Mail STRING AS CAST(GET_IGNORE_CASE($1, 'c3') AS STRING),
  Position STRING AS CAST(GET_IGNORE_CASE($1, 'c4') AS STRING),
  Salary INTEGER AS CAST(GET_IGNORE_CASE($1, 'c5') AS INTEGER)
)
!!!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);

Meilleures pratiques

  • Configurez votre connexion externe dans le compte Snowflake et remplacez l’espace réservé EXTERNAL_STAGE pour effectuer la transformation.

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

SSC-EWI-0033

Format supprimé. Informations sémantiques introuvables.

Note

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

Gravité

Faible

Description

Cet avertissement apparaît lorsqu’une colonne utilisée dans une fonction CAST avec un format de sortie spécifique n’a pas été trouvée dans le code source.

Exemple de code

Code d’entrée (Teradata) :
 CREATE VIEW SampleView AS
SELECT
    DAY_DATE(FORMAT 'MMM-YYYY')(CHAR(8))
FROM
    SampleTable;
Copy
Code généré:
 // SnowConvert AI Helpers Code section is omitted.
CREATE OR REPLACE VIEW SampleView
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"teradata"}}'
AS
SELECT
    CAST(RPAD(TO_VARCHAR(
    DAY_DATE !!!RESOLVE EWI!!! /*** SSC-EWI-0033 - FORMAT 'MMM-YYYY' REMOVED, SEMANTIC INFORMATION NOT FOUND. ***/!!!), 8) AS CHAR(8))
    FROM
    SampleTable;
Copy

Meilleures pratiques

  • Assurez-vous que toutes les dépendances (tables et vues) liées à l’instruction de procédure sont en cours de migration.

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

SSC-EWI-0034

Format supprimé.

Note

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

Gravité

Faible

Description

Cet avertissement apparaît lorsque le format de la colonne utilisée dans une fonction CAST est supprimé.

Exemple de code

Code d’entrée (Teradata) :
 CREATE VIEW SampleView AS
SELECT
    DAY_DATE(FORMAT 'MMM-YYYY') + 1
FROM
    SampleTable;
Copy
Code généré:
 // SnowConvert AI Helpers Code section is omitted.
CREATE OR REPLACE VIEW SampleView
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"teradata"}}'
AS
SELECT
    DAY_DATE !!!RESOLVE EWI!!! /*** SSC-EWI-0034 - FORMAT 'MMM-YYYY' REMOVED. ***/!!! + 1
FROM
    SampleTable;
Copy

Meilleures pratiques

SSC-EWI-0035

Instruction de vérification non prise en charge.

Note

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

Gravité

Faible

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

Meilleures pratiques

SSC-EWI-0036

Type de données converti en autre type de données.

Gravité

Faible

Description

Cet avertissement apparaît lorsqu’un type de données est changé en un autre.

Exemple de code

Code source :
 CREATE TABLE SampleTable (
    SampleYear INTERVAL YEAR(2),
    SampleMonth INTERVAL MONTH(2)
);
Copy
Code converti:
 CREATE OR REPLACE TABLE SampleTable (
    SampleYear VARCHAR(21) !!!RESOLVE EWI!!! /*** SSC-EWI-0036 - INTERVAL YEAR(2) DATA TYPE CONVERTED TO VARCHAR ***/!!!,
    SampleMonth VARCHAR(21) !!!RESOLVE EWI!!! /*** SSC-EWI-0036 - INTERVAL MONTH(2) DATA TYPE CONVERTED TO VARCHAR ***/!!!
)
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "teradata",  "convertedOn": "07/23/2024" }}'
;
Copy

Meilleures pratiques

SSC-EWI-0040

Clause non prise en charge.

Note

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

Gravité

Faible

Description

Cet avertissement est ajouté lorsqu’il existe une instruction qui n’est pas prise en charge dans SnowFlake.

Exemple de code

Dans l’exemple suivant, la clause PERCENT de SQL Server est utilisée sur la requête SELECT. Cela n’est pas pris en charge par Snowflake.

Code d’entrée (SQL Server) :
 SELECT TOP 1 PERCENT * FROM SampleTable;
Copy
Code source :
 // SnowConvert AI Helpers Code section is omitted.
SELECT
TOP 1 !!!RESOLVE EWI!!! /*** SSC-EWI-0040 - THE 'TOP PERCENT' CLAUSE IS NOT SUPPORTED IN SNOWFLAKE ***/!!!
	*
FROM
	SampleTable;
Copy

Meilleures pratiques

  • Examinez la fonctionnalité d’origine de l’instruction et vérifiez si elle est réellement nécessaire pour vos besoins spécifiques dans Snowflake.

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

SSC-EWI-0041

Le fichier présente un encodage inattendu et n’a pas été traduit.

Note

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

Description

Ce problème se produit lorsqu’un fichier de code source a un format d’encodage qui n’est pas reconnu par l’outil. L’encodage des caractères est le processus d’attribution de nombres à des caractères graphiques et, en l’occurrence, à des caractères écrits de langage humain. Par conséquent, l’erreur indique que l’outil de conversion n’a pas pu reconnaître certains caractères.

Meilleures pratiques

  • Tous les fichiers du dossier d’entrée doivent avoir le même encodage pour éviter cette erreur.

  • L’encodage approprié doit être sélectionné via les paramètres de conversion ou en utilisant le –paramètre de conversion d’encodage avec la CLI. Pour déterminer l’encodage à sélectionner, utilisez des outils en ligne comme Free Online Formatter, ou exécutez la commande file -i * sous Linux ou OS.

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

SSC-EWI-0045

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

Gravité

Medium

Description

Dans certains cas, les noms de colonnes qui sont valides dans le langage source peuvent entrer en conflit avec les mots-clés réservés de Snowflake. Ces conflits surviennent, car Snowflake réserve un ensemble de mots-clés qui ne peuvent pas être utilisés directement comme noms de colonnes sans traitement spécial. Pour plus de détails, référez-vous à la documentation officielle de Snowflake sur les mots clés réservés et limités.

Exemple de code

Entrée
 CREATE TABLE T1
(
    LOCALTIME VARCHAR,
    CURRENT_USER VARCHAR
);
Copy
Sortie
 CREATE OR REPLACE TABLE T1
    (
    !!!RESOLVE EWI!!! /*** SSC-EWI-0045 - COLUMN NAME 'LOCALTIME' IS A SNOWFLAKE RESERVED KEYWORD ***/!!!
    "LOCALTIME" VARCHAR,
    !!!RESOLVE EWI!!! /*** SSC-EWI-0045 - 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"}}'
    ;
Copy

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-EWI-0046

Les déclarations de fonctions/procédures imbriquées sont considérées comme un modèle complexe et ne sont pas prises en charge dans Snowflake.

Gravité

Critique

Description

Snowflake ne prend pas en charge la déclaration de fonctions/procédures imbriquées. Cet avertissement est ajouté à toute instruction de création de fonction ou de création de procédure dans laquelle des déclarations imbriquées ont été trouvées.

Exemple de code

Entrée
 CREATE OR REPLACE FUNCTION myFunction
RETURN INTEGER
IS
   total_count INTEGER;
   -- Function Declaration
   FUNCTION function_declaration(param1 VARCHAR) RETURN INTEGER;
   FUNCTION function_definition
   RETURN INTEGER
   IS
   count INTEGER;
   PROCEDURE procedure_declaration(param1 INTEGER)
   IS
       BEGIN
            NULL;
       END;
  BEGIN
    RETURN count;
  end;
BEGIN
    -- Your logic to calculate the total employee count goes here
    RETURN total_count;
END;
Copy
Sortie
 !!!RESOLVE EWI!!! /*** SSC-EWI-0046 - NESTED FUNCTION/PROCEDURE DECLARATIONS ARE NOT SUPPORTED IN SNOWFLAKE. ***/!!!
CREATE OR REPLACE FUNCTION myFunction ()
RETURNS FLOAT
LANGUAGE JAVASCRIPT
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "oracle",  "convertedOn": "12/16/2024",  "domain": "test" }}'
AS
$$
  let TOTAL_COUNT;
  !!!RESOLVE EWI!!! /*** SSC-EWI-OR0057 - TRANSFORMATION FOR NESTED FUNCTION IS NOT SUPPORTED IN THIS SCENARIO ***/!!!
  /*    -- Function Declaration
     FUNCTION function_declaration(param1 VARCHAR) RETURN INTEGER; */
  // Function Declaration
  ;
  !!!RESOLVE EWI!!! /*** SSC-EWI-OR0057 - TRANSFORMATION FOR NESTED FUNCTION IS NOT SUPPORTED IN THIS SCENARIO ***/!!!
  /*    FUNCTION function_definition
     RETURN INTEGER
     IS
     count INTEGER;
     PROCEDURE procedure_declaration(param1 INTEGER)
     IS
         BEGIN
              NULL;
         END;
    BEGIN
      RETURN count;
    end; */
  ;
  // Your logic to calculate the total employee count goes here
  return TOTAL_COUNT;
$$;
Copy

Meilleures pratiques

  • Supprimez les déclarations imbriquées de la fonction/procédure.

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

SSC-EWI-0049

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

Note

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

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;
Copy
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
    !!!RESOLVE EWI!!! /*** SSC-EWI-0049 - A Global Temporary Table is being referenced ***/!!!
    t1;
Copy

Meilleures pratiques

SSC-EWI-0052

Objet inutilisable

Gravité

Medium

Description

Cette erreur se produit lorsque le code source utilise un paramètre ou une variable qui n’est pas pris en charge ou qui n’a pas été reconnu par l’outil de conversion.

Exemple de code

Code d’entrée (Oracle) :
 -- Additional Params: -t JavaScript
CREATE OR REPLACE PROCEDURE PROCEDURE_PARAMETERS(PARAM SDO_GEOMETRY)
AS
    VARIABLE SDO_GEOMETRY;
BEGIN
    VARIABLE := PARAM;
END;
Copy
Code généré :
 CREATE OR REPLACE PROCEDURE PROCEDURE_PARAMETERS (PARAM GEOMETRY)
RETURNS STRING
LANGUAGE JAVASCRIPT
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"oracle"}}'
EXECUTE AS CALLER
AS
$$
    // REGION SnowConvert AI Helpers Code
    var formatDate = (arg) => (new Date(arg - (arg.getTimezoneOffset() * 60000))).toISOString().slice(0,-1);
    var fixBind = function (arg) {
        arg = arg instanceof Date ? formatDate(arg) : IS_NULL(arg) ? null : arg;
        return arg;
    };
    var SQL = {
        FOUND : false,
        NOTFOUND : false,
        ROWCOUNT : 0,
        ISOPEN : false
    };
    var _RS, _ROWS, SQLERRM = "normal, successful completion", SQLCODE = 0;
    var getObj = (_rs) => Object.assign(new Object(),_rs);
    var getRow = (_rs) => (values = Object.values(_rs)) && (values = values.splice(-1 * _rs.getColumnCount())) && values;
    var fetch = (_RS,_ROWS,fmode) => _RS.getRowCount() && _ROWS.next() && (fmode ? getObj : getRow)(_ROWS) || (fmode ? new Object() : []);
    var EXEC = function (stmt,binds,opts) {
        try {
            binds = !(arguments[1] instanceof Array) && ((opts = arguments[1]) && []) || (binds || []);
            opts = opts || new Object();
            binds = binds ? binds.map(fixBind) : binds;
            _RS = snowflake.createStatement({
                    sqlText : stmt,
                    binds : binds
                });
            _ROWS = _RS.execute();
            if (opts.sql !== 0) {
                var isSelect = stmt.toUpperCase().trimStart().startsWith("SELECT");
                var affectedRows = isSelect ? _RS.getRowCount() : _RS.getNumRowsAffected();
                SQL.FOUND = affectedRows != 0;
                SQL.NOTFOUND = affectedRows == 0;
                SQL.ROWCOUNT = affectedRows;
            }
            if (opts.row === 2) {
                return _ROWS;
            }
            var INTO = function (opts) {
                if (opts.vars == 1 && _RS.getColumnCount() == 1 && _ROWS.next()) {
                    return _ROWS.getColumnValue(1);
                }
                if (opts.rec instanceof Object && _ROWS.next()) {
                    var recordKeys = Object.keys(opts.rec);
                    Object.assign(opts.rec,Object.fromEntries(new Map(getRow(_ROWS).map((element,Index) => [recordKeys[Index],element]))))
                    return opts.rec;
                }
                return fetch(_RS,_ROWS,opts.row);
            };
            var BULK_INTO_COLLECTION = function (into) {
                for(let i = 0;i < _RS.getRowCount();i++) {
                    FETCH_INTO_COLLECTIONS(into,fetch(_RS,_ROWS,opts.row));
                }
                return into;
            };
            if (_ROWS.getRowCount() > 0) {
                return _ROWS.getRowCount() == 1 ? INTO(opts) : BULK_INTO_COLLECTION(opts);
            }
        } catch(error) {
            RAISE(error.code,error.name,error.message)
        }
    };
    var RAISE = function (code,name,message) {
        message === undefined && ([name,message] = [message,name])
        var error = new Error(message);
        error.name = name
        SQLERRM = `${(SQLCODE = (error.code = code))}: ${message}`
        throw error;
    };
    var FETCH_INTO_COLLECTIONS = function (collections,fetchValues) {
        for(let i = 0;i < collections.length;i++) {
            collections[i].push(fetchValues[i]);
        }
    };
    var IS_NULL = (arg) => !(arg || arg === 0);
    // END REGION

    let VARIABLE = new SDO_GEOMETRY();
    VARIABLE =
        !!!RESOLVE EWI!!! /*** SSC-EWI-0052 - UNUSABLE OBJECT PARAM, ITS DATATYPE WAS NOT TRANSFORMED ***/!!!
        PARAM;
$$;
Copy

Meilleures pratiques

  • Recherchez une alternative au type de données utilisé.

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

SSC-EWI-0053

L’objet peut ne pas fonctionner.

Gravité

Faible

Description

Cette erreur se produit lorsque l’outil de conversion n’a pas pu déterminer le type de données d’une variable. Cela peut se produire à cause d’une déclaration de variable manquante.

Exemple de code

Code d’entrée (Oracle) :
 -- Additional Params: -t javascript
CREATE OR REPLACE PROCEDURE PROCEDURE_VARIABLES
AS
    VARIABLE INTEGER;
BEGIN
    VARIABLE := ANOTHER_VARIABLE;
END;
Copy
Code généré :
 CREATE OR REPLACE PROCEDURE PROCEDURE_VARIABLES ()
RETURNS STRING
LANGUAGE JAVASCRIPT
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"oracle"}}'
EXECUTE AS CALLER
AS
$$
    // REGION SnowConvert AI Helpers Code
    var formatDate = (arg) => (new Date(arg - (arg.getTimezoneOffset() * 60000))).toISOString().slice(0,-1);
    var fixBind = function (arg) {
        arg = arg instanceof Date ? formatDate(arg) : IS_NULL(arg) ? null : arg;
        return arg;
    };
    var SQL = {
        FOUND : false,
        NOTFOUND : false,
        ROWCOUNT : 0,
        ISOPEN : false
    };
    var _RS, _ROWS, SQLERRM = "normal, successful completion", SQLCODE = 0;
    var getObj = (_rs) => Object.assign(new Object(),_rs);
    var getRow = (_rs) => (values = Object.values(_rs)) && (values = values.splice(-1 * _rs.getColumnCount())) && values;
    var fetch = (_RS,_ROWS,fmode) => _RS.getRowCount() && _ROWS.next() && (fmode ? getObj : getRow)(_ROWS) || (fmode ? new Object() : []);
    var EXEC = function (stmt,binds,opts) {
        try {
            binds = !(arguments[1] instanceof Array) && ((opts = arguments[1]) && []) || (binds || []);
            opts = opts || new Object();
            binds = binds ? binds.map(fixBind) : binds;
            _RS = snowflake.createStatement({
                    sqlText : stmt,
                    binds : binds
                });
            _ROWS = _RS.execute();
            if (opts.sql !== 0) {
                var isSelect = stmt.toUpperCase().trimStart().startsWith("SELECT");
                var affectedRows = isSelect ? _RS.getRowCount() : _RS.getNumRowsAffected();
                SQL.FOUND = affectedRows != 0;
                SQL.NOTFOUND = affectedRows == 0;
                SQL.ROWCOUNT = affectedRows;
            }
            if (opts.row === 2) {
                return _ROWS;
            }
            var INTO = function (opts) {
                if (opts.vars == 1 && _RS.getColumnCount() == 1 && _ROWS.next()) {
                    return _ROWS.getColumnValue(1);
                }
                if (opts.rec instanceof Object && _ROWS.next()) {
                    var recordKeys = Object.keys(opts.rec);
                    Object.assign(opts.rec,Object.fromEntries(new Map(getRow(_ROWS).map((element,Index) => [recordKeys[Index],element]))))
                    return opts.rec;
                }
                return fetch(_RS,_ROWS,opts.row);
            };
            var BULK_INTO_COLLECTION = function (into) {
                for(let i = 0;i < _RS.getRowCount();i++) {
                    FETCH_INTO_COLLECTIONS(into,fetch(_RS,_ROWS,opts.row));
                }
                return into;
            };
            if (_ROWS.getRowCount() > 0) {
                return _ROWS.getRowCount() == 1 ? INTO(opts) : BULK_INTO_COLLECTION(opts);
            }
        } catch(error) {
            RAISE(error.code,error.name,error.message)
        }
    };
    var RAISE = function (code,name,message) {
        message === undefined && ([name,message] = [message,name])
        var error = new Error(message);
        error.name = name
        SQLERRM = `${(SQLCODE = (error.code = code))}: ${message}`
        throw error;
    };
    var FETCH_INTO_COLLECTIONS = function (collections,fetchValues) {
        for(let i = 0;i < collections.length;i++) {
            collections[i].push(fetchValues[i]);
        }
    };
    var IS_NULL = (arg) => !(arg || arg === 0);
    // END REGION

    let VARIABLE;
    VARIABLE =
        !!!RESOLVE EWI!!! /*** SSC-EWI-0053 - OBJECT ANOTHER_VARIABLE MAY NOT WORK PROPERLY, ITS DATATYPE WAS NOT RECOGNIZED ***/!!!
        ANOTHER_VARIABLE;
$$;
Copy

Meilleures pratiques

  • Assurez-vous que le code d’entrée contient la variable déclarée.

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

SSC-EWI-0054

Sous-requête de jointure extérieure non prise en charge

Note

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

Gravité

Faible

Description

Cette erreur se produit lorsqu’une sous-requête corrélée est trouvée dans une expression logique OR d’une JOIN OUTER (Left, Right ou Full). Dans ce cas, elle peut produire des résultats incohérents ou provoquer l’erreur suivante :

Erreur de compilation SQL : le type de sous-requête non pris en charge ne peut pas être évalué.

Ces limitations relatives aux sous-requêtes sont brièvement mentionnées dans la documentation Snowflake, et certaines informations à leur sujet sont également disponibles dans les [forums Snowflake].(https://community.snowflake.com/s/question/0D53r00009mIxwYCAS/sql-compilation-error-unsupported-subquery-type-cannot-be-evaluated)

Exemple de code

Code d’entrée (Teradata) :
 SELECT a.Column1, b.Column2
FROM
    TableA a
    LEFT JOIN TableB b ON (a.Column1 = b.Column1)
    AND (
        a.Column2 = b.Column2
        OR EXISTS(
            SELECT * FROM Table3 c
            WHERE c.Column1 = a.Column1
        )
    );
Copy
Code généré :
 // SnowConvert AI Helpers Code section is omitted.
SELECT
    a.Column1,
    b.Column2
FROM
    TableA a
   LEFT JOIN
        TableB b ON (a.Column1 = b.Column1)
   AND (
       a.Column2 = b.Column2
       OR EXISTS
                !!!RESOLVE EWI!!! /*** SSC-EWI-0054 - CORRELATED SUBQUERIES WITHIN AN OR EXPRESSION OF AN OUTER JOIN COULD CAUSE COMPILATION ERRORS ***/!!!(
                    SELECT
                        * FROM
                        Table3 c
                               WHERE c.Column1 = a.Column1
       )
   );
Copy

Meilleures pratiques

  • Vérifiez que le code de sortie ne produit pas d’erreur de compilation.

  • Vérifiez l’équivalence fonctionnelle du code de sortie.

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

SSC-EWI-0056

Create Type non pris en charge

Gravité

Faible

Description

Ce message apparaît lorsqu’un type personnalisé transformable est défini, afin d’ajouter des remarques sur les types personnalisés transformables faisant l’objet de commentaires.

Note

La définition de type est commentée, mais elle est toujours prise en compte pour la résolution des utilisations. Consultez SSC-EWI-0062 pour plus d’informations.

Exemple de code

Code d’entrée (Oracle) :
 CREATE TYPE type1 AS OBJECT (column1 INT);

CREATE OR REPLACE PROCEDURE record_procedure
IS
    TYPE record_typ IS RECORD(col1 INTEGER, col2 FLOAT);
BEGIN
    NULL;
END;
Copy
Code généré :
 !!!RESOLVE EWI!!! /*** SSC-EWI-0056 - CUSTOM TYPES ARE NOT SUPPORTED IN SNOWFLAKE BUT REFERENCES TO THIS CUSTOM TYPE WERE CHANGED TO VARIANT ***/!!!
CREATE TYPE type1 AS OBJECT (column1 INT)
;

CREATE OR REPLACE PROCEDURE record_procedure ()
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
EXECUTE AS CALLER
AS
$$
    DECLARE
        !!!RESOLVE EWI!!! /*** SSC-EWI-0056 - CUSTOM TYPES ARE NOT SUPPORTED IN SNOWFLAKE BUT REFERENCES TO THIS CUSTOM TYPE WERE CHANGED TO OBJECT ***/!!!
        TYPE record_typ IS RECORD(col1 INTEGER, col2 FLOAT);
    BEGIN
        NULL;
    END;
$$;
Copy

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-EWI-0058

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

Gravité

Medium

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;
Copy
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
    !!!RESOLVE EWI!!! /*** SSC-EWI-0030 - THE STATEMENT BELOW HAS USAGES OF DYNAMIC SQL. ***/!!!
    EXECUTE IMMEDIATE 'SELECT 1 FROM DUAL'
                                           !!!RESOLVE EWI!!! /*** SSC-EWI-0058 - FUNCTIONALITY FOR 'EXECUTE IMMEDIATE RETURNING CLAUSE' IS NOT CURRENTLY SUPPORTED BY SNOWFLAKE SCRIPTING ***/!!!
                                           INTO number_variable;
  END;
$$;
Copy

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-EWI-0062

Utilisation du type personnalisé changée en variant

Gravité

Faible

Description

Ce message apparaît lorsqu’un type personnalisé est référencé, puis que son utilisation est changée en variant.

Note

Ce message est fortement lié à SSC-EWI-0056.

Exemple de code

Code d’entrée (Oracle) :
 CREATE TYPE type1 AS OBJECT(type1_column1 INT);

CREATE TABLE table1
(
column1 type1
);
Copy
Code généré :
 !!!RESOLVE EWI!!! /*** SSC-EWI-0056 - CUSTOM TYPES ARE NOT SUPPORTED IN SNOWFLAKE BUT REFERENCES TO THIS CUSTOM TYPE WERE CHANGED TO VARIANT ***/!!!
CREATE TYPE type1 AS OBJECT(type1_column1 INT)
;

CREATE OR REPLACE TABLE table1
(
column1 VARIANT !!!RESOLVE EWI!!! /*** SSC-EWI-0062 - CUSTOM TYPE 'type1' USAGE CHANGED TO VARIANT ***/!!!
)
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "oracle",  "convertedOn": "07/14/2025",  "domain": "no-domain-provided" }}'
;

CREATE OR REPLACE VIEW table1_view
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "oracle",  "convertedOn": "07/14/2025",  "domain": "no-domain-provided" }}'
AS
SELECT
column1:type1_column1 :: VARCHAR AS type1_column1
FROM
table1;
Copy

Meilleures pratiques

  • N’oubliez pas de transformer également toutes ses données d’entrée en un type de données conforme à variant.

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

SSC-EWI-0064

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

Gravité

Élevé

Description

Cette erreur se produit lorsqu’un type personnalisé est référencé dans une source pour une instruction DML, mais que le type personnalisé n’a jamais été défini.\ Par exemple, il peut s’agir d’une colonne de table dont le type pourrait être une UDT mais n’a jamais été défini.

Avertissement

Il convient de ne pas la confondre avec SSC-FDM-0015, qui correspond au moment où un type personnalisé a été référencé dans une requête DDL.

Exemple de code

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

CREATE TABLE table1
(
--the type will be unresolved
column1 type1
);

SELECT
column1
FROM table1;
Copy
Code généré :
 --Type was never defined
--CREATE TYPE type1;
!!!RESOLVE EWI!!! /*** SSC-EWI-0050 - MISSING DEPENDENT OBJECT "type1" ***/!!!!!!RESOLVE EWI!!! /*** SSC-EWI-0063 - 'PUBLIC.table1_view' ADDED BECAUSE 'table1' USED A CUSTOM TYPE ***/!!!
CREATE OR REPLACE TABLE table1
(
--the type will be unresolved
column1 VARIANT !!!RESOLVE EWI!!! /*** SSC-EWI-0064 - REFERENCED CUSTOM TYPE 'type1' IN QUERY NOT FOUND, USAGES MAY BE AFFECTED ***/!!! /*** SSC-FDM-0015 - DATA TYPE 'type1' NOT RECOGNIZED ***/
);

CREATE OR REPLACE VIEW PUBLIC.table1_view
AS
SELECT
column1
FROM
table1;

SELECT
column1 !!!RESOLVE EWI!!! /*** SSC-EWI-0064 - REFERENCED CUSTOM TYPE 'type1' IN QUERY NOT FOUND, USAGES MAY BE AFFECTED ***/!!!
FROM
table1;
Copy

Meilleures pratiques

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

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

SSC-EWI-0066

Expression non prise en charge dans Snowflake.

Sévérité

Élevé

Description

Cette erreur est utilisée pour informer l’utilisateur qu’une expression spécifique n’est pas prise en charge dans Snowflake.

Exemple de code

Code d’entrée :
 SELECT * from T1 where (cast('2016-03-17' as DATE), 
       cast('2016-03-21' as DATE)) OVERLAPS
       (cast('2016-03-20' as DATE), cast('2016-03-22' as DATE));
Copy
Code de sortie :
 SELECT * from
       T1
where
       !!!RESOLVE EWI!!! /*** SSC-EWI-0066 - EXPRESSION 'OVERLAPS' IS NOT SUPPORTED IN SNOWFLAKE. ***/!!! (cast('2016-03-17' as DATE),
       cast('2016-03-21' as DATE)) OVERLAPS
       (cast('2016-03-20' as DATE), cast('2016-03-22' as DATE));
Copy

Bonnes pratiques

SSC-EWI-0067

L’UDF a été transformée en procédure Snowflake. L’appel de procédures dans une requête n’est pas pris en charge.

Gravité

Élevé

Description

Cette erreur est ajoutée lorsqu’un appel à une UDF (fonction définie par l’utilisateur) est trouvé dans une requête. Les UDFs Oracle, les UDFs à l‘intérieur de paquets et certaines UDFs SQL Server sont en cours de transformation en procédures stockées Snowflake, qui ne peuvent pas être appelées à partir d’une requête.

La fonction est transformée en procédure stockée pour maintenir l’équivalence fonctionnelle, et l’appel de fonction est transformé en une fonction UDF Snowflake vide.

Note

Cet EWI est fortement lié à SSC-EWI-0068.

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;
GO

SELECT PURCHASING.FOO() AS RESULT;
Copy
Code généré
!!!RESOLVE EWI!!! /*** SSC-EWI-0068 - USER DEFINED FUNCTION WAS TRANSFORMED TO SNOWFLAKE PROCEDURE ***/!!!
--** SSC-FDM-0007 - MISSING DEPENDENT OBJECT "PURCHASING.VENDOR" **
CREATE OR REPLACE PROCEDURE PURCHASING.FOO ()
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "transact",  "convertedOn": "07/16/2025",  "domain": "no-domain-provided" }}'
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;
$$;

SELECT
    PURCHASING.FOO() !!!RESOLVE EWI!!! /*** SSC-EWI-0067 - UDF WAS TRANSFORMED TO SNOWFLAKE PROCEDURE, CALLING PROCEDURES INSIDE QUERIES IS NOT SUPPORTED ***/!!! AS RESULT;
Copy
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;

SELECT employee_function(2) FROM employees;
Copy
Code généré
 !!!RESOLVE EWI!!! /*** SSC-EWI-0068 - USER DEFINED FUNCTION WAS TRANSFORMED TO SNOWFLAKE PROCEDURE ***/!!!
--** SSC-FDM-0007 - MISSING DEPENDENT OBJECT "employees" **
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": "07/10/2025",  "domain": "no-domain-provided" }}'
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;
$$;

--** SSC-FDM-0007 - MISSING DEPENDENT OBJECT "employees" **

SELECT
  !!!RESOLVE EWI!!! /*** SSC-EWI-0067 - UDF WAS TRANSFORMED TO SNOWFLAKE PROCEDURE, CALLING PROCEDURES INSIDE QUERIES IS NOT SUPPORTED ***/!!! employee_function(2) FROM
  employees;
Copy

Meilleures pratiques

  • 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-EWI-0068

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

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;
Copy
Code généré
 !!!RESOLVE EWI!!! /*** SSC-EWI-0068 - 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": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "transact",  "convertedOn": "06/25/2025",  "domain": "no-domain-provided" }}'
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;
$$;
Copy
Oracle :
Code d’entrée
CREATE OR REPLACE FUNCTION FUN1(PAR1 VARCHAR)
RETURN VARCHAR
IS
    VAR1 VARCHAR(20);
    VAR2 VARCHAR(20);
BEGIN
    SELECT COL1 INTO VAR1 FROM TABLE1 where col1 = 1;
    VAR2 := PAR1 || VAR1;
    RETURN VAR2;
END;
/
Code généré
 !!!RESOLVE EWI!!! /*** SSC-EWI-0068 - USER DEFINED FUNCTION WAS TRANSFORMED TO SNOWFLAKE PROCEDURE ***/!!!
CREATE OR REPLACE PROCEDURE FUN1(PAR1 VARCHAR)
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
EXECUTE AS CALLER
AS
$$
  DECLARE
    VAR1 VARCHAR(20);
    VAR2 VARCHAR(20);
  BEGIN
    SELECT COL1 INTO
      :VAR1
    FROM
      TABLE1
    where col1 = 1;
    VAR2 := NVL(:PAR1 :: STRING, '') || NVL(:VAR1 :: STRING, '');
    RETURN :VAR2;
  END;
$$;
Copy

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-EWI-0073

Examen de l’équivalence fonctionnelle en attente

Gravité

Medium

Description

Cet EWI est ajouté lorsqu’il existe une clause grammaticale dans la plateforme d’entrée qui n’a pas encore été examinée par l’équipe de développeurs de SnowConvert AI, afin de fournir une prise en charge de celle-ci dans Snowflake. Cela signifie que le code n’a subi aucune transformation et qu’il est donc possible qu’il ne fonctionne pas dans Snowflake sans une révision manuelle.

Exemple de code

SQLServer :
Code d’entrée
 CREATE OR ALTER PROC SampleProcedure
AS
BEGIN
   INSERT INTO aTable (columnA = 'varcharValue', columnB = 1);
   INSERT exampleTable VALUES ('Hello', 23);
   INSERT INTO exampleTable DEFAULT VALUES;
END
Copy
Code généré
 CREATE OR REPLACE PROCEDURE SampleProcedure ()
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"transact"}}'
EXECUTE AS CALLER
AS
$$
   BEGIN
      INSERT INTO aTable (columnA = 'varcharValue', columnB = 1);
      INSERT INTO exampleTable VALUES ('Hello', 23);
      !!!RESOLVE EWI!!! /*** SSC-EWI-0073 - PENDING FUNCTIONAL EQUIVALENCE REVIEW FOR 'INSERT WITH DEFAULT VALUES' NODE ***/!!!
      INSERT INTO exampleTable DEFAULT VALUES;
   END;
$$;
Copy

Notez qu’à la ligne 6 du code d’entrée, il existe une référence à une instruction INSERT avec des VALUES DEFAULT. Cette instruction n’est actuellement pas prise en charge par SnowConvert AI, et c’est pour cette raison que dans les lignes 11 et 12, l’EWI est généré.

Meilleures pratiques

SSC-EWI-0077

Cycle trouvé entre les appels de CTE. Impossible d’ordonner les CTEs.

Gravité

Faible

Description

Cet avertissement est ajouté lorsqu’une requête qui contient plusieurs appels de référence de CTE (expression de table commune) créent un cycle qui ne peut pas déterminer l’ordre d’appel des CTEs. Ainsi, les CTEs ne peuvent pas être ordonnées, et la requête restera la source.

Exemple de code

Code d’entrée (Teradata) :
 WITH t1(c1) as (SELECT c1 FROM t2),
     t2(c2) as (SELECT c2 FROM t3),
     RECURSIVE t3(c3) as (SELECT c3, someOtherColumn FROM t1, t3)
     SELECT * FROM t1;
Copy
Code généré :
 !!!RESOLVE EWI!!! /*** SSC-EWI-0077 - CYCLE FOUND BETWEEN CTE REFERENCE CALLS, CTES CANNOT BE ORDERED AND THE QUERY WILL REMAIN AS ORIGINAL ***/!!!
WITH RECURSIVE t1(c1) AS
(
     SELECT
          c1 FROM t2
),
t2(c2) AS
(
     SELECT
          c2 FROM t3
),
t3(c3) AS
(
     SELECT
          c3,
          someOtherColumn FROM t1, t3
)
SELECT
     * FROM t1;
Copy

Meilleures pratiques

  • Aucune autre action de l’utilisateur n’est requise.

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

SSC-EWI-0080

La valeur par défaut n’est pas autorisée au niveau des colonnes binaires.

Sévérité

Faible

Description

Cet EWI est ajouté lorsque le code source possède une valeur par défaut pour le type de données BINARY, qui n’est pas pris en charge dans SnowFlake SQL.

Exemple de code

Code d’entrée (SqlServer) :

 create table test1345
(
  key1 binary default 0
);
Copy

Code de sortie :

 CREATE OR REPLACE TABLE test1345
(
  key1 BINARY
              !!!RESOLVE EWI!!! /*** SSC-EWI-0080 - DEFAULT VALUE IS NOT ALLOWED ON BINARY COLUMNS ***/!!!
              default 0
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"transact"}}'
;
Copy
Bonnes pratiques

SSC-EWI-0084

XMLTABLE n’est pas pris en charge.

Gravité

Élevé

Description

La fonction XMLTABLE n’est actuellement pas prise en charge.

Exemple de code

Code d’entrée (DB2) :
 SELECT
    *
FROM
    XMLTABLE(
        'stringValue' PASSING BY REF passingExpr AS AliasName
    ) AS XMLTABLENAME
Copy
Code généré :
 SELECT
    *
FROM
    !!!RESOLVE EWI!!! /*** SSC-EWI-0084 - XMLTABLE IS NOT SUPPORTED BY SNOWFLAKE ***/!!!
    XMLTABLE(
        'stringValue' PASSING BY REF passingExpr AS AliasName
    ) AS XMLTABLENAME
Copy

Meilleures pratiques

SSC-EWI-0086

Remplacement des caractères non valides pour le nouvel identificateur

Note

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

Gravité

Faible

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;
Copy
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;
        !!!RESOLVE EWI!!! /*** SSC-EWI-0086 - IDENTIFIER '"VAR`/1ͷ"' HAS INVALID CHARACTERS. CHARACTERS WERE REPLACED WITH THEIR UTF-8 CODES ***/!!!
        VAR_u60_u2F1ͷ VARCHAR(20);
        !!!RESOLVE EWI!!! /*** SSC-EWI-0086 - IDENTIFIER '"o*/o"' HAS INVALID CHARACTERS. CHARACTERS WERE REPLACED WITH THEIR UTF-8 CODES ***/!!!
        o_u2A_u2Fo FLOAT;
        !!!RESOLVE EWI!!! /*** SSC-EWI-0086 - IDENTIFIER '" . "' HAS INVALID CHARACTERS. CHARACTERS WERE REPLACED WITH THEIR UTF-8 CODES ***/!!!
        _u20_u2E_u20 INT;
        !!!RESOLVE EWI!!! /*** SSC-EWI-0086 - 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;
$$;
Copy

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-EWI-0092

La vue matérialisée a été convertie en vue normale.

Danger

Obsolète

Gravité

Faible

Description

Les vues matérialisées Snowflake présentent certaines limites mentionnées ici. Actuellement, toutes les vues matérialisées sont converties en vues normales, sans les clauses supplémentaires qu’elles contenaient. À l’avenir, SnowConvert AI convertira les cas pris en charge en vues matérialisées Snowflake.

Exemple de code

Code d’entrée:
 CREATE MATERIALIZED VIEW MATERIALIZED_VIEW1
SEGMENT CREATION IMMEDIATE
ORGANIZATION HEAP PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255
PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255
INMEMORY PRIORITY NONE MEMCOMPRESS FOR QUERY LOW DISTRIBUTE AUTO NO DUPLICATE
AS
select
   *
from
   aTable;
Copy
Code généré :
 !!!RESOLVE EWI!!! /*** SSC-EWI-0092 - MATERIALIZED VIEW WAS CONVERTED TO REGULAR VIEW. ***/!!!
CREATE OR REPLACE VIEW MATERIALIZED_VIEW1
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
   aTable;
Copy

Meilleures pratiques

  • Aucune autre action de l’utilisateur n’est requise.

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

SSC-EWI-0094

Déclaration des balises non prise en charge

Gravité

Faible

Description

Actuellement, il n’existe pas d’équivalent pour la déclaration des balises dans l’Exécution de scripts Snowflake. Ainsi, un EWI est ajouté, et la balise est commentée.

Exemple de code

Code d’entrée (Oracle) :
 CREATE OR REPLACE PROCEDURE Example ( grade NUMBER )
IS
BEGIN
	<<CASE1>><<CASE2>>
	CASE grade
		WHEN 10 THEN NULL;
		ELSE NULL;
	END CASE CASE1;
END;
Copy
Code généré :
 CREATE OR REPLACE PROCEDURE Example (grade NUMBER(38, 18))
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"oracle"}}'
EXECUTE AS CALLER
AS
$$
	BEGIN
		!!!RESOLVE EWI!!! /*** SSC-EWI-0094 - LABEL DECLARATION FOR A STATEMENT IS NOT SUPPORTED BY SNOWFLAKE SCRIPTING <<CASE1>><<CASE2>> ***/!!!
		CASE :grade
			WHEN 10 THEN
				NULL;
			ELSE NULL;
		END CASE;
	END;
$$;
Copy

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-EWI-0101

Nom de balise de transaction commenté, car non applicable dans Snowflake

Gravité

Faible

Description

Snowflake n’opère pas de noms de balises de transactions, car il ne devrait pas y avoir de transactions imbriquées à identifier dans des instructions COMMIT ou ROLLBACK différentes.

Exemple de code

Code d’entrée (SQL Server) :
 CREATE PROCEDURE TestTransaction
AS
BEGIN
    DROP TABLE IF EXISTS NEWTABLE;
    CREATE TABLE NEWTABLE(COL1 INT, COL2 VARCHAR);
      BEGIN TRANSACTION LabelA;
        INSERT INTO NEWTABLE VALUES (1, 'MICHAEL');
        INSERT INTO NEWTABLE VALUES(2, 'JACKSON');
      COMMIT TRANSACTION LabelA;
END
Copy
Code généré :
 CREATE OR REPLACE PROCEDURE TestTransaction ()
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"transact"}}'
EXECUTE AS CALLER
AS
$$
    BEGIN
        DROP TABLE IF EXISTS NEWTABLE;
        CREATE OR REPLACE TABLE NEWTABLE (
            COL1 INT,
            COL2 VARCHAR
        );
            BEGIN TRANSACTION
            !!!RESOLVE EWI!!! /*** SSC-EWI-0101 - COMMENTED OUT TRANSACTION LABEL NAME BECAUSE IS NOT APPLICABLE IN SNOWFLAKE ***/!!!
            LabelA;
            INSERT INTO NEWTABLE VALUES (1, 'MICHAEL');
        INSERT INTO NEWTABLE VALUES(2, 'JACKSON');
            COMMIT;
    END;
$$;
Copy

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-EWI-0102

Suppression de l’option d’instruction du code, déjà gérée lors de la conversion vers Snowflake

Note

Cet EWI est obsolète.

Gravité

Faible

Description

Les instructions Snowflake peuvent supprimer certaines options lorsqu’elles sont gérées par la règle de conversion. Ainsi, celle-ci sera supprimée du code de sortie, mais la fonctionnalité est équivalente.

Exemple de code

Code d’entrée (PostgreSQL) :
 -- Case 1:
TRUNCATE ONLY table_base2 RESTART IDENTITY CASCADE;

-- Case 2:
TRUNCATE TABLE table_inherit_and_generated RESTART IDENTITY CASCADE;
Copy
Code généré :
 -- Case 1:
!!!RESOLVE EWI!!! /*** SSC-EWI-0102 - REMOVED ONLY OPTION FROM CODE, ALREADY HANDLED IN CONVERSION TO SNOWFLAKE ***/!!!!!!RESOLVE EWI!!! /*** SSC-EWI-0102 - REMOVED CASCADE OPTION FROM CODE, ALREADY HANDLED IN CONVERSION TO SNOWFLAKE ***/!!!!!!RESOLVE EWI!!! /*** SSC-EWI-0102 - REMOVED RESTART IDENTITY OPTION FROM CODE, ALREADY HANDLED IN CONVERSION TO SNOWFLAKE ***/!!!
TRUNCATE table_base2;

-- Case 2:
!!!RESOLVE EWI!!! /*** SSC-EWI-0102 - REMOVED CASCADE OPTION FROM CODE, ALREADY HANDLED IN CONVERSION TO SNOWFLAKE ***/!!!!!!RESOLVE EWI!!! /*** SSC-EWI-0102 - REMOVED RESTART IDENTITY OPTION FROM CODE, ALREADY HANDLED IN CONVERSION TO SNOWFLAKE ***/!!!
TRUNCATE TABLE table_inherit_and_generated;
Copy

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-EWI-0107

Littéral d’intervalle non pris en charge dans le scénario actuel

Gravité

Élevé

Description

Les intervalles Snowflake ne peuvent être utilisés que dans les opérations arithmétiques. Les intervalles utilisés dans un autre scénario ne sont pas pris en charge.

Exemple de code

Code d’entrée :

 SELECT INTERVAL '1-5' YEAR TO MONTH FROM DUAL;
Copy

Code de sortie :

 SELECT
!!!RESOLVE EWI!!! /*** SSC-EWI-0107 - INTERVAL LITERAL IS NOT SUPPORTED BY SNOWFLAKE IN THIS SCENARIO  ***/!!!
 INTERVAL '1-5' YEAR TO MONTH FROM DUAL;
Copy
Bonnes 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-EWI-0108

La sous-requête suivante correspond à au moins l’un des modèles considérés comme non valides, et elle peut générer des erreurs de compilation.

Gravité

Élevé

Description

Dans Snowflake, il existe plusieurs modèles et éléments dans une sous-requête qui ne sont pas pris en charge et qui la rendent non exécutable. Conformément à la documentation sur les sous-requêtes de Snowflake , les types de sous-requêtes suivants sont pris en charge :

  • Sous-requêtes scalaires non corrélées dans n’importe quel endroit où une expression de valeur peut être utilisée.

  • Sous-requêtes scalaires corrélées dans des clauses WHERE.

  • Sous-requêtes EXISTS, ANY / ALL et IN dans des clauses WHERE. Ces sous-requêtes peuvent être corrélées ou non.

Veuillez noter que la liste ci-dessus n’est pas exhaustive, ce qui signifie que les sous-requêtes qui ne correspondent à aucun des types spécifiés peuvent encore être considérées comme valides.

Pour éviter les erreurs, SnowConvert AI connaît un ensemble de modèles de sous-requêtes qui invalident normalement les sous-requêtes. Cet EWI est ajouté pour avertir l’utilisateur que la sous-requête correspond au moins à l’un de ces modèles et qu’elle peut donc produire des erreurs lors de la compilation dans Snowflake.

Exemple de code

Code d’entrée:
 CREATE TABLE tableA
(
    col1 INTEGER,
    col2 VARCHAR(20)
);

CREATE TABLE tableB
(
    col3 INTEGER,
    col4 VARCHAR(20)
);

INSERT INTO tableA VALUES (50, 'Hey');

INSERT INTO tableB VALUES (50, 'Hey');
INSERT INTO tableB VALUES (50, 'Example');
INSERT INTO tableB VALUES (10, 'Bye');

-- Snowflake only allows the usage of FETCH in subqueries that are uncorrelated scalar, this subquery execution will fail
SELECT col2
FROM tableA
WHERE col2 = (SELECT col4 FROM tableB WHERE col3 = col1 FETCH FIRST ROW ONLY);

-- This subquery is uncorrelated scalar so FETCH is valid to use
SELECT col2
FROM tableA
WHERE col2 = (SELECT col4 FROM tableB FETCH FIRST ROW ONLY);
Copy
Code généré :
 CREATE OR REPLACE TABLE tableA
    (
        col1 INTEGER,
        col2 VARCHAR(20)
    )
    COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "oracle",  "convertedOn": "12/05/2024",  "domain": "test" }}'
    ;

    CREATE OR REPLACE TABLE tableB
    (
        col3 INTEGER,
        col4 VARCHAR(20)
    )
    COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "oracle",  "convertedOn": "12/05/2024",  "domain": "test" }}'
    ;

    INSERT INTO tableA
    VALUES (50, 'Hey');

    INSERT INTO tableB
    VALUES (50, 'Hey');

    INSERT INTO tableB
    VALUES (50, 'Example');

    INSERT INTO tableB
    VALUES (10, 'Bye');

    -- Snowflake only allows the usage of FETCH in subqueries that are uncorrelated scalar, this subquery execution will fail
SELECT col2
FROM
    tableA
    WHERE col2 =
                 --** SSC-FDM-0002 - CORRELATED SUBQUERIES MAY HAVE SOME FUNCTIONAL DIFFERENCES. **
                 !!!RESOLVE EWI!!! /*** SSC-EWI-0108 - THE FOLLOWING SUBQUERY MATCHES AT LEAST ONE OF THE PATTERNS CONSIDERED INVALID AND MAY PRODUCE COMPILATION ERRORS ***/!!! (SELECT
                         ANY_VALUE( col4) FROM
                         tableB
                     WHERE col3 = col1
                     FETCH FIRST 1 ROW ONLY);

    -- This subquery is uncorrelated scalar so FETCH is valid to use
SELECT col2
FROM
    tableA
    WHERE col2 = (SELECT col4 FROM
                         tableB
                     FETCH FIRST 1 ROW ONLY);
Copy

Meilleures pratiques

  • Vérifiez la sous-requête dans Snowflake. Si elle compile sans problème, alors cet EWI peut être ignoré en toute sécurité.

  • Veuillez consulter la section relative aux modèles complexes pour les sous-requêtes dans le rapport d’évaluation. Elle contient une liste des modèles qui invalident normalement les sous-requêtes et leurs occurrences. Elle peut être utilisée pour examiner les sous-requêtes migrées et les raisons pour lesquelles elles sont considérées comme non valides.

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

SSC-EWI-0109

La syntaxe Alter Table n’est pas applicable dans Snowflake.

Gravité

Medium

Description

La syntaxe Alter Table utilisée n’est pas applicable dans Snowflake. Ce message est donc ajouté.

Exemple de code :

Code d’entrée :
 ALTER TABLE SOMENAME DEFAULT COLLATION SOMENAME;

ALTER TABLE SOMENAME ROW ARCHIVAL;

ALTER TABLE SOMENAME MODIFY CLUSTERING;

ALTER TABLE SOMENAME DROP CLUSTERING;

ALTER TABLE SOMENAME SHRINK SPACE COMPACT CASCADE;
Copy
Code généré :
 !!!RESOLVE EWI!!! /*** SSC-EWI-0109 - ALTER TABLE SYNTAX NOT APPLICABLE IN SNOWFLAKE ***/!!!

ALTER TABLE SOMENAME
DEFAULT COLLATION SOMENAME;

!!!RESOLVE EWI!!! /*** SSC-EWI-0109 - ALTER TABLE SYNTAX NOT APPLICABLE IN SNOWFLAKE ***/!!!

ALTER TABLE SOMENAME
ROW ARCHIVAL;

!!!RESOLVE EWI!!! /*** SSC-EWI-0109 - ALTER TABLE SYNTAX NOT APPLICABLE IN SNOWFLAKE ***/!!!

ALTER TABLE SOMENAME
MODIFY CLUSTERING;

!!!RESOLVE EWI!!! /*** SSC-EWI-0109 - ALTER TABLE SYNTAX NOT APPLICABLE IN SNOWFLAKE ***/!!!

ALTER TABLE SOMENAME
DROP CLUSTERING;

!!!RESOLVE EWI!!! /*** SSC-EWI-0109 - ALTER TABLE SYNTAX NOT APPLICABLE IN SNOWFLAKE ***/!!!


ALTER TABLE SOMENAME
SHRINK SPACE COMPACT CASCADE;
Copy

Meilleures pratiques

  • Aucune autre action de l’utilisateur n’est requise.

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

SSC-EWI-0110

Transformation non effectuée en raison de dépendances manquantes

Gravité

Faible

Description

Lorsqu’il manque des dépendances, l’EWI est ajouté pour indiquer qu’une transformation ne peut pas être exécutée. SnowConvert AI utilise des arborescences de syntaxe abstraites pour créer un modèle sémantique du code d’entrée, qui est ensuite utilisé pour générer un nouveau code répliquant la fonctionnalité de la source d’origine. Cependant, dans ce scénario particulier, la transformation n’a pas pu être achevée, car le modèle sémantique manque de certaines dépendances.

Exemple de code

Code d’entrée :
 ALTER TABLE MissingTable ADD
CONSTRAINT constraint1  DEFAULT (suser_name()) FOR col1;
Copy
Code généré :
 --** SSC-FDM-0007 - MISSING DEPENDENT OBJECT "MissingTable" **
!!!RESOLVE EWI!!! /*** SSC-EWI-0110 - TRANSFORMATION NOT PERFORMED DUE TO MISSING DEPENDENCIES ***/!!!

ALTER TABLE MissingTable
ADD
CONSTRAINT constraint1 DEFAULT (CURRENT_USER()) FOR col1;
Copy

Meilleures pratiques

  • Ajoutez les dépendances manquantes au code d’entrée.

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

SSC-EWI-0111

Un seul niveau d’imbrication est autorisé pour les procédures imbriquées dans Snowflake.

Gravité

Critique

Description

Snowflake ne prend en charge qu’un seul niveau d’imbrication pour les procédures. La définition d’une procédure imbriquée dans une autre procédure imbriquée n’est pas autorisée. Si ce modèle est détecté, cette erreur sera générée.

Exemple de code

Code d’entrée :
CREATE OR REPLACE PROCEDURE calculate_executive_salary (
    p_result OUT NUMBER
)
AS
    PROCEDURE calculate_senior_level (
        senior_result OUT NUMBER
    )
    AS
        PROCEDURE calculate_base_level (
            base_result OUT NUMBER
        )
        AS
        BEGIN
            base_result := 75000;
        END calculate_base_level;
    BEGIN
        calculate_base_level(senior_result);
        senior_result := senior_result * 1.5;
    END calculate_senior_level;
BEGIN
    calculate_senior_level(p_result);
END calculate_executive_salary;
Copy
Code généré :
CREATE OR REPLACE PROCEDURE calculate_executive_salary (p_result OUT NUMBER(38, 18)
    )
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "oracle",  "convertedOn": "07/22/2025",  "domain": "no-domain-provided" }}'
EXECUTE AS CALLER
AS
$$
        DECLARE
        calculate_senior_level PROCEDURE (senior_result NUMBER(38, 18)
           )
        RETURNS NUMBER
        AS
            DECLARE
                !!!RESOLVE EWI!!! /*** SSC-EWI-0111 - ONLY ONE LEVEL OF NESTING IS ALLOWED FOR NESTED PROCEDURES IN SNOWFLAKE. ***/!!!
                PROCEDURE calculate_base_level (
                    base_result OUT NUMBER
                )
                AS
                BEGIN
                    base_result := 75000;
                END calculate_base_level;
                call_results NUMBER;
            BEGIN
                call_results := (
                CALL
                calculate_base_level(:senior_result)
                );
                senior_result := :call_results;
                senior_result := :senior_result * 1.5;
                RETURN senior_result;
            END;
        call_results NUMBER;
        BEGIN
        call_results := (
            CALL
            calculate_senior_level(:p_result)
        );
        p_result := :call_results;
        END;
$$;
Copy

Meilleures pratiques

  • Refactorisez votre code pour éviter plus d’un niveau de procédures imbriquées. Déplacez les procédures profondément imbriquées au niveau supérieur ou restructurez votre logique pour respecter la limite d’imbrication à un seul niveau de Snowflake.

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

SSC-EWI-0112

La surcharge des procédures imbriquées n’est pas prise en charge.

Gravité

Critique

Description

Snowflake ne prend pas en charge la surcharge des procédures imbriquées. Autrement dit, vous ne pouvez pas définir plusieurs procédures imbriquées portant le même nom mais ayant des listes de paramètres différentes au sein d’une même procédure parente. Si le code source contient des procédures imbriquées surchargées, cette erreur sera générée pour indiquer que de tels modèles ne sont pas pris en charge dans Snowflake.

Exemple de code

Code d’entrée :
CREATE OR REPLACE PROCEDURE demonstrate_salary_calculations(
    final_summary OUT VARCHAR2
)
AS
    result1 VARCHAR2(100);
    result2 VARCHAR2(100);
    result3 VARCHAR2(100);

    PROCEDURE calculate_salary(
        output OUT VARCHAR2
    )
    AS
    BEGIN
        output := 'Standard: 55000';
    END;

    PROCEDURE calculate_salary(
        base_amount IN NUMBER,
        output OUT VARCHAR2
    )
    AS
    BEGIN
        output := 'Calculated: ' || (base_amount * 1.15);
    END;

    PROCEDURE calculate_salary(
        employee_level IN VARCHAR2,
        output OUT VARCHAR2
    )
    AS
    BEGIN
        output := 'Level ' || UPPER(employee_level) || ': 60000';
    END;

BEGIN
    calculate_salary(result1);
    calculate_salary(50000, result2);
    calculate_salary('senior', result3);
    final_summary := result1 || ' | ' || result2 || ' | ' || result3;
END demonstrate_salary_calculations;
Copy
Code généré :
CREATE OR REPLACE PROCEDURE demonstrate_salary_calculations (final_summary OUT VARCHAR
    )
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "oracle",  "convertedOn": "07/22/2025",  "domain": "no-domain-provided" }}'
EXECUTE AS CALLER
AS
$$
        DECLARE
        result1 VARCHAR(100);
        result2 VARCHAR(100);
        result3 VARCHAR(100);
        calculate_salary PROCEDURE(output VARCHAR
            )
        RETURNS VARCHAR
        AS
            BEGIN
                output := 'Standard: 55000';
                RETURN output;
            END;
        !!!RESOLVE EWI!!! /*** SSC-EWI-0112 - NESTED PROCEDURE OVERLOADING IS NOT SUPPORTED. ***/!!!
        calculate_salary PROCEDURE(base_amount NUMBER(38, 18), output VARCHAR
            )
        RETURNS VARCHAR
        AS
            BEGIN
                output := 'Calculated: ' || NVL((:base_amount * 1.15) :: STRING, '');
                RETURN output;
            END;
        !!!RESOLVE EWI!!! /*** SSC-EWI-0112 - NESTED PROCEDURE OVERLOADING IS NOT SUPPORTED. ***/!!!
        calculate_salary PROCEDURE(employee_level VARCHAR, output VARCHAR
            )
        RETURNS VARCHAR
        AS
            BEGIN
                output := 'Level ' || NVL(UPPER(:employee_level) :: STRING, '') || ': 60000';
                RETURN output;
            END;
        call_results VARCHAR;
        BEGIN
        call_results := (
            CALL
            calculate_salary(:result1)
        );
        result1 := :call_results;
        call_results := (
            CALL
            calculate_salary(50000, :result2)
        );
        result2 := :call_results;
        call_results := (
            CALL
            calculate_salary('senior', :result3)
        );
        result3 := :call_results;
        final_summary := NVL(:result1 :: STRING, '') || ' | ' || NVL(:result2 :: STRING, '') || ' | ' || NVL(:result3 :: STRING, '');
        END;
$$;
Copy

Meilleures pratiques

  • Toute tentative de surcharger des procédures imbriquées dans Snowflake entraînera des erreurs de compilation ou un comportement inattendu. Pour assurer la compatibilité, vous devez remanier votre code pour éviter de surcharger les procédures imbriquées. Envisagez de renommer les procédures de sorte que chaque procédure imbriquée possède un nom unique dans sa portée, ou restructurez votre logique pour éliminer le besoin de surcharge. En outre, examinez et mettez à jour tous les appels de procédure afin d’utiliser les nouveaux noms uniques.

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

SSC-EWI-0113

L’utilisation de l’UDF d’Exécution de scripts Snowflake n’est pas prise en charge dans ce scénario.

Gravité

Medium

Description

L’utilisation des UDFs d’Exécution de scripts Snowflake dans des scénarios spécifiques n’est pas prise en charge. Les cas suivants ne sont pas pris en charge :

  • Les UDFs d’Exécution de scripts Snowflake ne peuvent pas être utilisées lors de la création d’une vue matérialisée.

  • Les UDFs d’Exécution de scripts Snowflake ne peuvent pas être utilisées pour spécifier une valeur de colonne par défaut.

Exemple de code

Code d’entrée :
CREATE TABLE Table1 (
  col1 INT DEFAULT SnowScriptUdf()
);

CREATE MATERIALIZED VIEW CreateView1
AS
SELECT 
  col1,
  SnowScriptUdf() AS col2
FROM Table1;
Copy
Code généré :
CREATE OR REPLACE TABLE Table1 (
col1 INT DEFAULT SnowScriptUdf() !!!RESOLVE EWI!!! /*** SSC-EWI-0113 - THE USAGE OF SNOWFLAKE SCRIPTING UDF IS NOT SUPPORTED IN THIS SCENARIO. ***/!!!
)
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "transact",  "convertedOn": "09/17/2025",  "domain": "no-domain-provided" }}'
;

CREATE OR REPLACE DYNAMIC TABLE CreateView1
--** 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": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "transact",  "convertedOn": "09/17/2025",  "domain": "no-domain-provided" }}'
AS
SELECT
      col1,
      SnowScriptUdf() !!!RESOLVE EWI!!! /*** SSC-EWI-0113 - THE USAGE OF SNOWFLAKE SCRIPTING UDF IS NOT SUPPORTED IN THIS SCENARIO. ***/!!! AS col2
FROM
      Table1;
Copy

Meilleures pratiques

SSC-EWI-0114

MIXED CONTINUE AND EXIT EXCEPTION HANDLERS IN THE SAME BLOCK ARE NOT SUPPORTED BY SNOWFLAKE SCRIPTING.

Gravité

Medium

Note

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

Description

In database systems like DB2, Teradata, and others, it is possible to declare both CONTINUE and EXIT exception handlers in the same procedural block. However, Snowflake Scripting does not support mixing CONTINUE and EXIT handlers within the same EXCEPTION block.

When SnowConvert AI encounters a procedure with both types of handlers declared in the same block, it generates separate EXCEPTION blocks for each handler type and adds this EWI to indicate that manual review and testing are required to ensure the converted code maintains the intended behavior.

Key Behavioral Differences:

  • CONTINUE HANDLER: Allows execution to continue after handling the exception

  • EXIT HANDLER: Terminates the current block after handling the exception

Since Snowflake cannot mix these behaviors in a single EXCEPTION block, the conversion may result in different execution flow compared to the source system.

Exemple de code

Code d’entrée :

DB2

CREATE OR REPLACE PROCEDURE with_continueAndExit()
BEGIN
    DECLARE test_1 INTEGER DEFAULT 10;
    
    DECLARE CONTINUE HANDLER FOR SQLEXCEPTION 
        INSERT INTO error_test VALUES ('EXCEPTION');
    
    DECLARE EXIT HANDLER FOR SQLSTATE '20000' 
        INSERT INTO error_test VALUES ('ERROR 2000');
    
    SET test_1 = 1 / 0;
    INSERT INTO error_test VALUES ('EXIT');
END;
Copy
Code généré :

Snowflake

CREATE OR REPLACE PROCEDURE with_continueAndExit()
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "db2",  "convertedOn": "01/15/2025" }}'
AS
$$
    DECLARE
        test_1 INTEGER DEFAULT 10;
    BEGIN
        test_1 := 1 / 0;
        INSERT INTO error_test VALUES ('EXIT');
        EXCEPTION
            WHEN OTHER CONTINUE THEN
                INSERT INTO error_test VALUES ('EXCEPTION')
        !!!RESOLVE EWI!!! /*** SSC-EWI-0114 - MIXED CONTINUE AND EXIT EXCEPTION HANDLERS IN THE SAME BLOCK ARE NOT SUPPORTED BY SNOWFLAKE SCRIPTING ***/!!!
        EXCEPTION
            WHEN OTHER EXIT THEN
                CASE
                    WHEN (SQLSTATE = '20000') THEN
                        INSERT INTO error_test VALUES ('ERROR 2000')
                END
    END;
$$;
Copy

Meilleures pratiques

When dealing with mixed CONTINUE and EXIT handlers:

  1. Review Exception Handling Logic: Carefully review the converted code to understand how exceptions are handled in each block.

  2. Test Thoroughly: Test all error scenarios to ensure the behavior matches the source system’s expectations.

  3. Consider Refactoring: If possible, refactor the code to use only one type of handler (either all CONTINUE or all EXIT) within a block.

  4. Use Nested Blocks: Consider restructuring the logic using nested BEGIN…END blocks, where each block has its own exception handling strategy.

  5. Document Behavior Changes: Document any differences in exception handling behavior for future maintenance.