SnowConvert: Problemas gerais

SSC-EWI-0003

Gravidade

Crítico

Descrição

Esse problema ocorre quando há um erro durante a execução de uma regra de conversão para um nó SQL específico no código-fonte.

Recomendações

SSC-EWI-0052

Gravidade

Medium

Descrição

Esse erro ocorre quando a ferramenta de conversão não consegue reconhecer ou não oferece suporte a um parâmetro ou variável no código-fonte.

Exemplo de código

Código de entrada (Oracle):

-- Additional Params: -t JavaScript
CREATE OR REPLACE PROCEDURE PROCEDURE_PARAMETERS(PARAM SDO_GEOMETRY)
AS
    VARIABLE SDO_GEOMETRY;
BEGIN
    VARIABLE := PARAM;
END;
Copy

Código de saída:

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

Recomendações

  • Considere a possibilidade de usar um tipo de dados diferente que atenda melhor às suas necessidades.

  • Para obter assistência adicional, entre em contato conosco pelo e-mail snowconvert-support@snowflake.com

SSC-EWI-0066

Severidade

High

Descrição

Esse erro indica que uma determinada expressão não é compatível ou suportada pelo Snowflake.

Código de exemplo

Código de entrada:

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

Código de saída:

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

Recomendações

SSC-EWI-0027

Partes do código de saída foram removidas para tornar o exemplo mais claro e fácil de seguir.

Gravidade

Medium

Descrição

Esse aviso indica que uma instrução não pode ser executada porque contém uma consulta inválida devido a uma variável ou valor literal incorreto.

Exemplo de código

Código de entrada:

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

Código de saída:

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

Recomendações

  • Verifique se você precisa converter explicitamente os valores para os formatos de data, hora ou carimbo de data/hora. Em muitos casos, o Snowflake converte automaticamente esses valores, tornando desnecessária a conversão explícita.

  • Para obter assistência adicional, entre em contato conosco pelo e-mail snowconvert-support@snowflake.com

SSC-EWI-0102

Gravidade

Low

Descrição

Quando os comandos do Snowflake são processados por regras de conversão, determinadas opções podem ser omitidas no código de saída. No entanto, a funcionalidade resultante permanece a mesma do código original.

Exemplo de código

Código de entrada (PostgreSQL):

-- Case 1:
TRUNCATE ONLY table_base2 RESTART IDENTITY CASCADE;

-- Case 2:
TRUNCATE TABLE table_inherit_and_generated RESTART IDENTITY CASCADE;
Copy

Código de saída:

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

Recomendações

SSC-EWI-0013

Gravidade

Crítico

Descrição

Esse erro ocorre quando o sistema encontra um problema ao converter o código do formato de origem.

Recomendação

SSC-EWI-0033

Partes do código de saída foram removidas para facilitar a compreensão.

Gravidade

Low

Descrição

Esse aviso aparece quando o código-fonte não contém uma coluna que está sendo convertida usando uma função _ CAST _ com um formato de saída especificado.

Exemplo de código

Código de entrada (Teradata):

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

Código de saída:

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

Recomendações

  • Verifique se todas as tabelas e visualizações necessárias referenciadas na instrução de procedimento foram migradas com sucesso.

  • Para obter assistência adicional, entre em contato conosco pelo e-mail snowconvert-support@snowflake.com

SSC-EWI-0062

Gravidade

Low

Descrição

Essa mensagem aparece quando um Custom Type é referenciado e posteriormente modificado para usar um tipo de dados variante.

Essa mensagem está intimamente ligada ao código de erro SSC-EWI-0056.

Exemplo de código

Código de entrada (Oracle):

CREATE TYPE type1 AS OBJECT(type1_column1 INT);

CREATE TABLE table1
(
column1 type1
);
Copy

Código de saída:

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

Recomendações

  • Certifique-se de converter todos os dados de entrada em um tipo de dados compatível com a Variant.

  • Para obter assistência adicional, entre em contato conosco pelo e-mail snowconvert-support@snowflake.com.

SSC-EWI-0056

Gravidade

Low

Descrição

Essa mensagem aparece quando é detectado um Custom Type que pode ser transformado. Ele fornece feedback sobre os tipos personalizados que serão comentados.

A definição do tipo tem um comentário, mas ainda é usada para resolver referências. Para obter mais detalhes, consulte SSC-EWI-0062.

Exemplo de código

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

Código de saída:

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

Recomendações

SSC-EWI-0007

Gravidade

Crítico

Descrição

Esse erro ocorre quando há um problema de gravação no arquivo de saída.

Recomendações

SSC-EWI-0046

Gravidade

Crítico

Descrição

O Snowflake não permite que você crie funções ou procedimentos dentro de outras funções ou procedimentos (declarações aninhadas). Quando o SnowConvert detecta declarações aninhadas em uma declaração CREATE FUNCTION ou CREATE PROCEDURE, ele gera uma mensagem de aviso.

