SnowConvert : Problèmes généraux

SSC-EWI-0003

Gravité

Critique

Description

Ce problème survient lorsqu’une erreur se produit lors de l’exécution d’une règle de conversion pour un nœud SQL spécifique dans le code source.

Recommandations

SSC-EWI-0052

Gravité

Medium

Description

Cette erreur se produit lorsque l’outil de conversion ne peut pas reconnaître ou ne prend pas en charge un paramètre ou une variable dans le code source.

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 de sortie :

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

Recommandations

  • Envisagez d’utiliser un autre type de données mieux adapté à vos besoins.

  • Pour toute assistance supplémentaire, veuillez nous contacter à l’adresse suivante : snowconvert-support@snowflake.com

SSC-EWI-0066

Sévérité

Élevé

Description

Cette erreur indique qu’une expression particulière n’est pas compatible avec Snowflake ou n’est pas prise en charge par celui-ci.

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

Recommandations

SSC-EWI-0027

Certaines parties du code de sortie ont été supprimées pour rendre l’exemple plus clair et plus facile à suivre.

Gravité

Medium

Description

Cet avertissement indique qu’une instruction ne peut pas être exécutée car elle contient une requête non valide en raison d’une valeur variable ou littérale incorrecte.

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 de sortie :

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

Recommandations

  • Vérifiez si vous devez explicitement convertir les valeurs aux formats Date, Heure ou Horodatage. Dans de nombreux cas, Snowflake convertit automatiquement ces valeurs, rendant inutile toute conversion explicite.

  • Pour toute assistance supplémentaire, veuillez nous contacter à l’adresse suivante : snowconvert-support@snowflake.com

SSC-EWI-0102

Gravité

Faible

Description

Lorsque les instructions Snowflake sont traitées par des règles de conversion, certaines options peuvent être omises dans le code de sortie. Cependant, la fonctionnalité qui en résulte reste la même que celle du code d’origine.

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 de sortie :

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

Recommandations

  • Aucune action n’est requise de la part des utilisateurs.

  • Pour toute assistance supplémentaire, veuillez nous contacter à l’adresse suivante : snowconvert-support@snowflake.com

SSC-EWI-0013

Gravité

Critique

Description

Cette erreur se produit lorsque le système rencontre un problème lors de la conversion du code à partir du format source.

Recommandation

SSC-EWI-0033

Certaines parties du code de sortie ont été supprimées pour en faciliter la compréhension.

Gravité

Faible

Description

Cet avertissement apparaît lorsque le code source ne contient pas de colonne convertie à l’aide d’une fonction _ CAST _ avec un format de sortie spécifié.

Exemple de code

Code d’entrée (Teradata) :

CREATE VIEW SampleView AS
SELECT
    DAY_DATE(FORMAT 'MMM-YYYY')(CHAR(8))
FROM
    SampleTable;
Copy

Code de sortie :

// SnowConvert 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

Recommandations

  • Vérifiez que toutes les tables et vues requises référencées dans l’instruction de procédure ont été migrées correctement.

  • Pour toute assistance supplémentaire, veuillez nous contacter à l’adresse suivante : snowconvert-support@snowflake.com

SSC-EWI-0062

Gravité

Faible

Description

Ce message apparaît lorsqu’un type personnalisé est référencé puis modifié pour utiliser un type de données variante.

Ce message est étroitement lié au code d’erreur 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 de sortie :

!!!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":1, "minor":0},{"attributes":{"component":"oracle"}}'
;

CREATE OR REPLACE VIEW PUBLIC.table1_view
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "oracle",  "convertedOn": "" }}'
AS
SELECT
column1:type1_column1 :: INTEGER AS type1_column1
FROM
table1;
Copy

Recommandations

  • Veillez à convertir toutes les données d’entrée en un type de données compatible avec la variante.

  • Pour toute assistance supplémentaire, veuillez nous contacter à l’adresse suivante : snowconvert-support@snowflake.com.

SSC-EWI-0056

Gravité

Faible

Description

Ce message s’affiche lorsqu’un type personnalisé pouvant être transformé est détecté. Il fournit des informations sur les types personnalisés qui feront l’objet d’un commentaire.

La définition du type est assortie d’un commentaire, mais elle est toujours utilisée pour résoudre les références. Pour plus de détails, veuillez vous référer à SSC-EWI-0062.

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 de sortie :

!!!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

Recommandations

  • Aucune action n’est requise de la part des utilisateurs finaux.

  • Pour une assistance supplémentaire, veuillez nous contacter à l’adresse suivante : snowconvert-support@snowflake.com

SSC-EWI-0007

Gravité

Critique

Description

Cette erreur se produit en cas de problème d’écriture dans le fichier de sortie.

Recommandations

SSC-EWI-0046

Gravité

Critique

Description