Exemplo de código

Entrada

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

Saída

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

Recomendações

  • Mova todas as declarações aninhadas para fora da função ou do procedimento.

  • Para obter assistência adicional, entre em contato conosco pelo e-mail snowconvert-support@snowflake.com

SSC-EWI-0023

A External Web Interface (EWI) é gerada exclusivamente ao converter procedimentos armazenados para JavaScript. No entanto, esse recurso não é mais recomendado, pois o Snowflake Scripting é agora a linguagem preferida para procedimentos armazenados.

Partes do código de saída foram removidas para tornar o exemplo mais claro e fácil de seguir.

Gravidade

Low

Descrição

Esse aviso destaca as possíveis implicações de desempenho que os usuários devem considerar.

Exemplo de código

Código de entrada:

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

Código de saída:

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

Recomendações

SSC-EWI-0107

Gravidade

High

Descrição

Os intervalos no Snowflake só podem ser usados para cálculos matemáticos. Não há suporte para o uso de intervalos para qualquer outra finalidade.

Código de exemplo

Código de entrada:

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

Código de saída:

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

Recomendações

SSC-EWI-0073

Gravidade

Medium

Descrição

Esse aviso aparece quando o SnowConvert encontra uma estrutura gramatical na plataforma de origem que não foi avaliada pela nossa equipe de desenvolvimento quanto à compatibilidade com o Snowflake. O código permanece sem transformação, o que significa que pode exigir revisão e modificação manual para funcionar corretamente no Snowflake.

Exemplo de código

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

Na linha 6 do código de entrada, há uma instrução INSERT usando DEFAULT VALUES. No momento, essa sintaxe não é compatível com o SnowConvert, razão pela qual uma mensagem EWI (Error, Warning, Information) aparece nas linhas 11 e 12.

Recomendações

SSC-EWI-0022

A External Web Interface (EWI) é gerada exclusivamente ao converter procedimentos armazenados para JavaScript. No entanto, esse recurso não é mais recomendado, pois o Snowflake Scripting é agora a linguagem preferida para procedimentos armazenados.

Partes do código de saída foram removidas para tornar o exemplo mais claro e fácil de seguir.

Gravidade

Medium

Descrição

Esse erro indica que determinados identificadores em uma instrução são automaticamente tratados como parâmetros pelo sistema.

Exemplo de código

Código de entrada:

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

Código de saída:

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

Recomendações

  • Verifique se todas as tabelas e visualizações necessárias referenciadas na instrução de procedimento foram migradas com sucesso.

  • Para obter assistência adicional, entre em contato conosco pelo e-mail snowconvert-support@snowflake.com

SSC-EWI-0080

Severidade

Low

Descrição

Esse aviso aparece quando seu código-fonte contém um tipo de dados BINARY com um valor padrão, que o Snowflake SQL não suporta.

Código de exemplo

Código de entrada (SQL Server):

create table test1345
(
  key1 binary default 0
);
Copy

Código de saída:

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

Recomendações

SSC-EWI-0002

Gravidade

Moderado

Descrição

Os parâmetros padrão devem ser colocados no final da lista de parâmetros no Snowflake. Você precisará reordenar todos os parâmetros com valores padrão para garantir que eles apareçam por último nas declarações de parâmetros.

Exemplo de código

Código de entrada:

CREATE PROCEDURE MySampleProc
    @Param1 NVARCHAR(50) = NULL,
    @Param2 NVARCHAR(10),
    @Param3 NVARCHAR(10) = NULL,
    @Param4 NVARCHAR(10)
AS
    SELECT 1;
Copy

Código de saída:

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

Recomendações

SSC-EWI-0053

Gravidade

Low

Descrição

Esse erro ocorre quando a ferramenta de conversão não consegue identificar o tipo de dados de uma variável. Isso geralmente acontece quando uma variável não foi declarada corretamente no código.

Exemplo de código

Código de entrada (Oracle):

-- Additional Params: -t javascript
CREATE OR REPLACE PROCEDURE PROCEDURE_VARIABLES
AS
    VARIABLE INTEGER;
BEGIN
    VARIABLE := ANOTHER_VARIABLE;
END;
Copy

Código de saída:

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

Recomendações

  • Verifique se todas as variáveis estão declaradas corretamente em seu código.

  • Para obter assistência adicional, entre em contato conosco pelo e-mail snowconvert-support@snowflake.com

SSC-EWI-0094

Gravidade

Low

Descrição

Atualmente, o Snow Scripting não oferece suporte a declarações de rótulos. O sistema adicionará uma mensagem de Erro, Aviso ou Informação (EWI) e comentará o rótulo.

Exemplo de código

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

Código de saída:

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

Recomendações

SSC-EWI-0067

Gravidade

High

Descrição