Snowflake ne vous permet pas de créer des fonctions ou des procédures à l’intérieur d’autres fonctions ou procédures (déclarations imbriquées). Lorsque SnowConvert détecte des déclarations imbriquées dans une instruction CREATE FUNCTION ou CREATE PROCEDURE, il génère un message d’avertissement.

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 PROCEDURE OR FUNCTION IS NOT SUPPORTED ***/!!!
  /*    -- Function Declaration
     FUNCTION function_declaration(param1 VARCHAR) RETURN INTEGER; */
  // Function Declaration
  ;
  !!!RESOLVE EWI!!! /*** SSC-EWI-OR0057 - TRANSFORMATION FOR NESTED PROCEDURE OR FUNCTION IS NOT SUPPORTED ***/!!!
  /*    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

Recommandations

  • Déplacez toutes les déclarations imbriquées à l’extérieur de la fonction ou de la procédure.

  • Pour toute assistance supplémentaire, veuillez nous contacter à l’adresse suivante : snowconvert-support@snowflake.com

SSC-EWI-0023

L’interface Web externe (EWI) est générée exclusivement lors de la conversion des procédures stockées en JavaScript. Toutefois, cette fonction n’est plus recommandée, car Snowflake Scripting est désormais la langue préférée pour les procédures stockées.

Certaines parties du code de sortie ont été supprimées pour rendre l’exemple plus clair et plus facile à suivre.

Gravité

Faible

Description

Cet avertissement met en évidence les conséquences potentielles sur les performances que les utilisateurs doivent prendre en compte.

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 de sortie :

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

Recommandations

SSC-EWI-0107

Gravité

Élevé

Description

Les intervalles dans Snowflake ne peuvent être utilisés que pour des calculs mathématiques. L’utilisation d’intervalles à d’autres fins n’est pas autorisée.

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

Recommandations

  • Aucune action n’est requise de la part des utilisateurs.

  • Pour une assistance supplémentaire, veuillez nous contacter à l’adresse suivante : snowconvert-support@snowflake.com

SSC-EWI-0073

Gravité

Medium

Description

Cet avertissement apparaît lorsque SnowConvert rencontre une structure grammaticale dans la plateforme source qui n’a pas été évaluée par notre équipe de développement pour la compatibilité avec Snowflake. Le code reste non transformé, ce qui signifie qu’il peut nécessiter une révision manuelle et des modifications pour fonctionner correctement dans Snowflake.

Exemple de code

SQLServer :

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

La ligne 6 du code d’entrée contient une instruction INSERT utilisant DEFAULT VALUES. Cette syntaxe n’est pas prise en charge par SnowConvert, c’est pourquoi un message EWI (Erreur, Avertissement, Information) apparaît dans les lignes 11 et 12.

Recommandations

SSC-EWI-0022

L’interface Web externe (EWI) est générée exclusivement lors de la conversion des procédures stockées en JavaScript. Toutefois, cette fonction n’est plus recommandée, car Snowflake Scripting est désormais la langue préférée pour les procédures stockées.

Certaines parties du code de sortie ont été supprimées pour rendre l’exemple plus clair et plus facile à suivre.

Gravité

Medium

Description

Cette erreur indique que certains identificateurs au sein d’une instruction sont automatiquement traités comme des paramètres par le système.

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 de sortie :

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": "12/16/2024",  "domain": "test" }}'
EXECUTE AS CALLER
AS
$$
// SnowConvert Helpers Code section is omitted.

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
//   RTRIM(:LOAD_USER_ID) = RTRIM(LOAD_USER_ID)
null
$$;
Copy

Recommandations

  • Vérifiez que toutes les tables et vues requises référencées dans l’instruction de procédure ont été migrées correctement.

  • Pour toute assistance supplémentaire, veuillez nous contacter à l’adresse suivante : snowconvert-support@snowflake.com

SSC-EWI-0080

Sévérité

Faible

Description

Cet avertissement apparaît lorsque votre code source contient un type de données BINARY avec une valeur par défaut, que Snowflake SQL ne prend pas en charge.

Exemple de code

Code d’entrée (SQL Server) :

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

Recommandations

SSC-EWI-0002

Gravité

Modéré

Description

Les paramètres par défaut doivent être placés à la fin de la liste des paramètres dans Snowflake. Vous devrez réorganiser tous les paramètres comportant des valeurs par défaut afin qu’ils apparaissent en dernier dans les 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 de sortie :

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

Recommandations

SSC-EWI-0053

Gravité

Faible

Description

Cette erreur se produit lorsque l’outil de conversion ne parvient pas à identifier le type de données d’une variable. Cela se produit généralement lorsqu’une variable n’a pas été correctement déclarée dans le code.

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 de sortie :

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

Recommandations

  • Vérifiez que toutes les variables sont correctement déclarées dans votre code.

  • Pour toute assistance supplémentaire, veuillez nous contacter à l’adresse suivante : snowconvert-support@snowflake.com

SSC-EWI-0094

Gravité

Faible

Description

Actuellement, Snow Scripting ne prend pas en charge les déclarations d’étiquettes. Le système ajoutera un message d’erreur, d’avertissement ou d’information (EWI) et commentera l’étiquette.

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 de sortie :

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

Recommandations

  • Aucune action n’est requise de la part des utilisateurs.

  • Pour toute assistance supplémentaire, veuillez nous contacter à l’adresse suivante : snowconvert-support@snowflake.com

SSC-EWI-0067

Gravité

Élevé

Description

Cette erreur se produit lorsqu’une fonction définie par l’utilisateur (UDF) est détectée dans une requête. Oracle UDFs, UDFs dans les paquets, et certains serveurs SQL UDFs sont convertis en procédures stockées Snowflake. Cependant, les procédures stockées de Snowflake ne peuvent pas être appelées directement à partir d’une requête.

La fonction d’origine est convertie en procédure stockée afin de conserver la même fonctionnalité. Une fonction définie par l’utilisateur Snowflake (UDF) vide est créée pour gérer l’appel de la fonction.

Cet EWI est directement connecté à SSC-EWI-0068

Exemple de code

SQL Server :

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
--** SSC-FDM-0029 - USER DEFINED FUNCTION WAS TRANSFORMED TO SNOWFLAKE PROCEDURE **
CREATE OR REPLACE PROCEDURE PURCHASING.FOO ()
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"transact"}}'
EXECUTE AS CALLER
AS
$$
    DECLARE
        I INT := 0;
        P INT;
    BEGIN

        Select
            COUNT(*)
        INTO
            :P
 FROM
            PURCHASING.VENDOR;
        WHILE (:P < 1000) LOOP
            I := :I + 1;
            P := :P + :I;
        END LOOP;
        IF ((:I = 6)) THEN
            RETURN 1;
        END IF;
        RETURN :P;
    END;
$$;

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 :

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
--** SSC-FDM-0029 - USER DEFINED FUNCTION WAS TRANSFORMED TO SNOWFLAKE PROCEDURE **
CREATE OR REPLACE PROCEDURE employee_function (param1 NUMBER(38, 18))
RETURNS NUMBER(38, 18)
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "oracle",  "convertedOn": "11/14/2024",  "domain": "test" }}'
EXECUTE AS CALLER
AS
$$
  DECLARE
    var1    employees.employee_ID%TYPE;
    var2    employees.manager_ID%TYPE;
    var3    employees.title%TYPE;
  BEGIN
    SELECT employee_ID, manager_ID, title
    INTO
      :var1,
      :var2,
      :var3
    FROM
      employees
      START WITH manager_ID = :param1
    CONNECT BY
      manager_ID = PRIOR employee_id;
    RETURN :var1;
  EXCEPTION
     WHEN no_data_found THEN
      RETURN :param1;
  END;
$$;

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

Recommandations

  • Votre code source peut nécessiter une restructuration pour s’aligner sur les fonctions définies par l’utilisateur de Snowflake (UDFs). Pour en savoir plus sur UDFs, consultez la documentation de Snowflake.

  • Pour toute assistance supplémentaire, veuillez contacter notre équipe de support à l’adresse suivante : snowconvert-support@snowflake.com

SSC-EWI-0036

Gravité

Faible

Description

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

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

Recommandations

SSC-EWI-0026

L’interface Web externe (EWI) est générée exclusivement lors de la conversion des procédures stockées en JavaScript. Toutefois, cette fonction n’est plus recommandée, car Snowflake Scripting est désormais la langue préférée pour les procédures stockées.

Certaines parties du code de sortie ont été supprimées pour en faciliter la compréhension.

Gravité

Faible

Description

Cet avertissement apparaît lorsqu’une requête contient une variable avec un membre qualifié, tel qu’un enregistrement Oracle ou une variable de boucle Teradata. Il se peut que vous deviez ajouter un type cast pour garantir le bon fonctionnement de la variable, en fonction de son utilisation et du type de valeur.

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 de sortie :

-- 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 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 de sortie 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 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

Recommandations

  • Avant d’appliquer une conversion aux types de données Date, Heure ou Horodatage, vérifiez si elle est réellement nécessaire. Snowflake effectue souvent des conversions automatiques (implicites) pour ces types de données.

  • Pour toute assistance supplémentaire, veuillez nous contacter à l’adresse suivante : snowconvert-support@snowflake.com

SSC-EWI-0077

Gravité

Faible

Description

Cet avertissement apparaît lorsqu’une requête contient plusieurs expressions de table communes (CTEs) avec des références circulaires. Lorsque les CTEs font référence les uns aux autres de manière à créer un cycle, il devient impossible de déterminer l’ordre d’exécution correct. En conséquence, les CTEs ne peuvent pas être ordonnés correctement et la requête restera inchangée par rapport à sa forme initiale.

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 de sortie :

!!!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

Recommandations

  • Aucune action n’est requise de votre part.

  • Pour une assistance supplémentaire, veuillez nous contacter à l’adresse suivante : snowconvert-support@snowflake.com

SSC-EWI-0084

Gravité

Élevé

Description

La fonction XMLTABLE n’est pas prise en charge dans cette version.

Exemple de code

Code d’entrée (DB2) :

SELECT
    *
FROM
    XMLTABLE(
        'stringValue' PASSING BY REF passingExpr AS AliasName
    ) AS XMLTABLENAME
Copy

Code de sortie :

SELECT
    *
FROM
    !!!RESOLVE EWI!!! /*** SSC-EWI-0084 - XMLTABLE IS NOT SUPPORTED BY SNOWFLAKE ***/!!!
    XMLTABLE(
        'stringValue' PASSING BY REF passingExpr AS AliasName
    ) AS XMLTABLENAME
Copy

Recommandations

  • Pour des conseils sur les transformations XML dans Snowflake, veuillez vous référer à ce blog.

  • Pour toute assitance supplémentaire, contactez notre équipe de support à l’adresse suivante : snowconvert-support@snowflake.com

SSC-EWI-0012

Gravité

Élevé

Description

Cette erreur se produit lorsqu’une instruction du code source est incomplète ou mal terminée.

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 de sortie :

--** 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 que votre code source est complet et que toutes les instructions se terminent correctement.

  • Pour toute assistance supplémentaire, veuillez nous contacter à l’adresse suivante : snowconvert-support@snowflake.com

SSC-EWI-0058

Gravité

Medium

Description

Cette erreur se produit lorsque vous essayez d’utiliser une instruction non prise en charge dans une commande CREATE PROCEDURE dans Snowflake Scripting.

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 de sortie :

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

Recommandations

  • Aucune action n’est requise de la part des utilisateurs finaux.

  • Pour une assistance supplémentaire, veuillez nous contacter à l’adresse suivante : snowconvert-support@snowflake.com

SSC-EWI-0108

Gravité

Élevé

Description

Dans Snowflake, certains modèles de sous-requêtes et certains éléments ne peuvent pas être exécutés en raison d’un manque de support. La documentation de Snowflake sur les sous-requêtes dresse la liste des types de sous-requêtes suivants pris en charge par :

  • Les sous-requêtes scalaires qui ne font pas référence à des requêtes externes peuvent être utilisées partout où une expression de valeur est autorisée.

  • Les sous-requêtes scalaires qui font référence à des requêtes externes peuvent être utilisées dans les clauses WHERE.

  • Les clauses WHERE prennent en charge les sous-requêtes EXISTS, ANY / ALL et IN. Ces sous-requêtes peuvent faire référence à des requêtes extérieures (corrélées) ou non (non corrélées).