Esse erro ocorre quando uma função definida pelo usuário (UDF) é detectada em uma consulta. UDFs Oracle, UDFs dentro de pacotes e determinadas UDFs SQL Server são convertidas em Snowflake Stored Procedures. No entanto, os procedimentos armazenados do Snowflake não podem ser chamados diretamente de uma consulta.

A função original é convertida em um procedimento armazenado para manter a mesma funcionalidade. Uma Função Definida pelo Usuário do Snowflake vazia correspondente (UDF) é criada para lidar com a chamada de função.

Esse Indicador de Alerta Antecipado (EWI) está diretamente conectado a SSC-EWI-0068

Exemplo de código

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

Recomendações

  • Seu código-fonte pode precisar de reestruturação para se alinhar às funções definidas pelo usuário do Snowflake (UDFs). Saiba mais sobre o UDFs na documentação do Snowflake.

  • Para obter assistência adicional, entre em contato com nossa equipe de suporte pelo e-mail snowconvert-support@snowflake.com

SSC-EWI-0036

Gravidade

Low

Descrição

Esse aviso aparece quando um tipo de dados é convertido em um tipo de dados diferente.

Exemplo de código

Código-fonte:

CREATE TABLE SampleTable (
    SampleYear INTERVAL YEAR(2),
    SampleMonth INTERVAL MONTH(2)
);
Copy

Código convertido:

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

Recomendações

SSC-EWI-0026

A External Web Interface (EWI) é gerada exclusivamente ao converter procedimentos armazenados para JavaScript. No entanto, esse recurso não é mais recomendado, pois o Snowflake Scripting é agora a linguagem preferida para procedimentos armazenados.

Partes do código de saída foram removidas para facilitar a compreensão.

Gravidade

Low

Descrição

Esse aviso aparece quando uma consulta contém uma variável com um membro qualificado, como um registro Oracle ou uma variável de loop Teradata. Talvez seja necessário adicionar um type cast para garantir que a variável funcione corretamente, dependendo do seu uso e do tipo de valor.

Exemplo de código

Código de entrada:

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

Código de saída:

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

Código de saída com ajustes:

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

Recomendações

  • Antes de aplicar uma conversão aos tipos de dados Date, Time ou Timestamp, verifique se ela é realmente necessária. O Snowflake geralmente realiza conversões automáticas (implícitas) para esses tipos de dados.

  • Para obter assistência adicional, entre em contato conosco pelo e-mail snowconvert-support@snowflake.com

SSC-EWI-0077

Gravidade

Low

Descrição

Esse aviso aparece quando uma consulta contém várias Common Table Expressions (CTEs) com referências circulares. Quando CTEs fazem referência uns aos outros de forma a criar um ciclo, torna-se impossível determinar a ordem correta de execução. Como resultado, os CTEs não podem ser ordenados corretamente e a consulta permanecerá inalterada em relação à sua forma original.

Exemplo de código

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

Código de saída:

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

Recomendações

SSC-EWI-0084

Gravidade

High

Descrição

A função XMLTABLE não é compatível com esta versão no momento.

Exemplo de código

Código de entrada (DB2):

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

Código de saída:

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

Recomendações

  • Para obter orientação sobre transformações XML no Snowflake, consulte este blog.

  • Para obter assistência adicional, entre em contato com nossa equipe de suporte pelo e-mail snowconvert-support@snowflake.com

SSC-EWI-0012

Gravidade

High

Descrição

Esse erro ocorre quando uma instrução no código-fonte está incompleta ou foi encerrada de forma inadequada.

Exemplo de código

Código de entrada:

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

Código de saída:

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

Recomendação

  • Verifique se o código-fonte está completo e se todas as instruções terminam corretamente.

  • Para obter assistência adicional, entre em contato conosco pelo e-mail snowconvert-support@snowflake.com

SSC-EWI-0058

Gravidade

Medium

Descrição

Esse erro ocorre quando você tenta usar uma instrução não suportada em um comando CREATE PROCEDURE no Snowflake Scripting.

Exemplo de código

Código de entrada (Oracle):

CREATE OR REPLACE PROCEDURE PROC01
IS
  number_variable INTEGER;
BEGIN
  EXECUTE IMMEDIATE 'SELECT 1 FROM DUAL' INTO number_variable;
END;
Copy

Código de saída:

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

Recomendações

SSC-EWI-0108

Gravidade

High

Descrição

No Snowflake, alguns padrões e elementos de subconsulta não podem ser executados devido à falta de suporte. A documentação do Snowflake sobre subconsultas lista os seguintes tipos de subconsultas suportados:

  • As subconsultas escalares que não fazem referência a consultas externas podem ser usadas em qualquer lugar em que uma expressão de valor seja permitida.

  • As subconsultas escalares que fazem referência a consultas externas podem ser usadas nas cláusulas WHERE.

  • Cláusulas WHERE suportam as subconsultas EXISTS, ANY / ALL e IN. Essas subconsultas podem fazer referência a consultas externas (correlacionadas) ou não (não correlacionadas).