Veuillez noter qu’il peut exister d’autres types de sous-requêtes valables qui ne figurent pas dans cette liste.

Pour éviter les erreurs, SnowConvert identifie les modèles de sous-requêtes les plus courants qui peuvent entraîner des problèmes de compilation dans Snowflake. Lorsqu’un tel modèle est détecté, un EWI est généré pour alerter les utilisateurs sur les erreurs de compilation potentielles.

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 de sortie :

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

Recommandations

  • Vérifiez que la sous-requête s’exécute correctement dans Snowflake. Si c’est le cas, vous pouvez ignorer ce message EWI.

  • Examinez la section « Modèles complexes » de votre rapport d’évaluation. Cette section annonce les modèles qui posent généralement des problèmes de sous-requête et les endroits où ils se produisent. Utilisez ces informations pour comprendre pourquoi certaines sous-requêtes ont été signalées comme non valides.

  • Pour toute assistance supplémentaire, contactez-nous à l’adresse suivante : snowconvert-support@snowflake.com

SSC-EWI-0068

Cet EWI a été supprimé. Veuillez vous référer à la documentation SSC-FDM-0029 pour obtenir des informations à jour.

Les fonctions définies par l’utilisateur de Snowflake ont des capacités différentes de celles d’Oracle ou de SQL Server. Lors de la migration, ces fonctions sont converties en procédures stockées Snowflake afin de conserver la même fonctionnalité. Cette conversion modifiera la façon dont vous les utilisez dans vos requêtes.

Exemple de code

SQL Server :

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
!!!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":1, "minor":0},{"attributes":{"component":"transact"}}'
EXECUTE AS CALLER
AS
$$
    DECLARE
        I INT := 0;
        P INT;
    BEGIN

        Select
            COUNT(*)
        INTO
            :P
 FROM
            PURCHASING.VENDOR;
        WHILE (:P < 1000) LOOP
            I := :I + 1;
            P := :P + :I;
        END LOOP;
        IF ((:I = 6)) THEN
            RETURN 1;
        END IF;
        RETURN :P;
    END;
$$;
Copy

Oracle :

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;
Copy
!!!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

Recommandations

  • Décomposez les requêtes complexes en parties plus petites et logiquement équivalentes.

  • Restructurer le code source pour l’aligner sur l”approche des fonctions définies par l’utilisateur de Snowflake (UDF).

  • Pour toute assistance supplémentaire, contactez-nous à l’adresse suivante : snowconvert-support@snowflake.com

SSC-EWI-0028

Gravité

Medium

Description

Cette erreur se produit lorsque vous tentez d’utiliser un type de données qui n’est pas compatible avec Snowflake.

Exemple

Code d’entrée (Oracle) :

CREATE TABLE MYTABLE
(
    COL1 SYS.ANYDATASET
);
Copy

Code de sortie :

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

Recommandations

SSC-EWI-0008

Gravité

Medium

Description

Cet avertissement apparaît lorsqu’une clause de classement est utilisée comme option de colonne. Bien que Snowflake supporte le classement, le comportement peut différer de celui de la base de données source. Pour garantir la compatibilité, veuillez consulter les spécificateurs de classement pris en charge dans la documentation de classement.

Exemple de code

Code d’entrée :

CREATE TABLE TABLE01 (
    col1 text COLLATE "C"
);
Copy

Code de sortie :

CREATE TABLE TABLE01 (
    col1 text
              !!!RESOLVE EWI!!! /*** SSC-EWI-0008 - COLLATE CLAUSE MAY HAVE A DIFFERENT BEHAVIOR IN SNOWFLAKE. ***/!!! COLLATE "C"
);
Copy

Recommandations

SSC-EWI-0049

La fonction EWI a été supprimée. Pour des informations plus récentes, veuillez consulter la documentation SSC-FDM-0023.

Gravité

Medium

Description

SnowConvert convertit les tables temporaires globales en instructions standard de création de table. Veuillez noter que toute référence à ces tables transformées peut ne pas fonctionner comme prévu à l’origine.

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

Recommandations

SSC-EWI-0109

Gravité

Medium

Description

Le message apparaît lorsque la syntaxe de la table de modification de votre code n’est pas compatible avec les exigences syntaxiques de Snowflake.

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 de sortie :

!!!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

Recommandations

  • Aucune action n’est requise de votre part.

  • Pour une assistance supplémentaire, veuillez nous contacter à l’adresse suivante : snowconvert-support@snowflake.com

SSC-EWI-0009

Gravité

Faible

Description