Observe que pode haver outros tipos válidos de subconsultas não incluídos nesta lista.

Para evitar erros, o SnowConvert identifica padrões comuns de subconsultas que podem causar problemas de compilação no Snowflake. Quando esse padrão é detectado, um Early Warning Indicator (EWI) é gerado para alertar os usuários sobre possíveis erros de compilação.

Exemplo de código

Código de entrada:

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

Código de saída:

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

Recomendações

  • Verifique se a subconsulta é executada com êxito no Snowflake. Se isso acontecer, você pode ignorar esta mensagem EWI.

  • Analise a seção «Complex Patterns» em seu relatório de avaliação. Esta seção lista os padrões que normalmente causam problemas de subconsulta e onde eles ocorrem. Use essas informações para entender por que determinadas subconsultas foram marcadas como inválidas.

  • Para obter assistência adicional, entre em contato conosco pelo e-mail snowconvert-support@snowflake.com

SSC-EWI-0068

Esse Early Warning Indicator (EWI) foi descontinuado. Consulte a documentação SSC-FDM-0029 para obter informações atualizadas.

As funções definidas pelo usuário do Snowflake têm recursos diferentes em comparação com o Oracle ou o SQL Server. Ao migrar, essas funções são convertidas em procedimentos armazenados do Snowflake para manter a mesma funcionalidade. Essa conversão mudará a forma como você os utiliza em suas consultas.

Exemplo de código

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

Recomendações

  • Divida consultas complexas em partes menores e logicamente equivalentes.

  • Reestruture o código-fonte para alinhar-se à abordagem das funções definidas pelo usuário do Snowflake (UDF).

  • Para obter assistência adicional, entre em contato conosco pelo e-mail snowconvert-support@snowflake.com

SSC-EWI-0028

Gravidade

Medium

Descrição

Esse erro ocorre quando você tenta usar um tipo de dados que não é compatível com o Snowflake.

Exemplo

Código de entrada (Oracle):

CREATE TABLE MYTABLE
(
    COL1 SYS.ANYDATASET
);
Copy

Código de saída:

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

Recomendações

SSC-EWI-0008

Gravidade

Medium

Descrição

Esse aviso aparece quando uma cláusula collate é usada como uma opção de coluna. Embora o Snowflake ofereça suporte ao agrupamento, o comportamento pode ser diferente do banco de dados de origem. Para garantir a compatibilidade, consulte os especificadores de agrupamento compatíveis na documentação do agrupamento.

Exemplo de código

Código de entrada:

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

Código de saída:

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

Recomendações

SSC-EWI-0049

O recurso EWI foi descontinuado. Para obter informações atualizadas, consulte a documentação SSC-FDM-0023.

Gravidade

Medium

Descrição

O SnowConvert converte as tabelas Global Temporary em comandos Create Table padrão. Observe que quaisquer referências a essas tabelas transformadas podem não funcionar como originalmente planejado.

Exemplo de código

Entrada

create global temporary table t1
    (col1 varchar);
create view view1 as
    select col1 from t1;
Copy

Saída

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

Recomendações

SSC-EWI-0109

Gravidade

Medium

Descrição

A mensagem aparece quando a sintaxe do Alter Table em seu código não é compatível com os requisitos de sintaxe do Snowflake.

Exemplo de código:

Código de entrada:

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

Código de saída:

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

Recomendações

SSC-EWI-0009

Gravidade

Low

Descrição

Atualmente, o Snowflake é compatível apenas com expressões regulares básicas que seguem a sintaxe da Expressão regular básica POSIX. Os recursos avançados de expressão regular não estão disponíveis.

Esse aviso aparece sempre que uma chamada de função para REGEX_SUBSTR, REGEX_REPLACE ou REGEX_INSTR é convertida em Snowflake. Ele alerta os usuários de que determinados recursos de expressão regular podem não ser compatíveis com o Snowflake. Os recursos importantes sem suporte incluem lookahead, lookbehind e non-capturing groups.

Exemplo de código

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

Recomendações

  • Revise cada padrão de expressão regular para identificar se são necessárias alterações manuais. Para obter mais detalhes sobre os recursos de regex do Snowflake e opções alternativas, veja here.

  • Para obter assistência adicional, entre em contato conosco pelo e-mail snowconvert-support@snowflake.com

SSC-EWI-0031

Partes do código de saída foram removidas para tornar o exemplo mais claro e fácil de seguir.

Severidade

Medium

Descrição

Esse aviso indica que uma _ função interna _ específica do Teradata, Oracle ou SQL Server não pode ser convertida porque não é compatível com a plataforma de destino.

Código de exemplo

Código de entrada (Oracle):

SELECT VALUE(ST) FROM SampleTable ST;
Copy

Código de saída:

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

Recomendações

SSC-EWI-0005

Gravidade

Crítico

Descrição

Esse erro ocorre quando o código-fonte não pode ser convertido devido a um erro de transformação inesperado, impedindo a geração do arquivo de código de saída.

Recomendações

  • Analise o arquivo de registro de erros para obter informações detalhadas sobre o problema.

  • Para obter assistência adicional, entre em contato com nossa equipe de suporte pelo e-mail snowconvert-support@snowflake.com

SSC-EWI-0054

Partes do código de saída foram removidas para tornar o exemplo mais claro e fácil de seguir.

Gravidade

Low

Descrição

Esse erro ocorre quando uma subconsulta correlacionada é detectada dentro de uma condição OR em um comando OUTER JOIN (Left, Right ou Full). Essa situação pode levar a resultados de consulta inconsistentes ou disparar uma mensagem de erro.

Erro de compilação SQL: A consulta contém um tipo de subconsulta que não é suportado e não pode ser processada.

O Snowflake documentou essas limitações de subconsulta em sua documentação oficial. Detalhes adicionais sobre essas limitações podem ser encontrados nos fóruns da comunidade Snowflake.

Exemplo de código

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

Código de saída:

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

Recomendações

  • Verifique se o código convertido é compilado sem erros.

  • Certifique-se de que o código convertido funcione exatamente como o código original.

  • Para obter assistência adicional, entre em contato conosco pelo e-mail snowconvert-support@snowflake.com

SSC-EWI-0015

Partes do código foram omitidas para manter o exemplo claro e conciso.

Gravidade

Medium

Descrição

Esta seção explica os possíveis problemas que podem ocorrer ao usar as cláusulas PIVOT e UNPIVOT. A tabela abaixo mostra os cenários que não são suportados.

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 e UNPIVOT só podem ser realizadas em uma única coluna de cada vez.

Exemplo de código

Código de entrada:

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

Código de saída:

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

Ao usar as cláusulas UNPIVOT no Snowflake, não há suporte para aliases de coluna. Para garantir a compatibilidade, o SnowConvert remove automaticamente todos os aliases de funções ou colunas para criar uma consulta válida. A ferramenta verifica se a remoção desses aliases não afeta a funcionalidade da consulta original.

Operações PIVOT no SnowConvert para Teradata exigem duas condições específicas para que os aliases de coluna funcionem corretamente:

  1. Toda expressão na cláusula IN deve ter um alias atribuído

  2. O SnowConvert deve saber quais colunas serão criadas. Essas informações podem vir de qualquer um dos dois:

    • Uma definição de tabela fornecida

    • Uma subconsulta que lista explicitamente as colunas como entrada para a cláusula

Exemplo de código

Código de entrada:

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

Código de saída:

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

Cláusulas PIVOT não são compatíveis com várias funções. No entanto, muitas vezes você pode reescrever essas consultas usando instruções CASE. Para obter mais detalhes e exemplos, consulte a documentação do Teradata: https://docs.teradata.com/r/756LNiPSFdY~4JcCCcR5Cw/L0kKSOrOeu_68mcW3o8ilw

Exemplo de código

Código de entrada:

SELECT *
FROM STAR1 PIVOT(SUM(COL1), SUM(COL2) FOR YR IN ('Y1', 'Y2', 'Y3'))TMP;
Copy

Código de saída:

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

A cláusula PIVOT no Teradata inclui uma instrução WITH opcional, que não é compatível com a implementação PIVOT do Snowflake.

Exemplo de código

Código de entrada:

SELECT *
FROM STAR1 PIVOT(SUM(COL1) FOR YR IN ('Y1', 'Y2', 'Y3') WITH SUM(*) AS withalias)TMP;
Copy

Código de saída:

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

A saída XML das operações do PIVOT não é compatível com o Snowflake.

Exemplo de código

Código de entrada:

SELECT * FROM   (SELECT product_code, quantity FROM pivot_test)
PIVOT XML (SUM(quantity)
FOR (product_code) IN ('A','B','C'));
Copy

Código de saída:

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

O Snowpark Migration Accelerator não oferece suporte ao uso de subconsultas nas cláusulas IN.

Exemplo de código

Código de entrada:

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

Código de saída:

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

Esse erro ocorre quando a palavra-chave ANY é usada em uma cláusula IN. Atualmente, essa combinação não é compatível com o sistema.

Exemplo de código

Código de entrada:

SELECT * FROM (SELECT product_code, quantity FROM pivot_test)
PIVOT (SUM(quantity)
FOR product_code IN (ANY, ANY, ANY));
Copy

Código de saída:

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

Cláusulas UNPIVOT no Snowflake não são compatíveis com as opções INCLUDE NULLS ou EXCLUDE NULLS.

Exemplo de código