Actuellement, Snowflake ne prend en charge que les expressions régulières de base qui suivent la syntaxe d’expression régulière de base de POSIX. Les fonctions avancées d’expression régulière ne sont pas disponibles.

Cet avertissement apparaît chaque fois qu’un appel de fonction à REGEX_SUBSTR, REGEX_REPLACE ou REGEX_INSTR est converti en Snowflake. Il alerte les utilisateurs sur le fait que certaines fonctions d’expression régulière peuvent ne pas être prises en charge par Snowflake. Les fonctions importantes non prises en charge sont lookahead, lookbehind et non-capturing groups.

Exemple de code

Teradata :

SELECT REGEXP_SUBSTR('qaqequ','q(?=u)', 1, 1);
Copy

Snowflake Scripting:

SELECT
!!!RESOLVE EWI!!! /*** SSC-EWI-TD0020 - REGEXP_SUBSTR FUNCTION ONLY SUPPORTS POSIX REGULAR EXPRESSIONS ***/!!!
REGEXP_SUBSTR('qaqequ','q(?=u)', 1, 1);
Copy

Recommandations

  • Examinez chaque modèle d’expression régulière pour déterminer si des modifications manuelles sont nécessaires. Pour plus de détails sur les capacités regex de Snowflake et les options alternatives, voir ici.

  • Pour toute assistance supplémentaire, contactez-nous à l’adresse suivante : snowconvert-support@snowflake.com

SSC-EWI-0031

Certaines parties du code de sortie ont été supprimées pour rendre l’exemple plus clair et plus facile à suivre.

Sévérité

Medium

Description

Cet avertissement indique qu’une _ fonction intégrée _ spécifique de Teradata, Oracle ou SQL Server ne peut pas être convertie car elle n’est pas prise en charge par la plateforme cible.

Exemple de code

Code d’entrée (Oracle) :

SELECT VALUE(ST) FROM SampleTable ST;
Copy

Code de sortie :

// SnowConvert Helpers Code section is omitted.
SELECT
!!!RESOLVE EWI!!! /*** SSC-EWI-0031 - VALUE FUNCTION NOT SUPPORTED ***/!!!
 VALUE(ST) FROM
 SampleTable ST;
Copy

Recommandations

SSC-EWI-0005

Gravité

Critique

Description

Cette erreur se produit lorsque le code source ne peut pas être converti en raison d’une erreur de transformation inattendue, ce qui empêche la génération du fichier de code de sortie.

Recommandations

  • Examinez le fichier du journal des erreurs pour trouver des informations détaillées sur le problème.

  • Pour toute assistance supplémentaire, veuillez contacter notre équipe de support à l’adresse suivante : snowconvert-support@snowflake.com

SSC-EWI-0054

Certaines parties du code de sortie ont été supprimées pour rendre l’exemple plus clair et plus facile à suivre.

Gravité

Faible

Description

Cette erreur se produit lorsqu’une sous-requête corrélée est détectée à l’intérieur d’une condition OR dans une instruction OUTER JOIN (gauche, droite ou complète). Cette situation peut entraîner des résultats de requête incohérents ou déclencher un message d’erreur.

erreur de compilation SQL : la requête contient un type de sous-requête qui n'est pas pris en charge et qui ne peut pas être traité.

Snowflake a documenté ces limites des sous-requêtes dans sa documentation officielle. Vous trouverez plus de détails sur ces limites dans les forums de la communauté Snowflake.

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 de sortie :

// SnowConvert 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

Recommandations

  • Vérifiez que le code converti se compile sans erreur.

  • Assurez-vous que le code converti fonctionne exactement comme le code original.

  • Pour toute assistance supplémentaire, contactez-nous à l’adresse suivante : snowconvert-support@snowflake.com

SSC-EWI-0015

Certaines parties du code ont été omises pour que l’exemple reste clair et concis.

Gravité

Medium

Description

Cette section explique les problèmes qui peuvent survenir lors de l’utilisation des clauses PIVOT et UNPIVOT. La table ci-dessous présente les scénarios qui ne sont pas pris en charge.

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

PIVOT et UNPIVOT ne peuvent être effectuées que sur une seule colonne à la fois.

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 de sortie :

// SnowConvert 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

Lors de l’utilisation des clauses UNPIVOT dans Snowflake, les alias de colonne ne sont pas pris en charge. Pour assurer la compatibilité, SnowConvert supprime automatiquement les alias des fonctions ou des colonnes afin de créer une requête valide. L’outil vérifie que la suppression de ces alias n’affecte pas la fonctionnalité de la requête originale.

Les opérations PIVOT dans SnowConvert for Teradata requièrent deux exigences spécifiques pour que les alias de colonne fonctionnent correctement :

  1. Chaque expression contenue dans la clause IN doit être associée à un alias

  2. SnowConvert doit savoir quelles colonnes seront créées. Ces informations peuvent provenir de l’une ou l’autre source :

    • Une définition de table fournie

    • Une sous-requête qui liste explicitement les colonnes en 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;
Copy

Code de sortie :

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

Les clauses PIVOT ne prennent pas en charge les fonctions multiples. Cependant, vous pouvez souvent réécrire ces requêtes à l’aide des instructions CASE. Pour plus de détails et d’exemples, reportez-vous à la documentation Teradata : 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 de sortie :

// SnowConvert 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

La clause PIVOT de Teradata comprend une instruction WITH facultative, qui n’est pas supportée par l’implémentation 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 de sortie :

// SnowConvert 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 des opérations 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 de sortie :

// SnowConvert 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

Snowpark Migration Accelerator ne prend pas en charge l’utilisation de sous-requêtes dans les clauses IN.

Exemple de code

Code d’entrée :

SELECT * FROM s1 PIVOT(SUM(COL1) FOR FORCOL IN (SELECT SELCOL FROM S2))DT;
Copy

Code de sortie :

// SnowConvert 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 produit lorsque le mot-clé ANY est utilisé dans une clause IN. Actuellement, cette combinaison n’est pas prise en charge par le système.

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 de sortie :

// SnowConvert 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

Les clauses UNPIVOT dans Snowflake ne prennent pas en charge les options INCLUDE NULLS ou EXCLUDE NULLS.

Exemple de code

Code d’entrée :

SELECT * FROM db1.star1p UNPIVOT INCLUDE NULLS (column1  FOR  for_column IN (col1, col2)) Tmp;
Copy

Code de sortie :

// SnowConvert 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

Recommandations

  • Si possible, réécrivez la requête. Si ce n’est pas le cas, vous n’avez pas besoin de prendre d’autres actions.

  • Pour une assistance supplémentaire, veuillez nous contacter à l’adresse suivante : snowconvert-support@snowflake.com

SSC-EWI-0021

Gravité

Medium

Description

Cette erreur se produit lorsque votre code source contient un nœud ou une instruction qui n’est pas compatible avec les fonctionnalités de 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 de sortie :

!!!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

Recommandations

  • Cette erreur se produit lorsqu’il n’existe pas de fonctionnalité Snowflake équivalente pour le code source en cours de conversion.

  • Pour toute assistance supplémentaire, veuillez nous contacter à l’adresse suivante : snowconvert-support@snowflake.com

SSC-EWI-0110

Gravité

Faible

Description

Lorsque SnowConvert rencontre des dépendances manquantes, il ajoute un message EWI (Erreur, Avertissement, Information) pour indiquer que la transformation du code ne peut pas être achevée. Alors que SnowConvert crée normalement un nouveau code en analysant la structure du code source d’origine au moyen d’arborescences syntaxiques abstraites, il ne peut pas achever la transformation si des dépendances essentielles sont absentes de son modèle sémantique.

Exemple de code

Code d’entrée :

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

Code de sortie :

--** 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

Recommandations

  • Ajoutez toutes les dépendances requises qui ne sont pas présentes dans votre code.

  • Pour toute assistance supplémentaire, veuillez nous contacter à l’adresse suivante : snowconvert-support@snowflake.com

SSC-EWI-0001

Certaines parties du code ont été supprimées pour rendre l’exemple plus clair et plus facile à comprendre.

Gravité

Critique

Description

Cette erreur apparaît lorsque le système ne peut pas lire et traiter correctement le code source pendant la conversion. Cela peut se produire pour deux raisons :

  1. Le code source contient des erreurs de syntaxe

  2. Le convertisseur ne reconnaît pas encore certaines instructions ou syntaxes de code

Exemple de code

Les exemples suivants montrent divers scénarios d’erreurs d’analyse avec une syntaxe incorrecte dans l’entrée. Chaque scénario affiche un message d’erreur différent qui peut vous aider à identifier et à corriger le problème. Pour plus de références, reportez-vous à la section « Contenu 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 de sortie :

-- ** 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. Position de départ : indique où commence le code non reconnu, y compris le numéro de ligne, le numéro de colonne et le texte proprement dit. Tout code non reconnu à partir de ce point sera commenté jusqu’à ce que l’analyseur syntaxique trouve un code valide.

  2. Grammaire attendue : indique le type de structure de code recherché par l’analyseur. Comparez ce code avec le code commenté pour vérifier s’ils correspondent.

  3. Dernier jeton valide (OPTIONAL) : indique le dernier morceau de code qui a bien été reconnu. Si c’est le cas, examinez le code qui suit pour vous assurer qu’il est syntaxiquement correct.

  4. Échec du jeton (OPTIONAL) : n’apparaît que lorsque le « dernier jeton valide » est présent. Identifie le point exact où le code est devenu non valide ou méconnaissable. Vérifiez si cet élément de code est autorisé à cet emplacement.

Contenu des messages abandonnés et qui ne sont plus pris en charge

Les éléments suivants ne sont plus utilisés et ne sont conservés qu’à titre de référence historique.

  1. Code de récupération (DEPRECATED) : ce code d’erreur permet d’identifier comment le mécanisme de récupération de l’analyseur a été déclenché. Vous pouvez inclure ce code dans votre requête d’assistance pour les mises à jour de l’analyseur, afin de faciliter le dépannage.

Recommandations

  • Vérifiez que votre code source respecte les règles de syntaxe correctes.

  • Utilisez les messages d’erreur pour identifier et résoudre les problèmes.

  • Si vous rencontrez une syntaxe non prise en charge, modifiez-la manuellement pour utiliser les modèles de syntaxe pris en charge.

  • Pour toute assistance supplémentaire, contactez-nous à l’adresse suivante : snowconvert-support@snowflake.com

SSC-EWI-0035

Certaines parties du code ont été supprimées pour rendre l’exemple plus clair et plus facile à comprendre.

Gravité

Faible

Description

La contrainte _ CHECK _ n’est pas prise en charge dans Snowflake, mais cette limite n’a pas d’impact sur la fonctionnalité de votre base de données.

Exemple de code

Code d’entrée Oracle :