Código de entrada:

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

Código de saída:

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

Recomendações

  • Se possível, reescreva a consulta. Caso contrário, você não precisa tomar nenhuma medida adicional.

  • Para obter suporte adicional, entre em contato conosco pelo e-mail snowconvert-support@snowflake.com

SSC-EWI-0021

Gravidade

Medium

Descrição

Esse erro ocorre quando seu código-fonte contém um nó ou instrução que não é compatível com a funcionalidade do Snowflake.

Exemplo de código

Código de entrada:

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

Código de saída:

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

Recomendações

  • Esse erro ocorre quando não há funcionalidade equivalente do Snowflake para o código-fonte que está sendo convertido.

  • Para obter assistência adicional, entre em contato conosco pelo e-mail snowconvert-support@snowflake.com

SSC-EWI-0110

Gravidade

Low

Descrição

Quando o SnowConvert encontra dependências ausentes, ele adiciona uma mensagem EWI (Error, Warning, Information) para indicar que a transformação do código não pode ser concluída. Embora o SnowConvert normalmente crie um novo código analisando a estrutura do código-fonte original por meio de árvores de sintaxe abstratas, ele não poderá concluir a transformação se faltarem dependências essenciais em seu modelo semântico.

Exemplo de código

Código de entrada:

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

Código de saída:

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

Recomendações

  • Adicione quaisquer dependências necessárias que não estejam presentes em seu código.

  • Para obter assistência adicional, entre em contato conosco pelo e-mail snowconvert-support@snowflake.com

SSC-EWI-0001

Partes do código foram removidas para tornar o exemplo mais claro e fácil de entender.

Gravidade

Crítico

Descrição

Esse erro aparece quando o sistema não consegue ler e processar corretamente o código-fonte durante a conversão. Isso pode ocorrer por dois motivos:

  1. O código-fonte contém erros de sintaxe

  2. O conversor ainda não reconhece determinadas instruções de código ou sintaxe

Exemplo de código

Os exemplos a seguir mostram vários cenários de erro de análise com sintaxe incorreta na entrada. Cada cenário exibe uma mensagem de erro diferente que pode ajudar você a identificar e corrigir o problema. Para obter mais detalhes, consulte a seção «Conteúdo da mensagem» abaixo.

Código de entrada:

CRATE;

CREATE TABLE someTable(col1 INTEGER, !);

CREATE TABRE badTable(col1 INTEGER);

CREATE PROCEDURE proc1()
BEGIN
    CREATE TABLE badEmbeddedTable(col1 INTEGER);
END;
Copy

Código de saída:

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

Conteúdo da mensagem

  1. Posição inicial: Mostra onde o código não reconhecido começa, incluindo o número da linha, o número da coluna e o texto real. Qualquer código não reconhecido a partir desse ponto será comentado até que o analisador encontre um código válido.

  2. Gramática esperada: Indica o tipo de estrutura de código que o analisador estava procurando. Compare isso com o código comentado para verificar se eles correspondem.

  3. Last Valid Token (OPTIONAL): Mostra o último trecho de código que foi reconhecido com sucesso. Se estiver presente, revise o código a seguir para garantir que esteja sintaticamente correto.

  4. Failed Token (OPTIONAL): Aparece apenas quando «Last Valid Token» está presente. Identifica o ponto exato em que o código se tornou inválido ou irreconhecível. Verifique se esse elemento de código é permitido nesse local.

Descontinuado e não mais suportado Conteúdo da mensagem

Os itens a seguir não estão mais em uso e são mantidos apenas para referência histórica.

  1. Código de recuperação (DEPRECATED): Esse código de erro ajuda a identificar como o mecanismo de recuperação do analisador foi acionado. Você pode incluir esse código ao solicitar suporte para atualizações de analisadores para ajudar na solução de problemas.

Recomendações

  • Verifique se seu código-fonte segue as regras de sintaxe corretas.

  • Use as mensagens de erro para identificar e resolver quaisquer problemas.

  • Se você encontrar uma sintaxe não compatível, modifique-a manualmente para usar os padrões de sintaxe compatíveis.

  • Para obter assistência adicional, entre em contato conosco pelo e-mail snowconvert-support@snowflake.com

SSC-EWI-0035

Partes do código foram removidas para tornar o exemplo mais claro e fácil de entender.

Gravidade

Low

Descrição

A restrição _ CHECK _ não é compatível com o Snowflake, mas essa limitação não afeta a funcionalidade do seu banco de dados.

Exemplo de código

Código de entrada Oracle:

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

Código de saída:

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

Código de entrada Teradata:

CREATE TABLE TABLE1,
    NO FALLBACK,
    NO BEFORE JOURNAL,
    NO AFTER JOURNAL
(
    COL0 BYTEINT,
    CONSTRAINT constraint_name CHECK (COL1 < COL2)
)
Copy