CREATE TABLE "Schema"."BaseTable"(
  "COLUMN1" VARCHAR2(255),
  CHECK ( COLUMN1 IS NOT NULL )
);
Copy

Code de sortie :

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 de sortie :

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 de sortie :

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

Recommandations

SSC-EWI-0064

Gravité

Élevé

Description

Cette erreur se produit lorsqu’un type défini par l’utilisateur (UDT) est référencé dans une instruction du langage de manipulation des données (DML), mais que le type UDT n’a pas été défini au préalable dans la base de données. Cela se produit généralement lorsqu’une colonne de table est déclarée avec un type personnalisé qui n’existe pas dans le système.

Cette erreur ne doit pas être confondue avec SSC-FDM-0015, qui se produit lorsque l’objet est 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 de sortie :

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

Recommandations

  • Vérifiez que le type de données mentionné dans votre code a été correctement défini dans le code source.

  • Pour toute assistance supplémentaire, veuillez nous contacter à l’adresse suivante : snowconvert-support@snowflake.com

SSC-EWI-0025

L’interface Web externe (EWI) est générée exclusivement lors de la conversion des procédures stockées en JavaScript. Toutefois, cette fonction n’est plus recommandée, car Snowflake Scripting est désormais la langue préférée pour les procédures stockées.

Certaines parties du code de sortie ont été supprimées pour rendre l’exemple plus clair et plus facile à suivre.

Gravité

Faible

Description

Les requêtes contenant des variables temporelles peuvent devoir être modifiées lors de la liaison de ces variables.

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 de sortie :

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

Recommandations

  • Aucune action n’est requise de votre part.

  • Pour une assistance supplémentaire, veuillez nous contacter à l’adresse suivante : snowconvert-support@snowflake.com

SSC-EWI-0011

Gravité

Élevé

Description

Cette erreur se produit lorsqu’une instruction du code source se termine de manière inattendue et que le système ne peut pas la traiter correctement.

Recommandations

  • Vérifiez que votre code source est complet et que toutes les instructions sont correctement terminées.

  • Pour toute assistance supplémentaire, veuillez nous contacter à l’adresse suivante : snowconvert-support@snowflake.com

SSC-EWI-0040

Certaines parties du code de sortie ont été supprimées pour rendre l’exemple plus clair et plus facile à comprendre.

Gravité

Faible

Description

Cet avertissement apparaît lorsque vous utilisez une instruction SQL qui n’est pas prise en charge par Snowflake.

Exemple de code

L’exemple suivant montre une requête SELECT SQL Server qui utilise la clause PERCENT. Cette fonction n’est pas disponible dans Snowflake.

Code d’entrée (SQL Server) :

SELECT TOP 1 PERCENT * FROM SampleTable;
Copy

Code source :

// SnowConvert Helpers Code section is omitted.
SELECT
TOP 1 !!!RESOLVE EWI!!! /*** SSC-EWI-0040 - THE STATEMENT IS NOT SUPPORTED IN SNOWFLAKE ***/!!!
*
FROM
SampleTable;
Copy

Recommandations

  • Évaluez si la fonctionnalité de l’instruction d’origine est nécessaire pour votre mise en œuvre de Snowflake.

  • Pour toute assistance supplémentaire, contactez-nous à l’adresse suivante : snowconvert-support@snowflake.com

SSC-EWI-0034

Certaines parties du code de sortie ont été supprimées pour rendre l’exemple plus clair et plus facile à suivre.

Gravité

Faible

Description

Cet avertissement apparaît lorsque vous tentez d’utiliser une fonction CAST avec une colonne dont le format a été supprimé.

Exemple de code

Code d’entrée (Teradata) :

CREATE VIEW SampleView AS
SELECT
    DAY_DATE(FORMAT 'MMM-YYYY') + 1
FROM
    SampleTable;
Copy

Code de sortie :

// SnowConvert 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

Recommandations

SSC-EWI-0086

La fonction EWI a été supprimée. Pour des informations plus récentes, veuillez consulter la documentation SSC-FDM-0030.

Gravité

Faible

Description

L’identificateur contient des caractères qui ne sont pas pris en charge dans la langue de sortie. Ces caractères ont été remplacés par les codes UTF-8 correspondants.

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 de sortie :

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

Recommandations

  • Aucune action n’est requise de la part des utilisateurs finaux.

  • Pour une assistance supplémentaire, veuillez nous contacter à l’adresse suivante : snowconvert-support@snowflake.com

SSC-EWI-0010

Gravité

Critique

Description

Cette erreur se produit lorsque le système ne trouve pas de règle de transformation correspondant à une instruction de procédure spécifique.

Recommandations

  • Vérifiez que votre instruction de procédure est correctement formatée.

  • Pour toute assistance supplémentaire, veuillez contacter notre équipe de support à l’adresse suivante : snowconvert-support@snowflake.com

SSC-EWI-0041

Cet EWI a été supprimé. Pour plus d’informations, veuillez consulter SSC-OOS-0001.

Description

Cette erreur se produit lorsque le fichier de code source utilise un format de codage de caractères que l’outil ne peut pas reconnaître. Le codage des caractères est une méthode de conversion des caractères de texte en valeurs numériques que les ordinateurs peuvent traiter. Lorsque l’outil de conversion rencontre des caractères qu’il ne peut pas interpréter, il génère cette erreur.