Código de saída:

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

Código de entrada SqlServer

ALTER TABLE table_name2
ADD column_name VARCHAR(255)
CONSTRAINT constraint_name
CHECK NOT FOR REPLICATION (column_name > 1);
Copy

Código de saída:

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

Recomendações

SSC-EWI-0064

Gravidade

High

Descrição

Esse erro ocorre quando um Tipo Definido pelo Usuário (UDT) é referenciado em uma instrução da Linguagem de Manipulação de Dados (DML), mas o UDT não foi definido anteriormente no banco de dados. Isso geralmente acontece quando uma coluna da tabela é declarada com um tipo personalizado que não existe no sistema.

Esse erro não deve ser confundido com SSC-FDM-0015, que ocorre quando o objeto é referenciado em uma consulta DDL.

Exemplo de código

Código de entrada (Oracle):

--Type was never defined
--CREATE TYPE type1;

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

SELECT
column1
FROM table1;
Copy

Código de saída:

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

Recomendações

  • Verifique se o tipo de dados mencionado em seu código foi definido corretamente no código-fonte.

  • Para obter assistência adicional, entre em contato conosco pelo e-mail snowconvert-support@snowflake.com

SSC-EWI-0025

A External Web Interface (EWI) é gerada exclusivamente ao converter procedimentos armazenados para JavaScript. No entanto, esse recurso não é mais recomendado, pois o Snowflake Scripting é agora a linguagem preferida para procedimentos armazenados.

Partes do código de saída foram removidas para tornar o exemplo mais claro e fácil de seguir.

Gravidade

Low

Descrição

As consultas que contêm variáveis de tempo podem precisar ser modificadas ao vincular essas variáveis.

Exemplo de código

Código de entrada:

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

Código de saída:

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

Recomendações

SSC-EWI-0011

Gravidade

High

Descrição

Esse erro ocorre quando uma instrução no código-fonte termina inesperadamente e o sistema não consegue processá-la corretamente.

Recomendações

  • Verifique se o código-fonte está completo e se todas as instruções estão terminadas corretamente.

  • Para obter assistência adicional, entre em contato conosco pelo e-mail snowconvert-support@snowflake.com

SSC-EWI-0040

Partes do código de saída foram removidas para tornar o exemplo mais claro e fácil de entender.

Gravidade

Low

Descrição

Esse aviso aparece quando você usa uma instrução SQL que não é compatível com o Snowflake.

Exemplo de código

O exemplo a seguir mostra uma consulta SQL Server SELECT que usa a cláusula PERCENT. Esse recurso não está disponível no Snowflake.

Código de entrada (SQL Server):

SELECT TOP 1 PERCENT * FROM SampleTable;
Copy

Código-fonte:

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

Recomendações

  • Avalie se a funcionalidade da instrução original é necessária para sua implementação do Snowflake.

  • Para obter assistência adicional, entre em contato conosco pelo e-mail snowconvert-support@snowflake.com

SSC-EWI-0034

Partes do código de saída foram removidas para tornar o exemplo mais claro e fácil de seguir.

Gravidade

Low

Descrição

Esse aviso aparece quando você tenta usar uma função CAST com uma coluna cujo formato foi removido.

Exemplo de código

Código de entrada (Teradata):

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

Código de saída:

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

Recomendações

SSC-EWI-0086

O recurso EWI foi descontinuado. Para obter informações atualizadas, consulte a documentação SSC-FDM-0030.

Gravidade

Low

Descrição

O identificador contém caracteres que não são compatíveis com o idioma de saída. Esses caracteres foram substituídos por seus códigos correspondentes em UTF-8.

Exemplo de código

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

Código de saída:

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

Recomendações

SSC-EWI-0010

Gravidade

Crítico

Descrição

Esse erro ocorre quando o sistema não consegue encontrar uma regra de transformação correspondente para uma instrução de procedimento específica.

Recomendações

  • Verifique se a instrução do procedimento está formatada corretamente.

  • Para obter assistência adicional, entre em contato com nossa equipe de suporte pelo e-mail snowconvert-support@snowflake.com

SSC-EWI-0041

Este EWI foi descontinuado. Para obter mais informações, consulte SSC-OOS-0001.

Descrição

Esse erro ocorre quando o arquivo de código-fonte usa um formato de codificação de caracteres que a ferramenta não consegue reconhecer. A codificação de caracteres é um método de conversão de caracteres de texto em valores numéricos que os computadores podem processar. Quando a ferramenta de conversão encontra caracteres que não consegue interpretar, ela gera esse erro.

Recomendações

  • Certifique-se de que todos os arquivos na pasta de entrada usem a mesma codificação de caracteres para evitar erros relacionados à codificação.

  • Escolha a codificação correta:

    • Ajustando as configurações de conversão ou

    • Usando o parâmetro –encoding com a CLI

  • Para identificar a codificação correta, você pode:

  • Para obter assistência adicional, entre em contato conosco pelo e-mail snowconvert-support@snowflake.com

SSC-EWI-0101

Gravidade

Low

Descrição

O Snowflake não oferece suporte a nomes de rótulos de transações, pois não são permitidas transações aninhadas, o que torna desnecessário identificar transações específicas nas instruções COMMIT ou ROLLBACK.

Exemplo de código

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

Código de saída:

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

Recomendações

SSC-EWI-0030

Partes do código de saída foram removidas para tornar o exemplo mais claro e fácil de seguir.

Gravidade

Moderado

Descrição

Esse erro indica que a instrução contém SQL dinâmico, que é um código SQL construído como texto usando funções de manipulação de cadeia de caracteres fornecidas pelo mecanismo de banco de dados. Diferentes linguagens de origem têm seus próprios métodos para executar instruções SQL dinâmicas.

Esse padrão é complexo porque envolve o código SQL que é gerado e executado durante o tempo de execução, o que dificulta o rastreamento e a depuração de problemas. Embora o SnowConvert, por ser um analisador de código estático, não possa analisar totalmente esse SQL dinâmico, essa mensagem de erro ajuda a identificar possíveis problemas.

Exemplo de código

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

Problemas no SQL dinâmico

Ao migrar o código SQL dinâmico, é importante observar que o SnowConvert não detecta nem relata problemas nas instruções SQL dinâmicas. Isso se aplica tanto ao código de saída convertido quanto aos relatórios de avaliação, mesmo nos casos em que a documentação ou as especificações de conversão indiquem que um problema deve ser sinalizado. Por exemplo, essa limitação pode ser observada ao migrar o código 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

Ao comparar as duas abordagens, tanto a consulta quanto a atribuição de variáveis dentro do procedimento terão conversões idênticas. Entretanto, ao usar o SQL dinâmico, os problemas de conversão não serão visíveis no código de saída nem nos relatórios de avaliação.

Recomendações

  • Ative o rastreamento de instruções para monitorar e validar as instruções SQL geradas dinamicamente durante a solução de problemas.

  • Para obter assistência adicional, entre em contato conosco pelo e-mail snowconvert-support@snowflake.com

SSC-EWI-0092

Obsoleto

Gravidade

Low

Descrição

As exibições materializadas do Snowflake têm limitações específicas que estão documentadas na documentação do Snowflake. Atualmente, o SnowConvert converte todas as exibições materializadas em exibições comuns, removendo todas as cláusulas adicionais. Em versões futuras, o SnowConvert oferecerá suporte à conversão de exibições materializadas compatíveis em seu equivalente no Snowflake.

Exemplo de código

Código de entrada:

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

Código de saída:

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

Recomendações

SSC-EWI-0004

Gravidade

Crítico

Descrição

Esse problema ocorre quando há um erro durante a execução de uma regra de conversão para um nó SCRIPT(bteq…) específico no código-fonte.

Recomendações

SSC-EWI-0045

Gravidade

Medium

Descrição

Ao converter o código para o Snowflake, você pode encontrar nomes de colunas que são válidos no banco de dados de origem, mas que entram em conflito com as palavras-chave reservadas do Snowflake. Isso acontece porque o Snowflake tem um conjunto específico de palavras que são reservadas para uso do sistema e não podem ser usadas como nomes de colunas sem formatação especial. Para obter uma lista completa dessas palavras-chave, consulte a documentação do Snowflake sobre palavras-chave reservadas e limitadas.

Exemplo de código

Entrada

CREATE TABLE T1
(
    LOCALTIME VARCHAR,
    CURRENT_USER VARCHAR
);
Copy

Saída

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

Recomendações

  • Revise e renomeie todas as colunas que tenham nomes não compatíveis com as convenções de nomenclatura do Snowflake.

  • Para obter assistência adicional, entre em contato com nossa equipe de suporte pelo e-mail snowconvert-support@snowflake.com

SSC-EWI-0014

Gravidade

Crítico

Descrição

Esse erro ocorre quando o sistema não consegue gerar o corpo necessário para uma instrução de procedimento armazenado.

Recomendações

SSC-EWI-0020

Gravidade

Low

Resumo

O SnowConvert inclui várias funções definidas pelo usuário (UDFs) que ajudam a replicar comportamentos de linguagens de origem não suportadas nativamente pelo Snowflake. Veja a seguir suas funções e descrições.

UDFs (Funções definidas pelo usuário) estão localizadas na pasta «UDF Helpers», que é criada automaticamente no diretório de saída especificado após a conclusão do processo de migração.

Recomendações

  • Verifique se a pasta UDF Helpers foi criada e contém os arquivos esperados.

  • Para obter assistência adicional, entre em contato com nossa equipe de suporte pelo e-mail snowconvert-support@snowflake.com