Recommandations

  • Assurez-vous que tous les fichiers du dossier d’entrée utilisent le même encodage de caractères afin d’éviter les erreurs liées à l’encodage.

  • Choisissez l’encodage correct en procédant de l’une des manières suivantes :

    • Ajustement des paramètres de conversion, ou

    • Utilisation du paramètre –encoding avec CLI

  • Pour identifier l’identificateur correct, vous pouvez :

    • Utiliser des outils en ligne tels que Free Online Formater

    • Sous Linux ou OS, exécutez la commande file -i *

  • Pour toute assistance supplémentaire, contactez-nous à l’adresse suivante : snowconvert-support@snowflake.com

SSC-EWI-0101

Gravité

Faible

Description

Snowflake ne prend pas en charge les noms d’étiquettes de transaction car les transactions imbriquées ne sont pas autorisées, ce qui rend inutile l’identification de transactions spécifiques dans les instructions COMMIT ou ROLLBACK.

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 de sortie :

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

Recommandations

  • Aucune action n’est requise de la part des utilisateurs.

  • Pour une assistance supplémentaire, veuillez nous contacter à l’adresse suivante : snowconvert-support@snowflake.com

SSC-EWI-0030

Certaines parties du code de sortie ont été supprimées pour rendre l’exemple plus clair et plus facile à suivre.

Gravité

Modéré

Description

Cette erreur indique que l’instruction contient du code dynamique SQL, c’est-à-dire du code SQL construit sous forme de texte à l’aide des fonctions de manipulation de chaînes fournies par le moteur de base de données. Les différentes langues sources ont leurs propres méthodes d’exécution des instructions dynamiques SQL.

Ce modèle est complexe car il implique le code SQL qui est généré et exécuté pendant l’environnement d’exécution, ce qui rend difficile le suivi et le débogage des problèmes. Bien que SnowConvert, en tant qu’analyseur de code statique, ne puisse pas analyser complètement une telle dynamique SQL, ce message d’erreur permet d’identifier les problèmes potentiels.

Exemple de code

Teradata

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

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

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

Lors de la migration du code SQL dynamique, il est important de noter que SnowConvert ne détecte ni ne signale les problèmes dans les instructions dynamiques SQL. Cela s’applique à la fois au code de sortie converti et aux rapports d’évaluation, même dans les cas où la documentation ou les spécifications de traduction indiquent qu’un problème doit être signalé. Par exemple, cette limite peut être observée lors de la migration du code 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
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

Si l’on compare les deux approches, la requête et l’affectation des variables au sein de la procédure auront des conversions identiques. Toutefois, lorsque vous utilisez la version dynamique du site SQL, les problèmes de conversion ne seront visibles ni dans le code de sortie ni dans les rapports d’évaluation.

Recommandations

  • Activez le suivi des instructions pour surveiller et valider les instructions SQL générées dynamiquement pendant le dépannage.

  • Pour toute assistance supplémentaire, veuillez nous contacter à l’adresse suivante : snowconvert-support@snowflake.com

SSC-EWI-0092

Obsolète

Gravité

Faible

Description

Les vues matérialisées de Snowflake ont des limites spécifiques qui sont décrites dans la documentation de Snowflake. Actuellement, SnowConvert convertit toutes les vues matérialisées en vues normales, en supprimant toutes les clauses supplémentaires. Dans les prochaines versions, SnowConvert prendra en charge la conversion des vues matérialisées compatibles en leur équivalent 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 de sortie :

!!!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

Recommandations

  • Aucune action n’est requise de votre part.

  • Pour une assistance supplémentaire, veuillez nous contacter à l’adresse suivante : snowconvert-support@snowflake.com

SSC-EWI-0004

Gravité

Critique

Description

Ce problème survient lorsqu’une erreur se produit lors de l’exécution d’une règle de conversion pour un nœud spécifique de SCRIPT(bteq…) dans le code source.

Recommandations

SSC-EWI-0045

Gravité

Medium

Description

Lors de la conversion du code vers Snowflake, vous pouvez rencontrer des noms de colonnes qui sont valides dans votre base de données source mais qui entrent en conflit avec les mots-clés réservés de Snowflake. Cela est dû au fait que Snowflake dispose d’un ensemble spécifique de mots réservés à l’usage du système et qui ne peuvent pas être utilisés comme noms de colonnes sans un formatage spécial. Pour une liste complète de ces mots-clés, veuillez consulter la documentation 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

Recommandations

  • Passez en revue et renommez toutes les colonnes dont les noms ne sont pas compatibles avec les conventions de dénomination de Snowflake.

  • Pour toute assistance supplémentaire, veuillez contacter notre équipe de support à l’adresse suivante : snowconvert-support@snowflake.com

SSC-EWI-0014

Gravité

Critique

Description

Cette erreur se produit lorsque le système ne parvient pas à générer le corps requis pour une instruction de procédure stockée.

Recommandations

SSC-EWI-0020

Gravité

Faible

Résumé

SnowConvert comprend plusieurs fonctions définies par l’utilisateur (UDFs) qui permettent de répliquer les comportements des langues sources qui ne sont pas supportées en natif par Snowflake. Voici leurs fonctions et leurs descriptions.

Les UDFs (fonctions définies par l’utilisateur) sont situées dans le dossier « UDF Helpers », qui est automatiquement créé dans le répertoire de sortie que vous avez spécifié une fois le processus de migration terminé.

Recommandations

  • Vérifiez que le dossier UDF Helpers a été créé et qu’il contient les fichiers attendus.

  • Pour toute assistance supplémentaire, veuillez contacter notre équipe de support à l’adresse suivante : snowconvert-support@snowflake.com