SnowConvert AI – Diferenças funcionais gerais

SSC-FDM-0001

As exibições que selecionam todas as colunas de uma única tabela não são obrigatórias no Snowflake.

Nota

Algumas partes do código de saída foram omitidas por motivos de clareza.

Descrição

As exibições que selecionam apenas todas as colunas de uma única tabela e não têm cláusulas de filtragem não são obrigatórias no Snowflake e podem afetar o desempenho.

Exemplo de código

Código de entrada (Oracle):
 CREATE OR REPLACE VIEW simpleView1
AS
SELECT
*
FROM
simpleTable;

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

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

Práticas recomendadas

SSC-FDM-0002

Subconsultas correlacionadas podem apresentar diferenças funcionais.

Descrição

Esta mensagem é exibida quando uma Subconsulta correlacionada (subconsulta que se refere a uma coluna da consulta externa) é encontrada. Esse tipo de subconsulta pode, em alguns casos, apresentar algumas diferenças funcionais no Snowflake (Trabalho com subconsultas).

Exemplo de código

Código de entrada:
 CREATE TABLE schema1.table1(column1 NVARCHAR(50), column2 NVARCHAR(50));
CREATE TABLE schemaA.tableA(columnA NVARCHAR(50), columnB NVARCHAR(50));

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

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

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

Práticas recomendadas

SSC-FDM-0003

Inconsistência na taxa de conversão.

Descrição

Esta mensagem é exibida quando uma inconsistência na taxa de conversão é encontrada no campo de avaliação especificado. Essas situações são resolvidas automaticamente pelo SnowConvert AI; portanto, este é apenas um aviso informativo.

Nota

Esse aviso informativo será visível apenas nos documentos de avaliação e não no código de saída.

Práticas recomendadas

  • Apesar da capacidade do SnowConvert AI de corrigir o problema automaticamente, você ainda pode notificar a equipe de suporte do SnowConvert AI enviando um e-mail para snowconvert-support@snowflake.com e especificando o problema.

SSC-FDM-0004

Tabela externa convertida em tabela regular

Descrição

Este aviso é adicionado às cláusulas relacionadas ao tratamento externo, pois no Snowflake o armazenamento de dados não é uma preocupação e não precisa de tabelas externas. Em vez disso, todos os dados devem ser gerenciados dentro do armazenamento de dados do Snowflake. Para obter mais informações sobre este assunto, consulte aqui as considerações do Snowflake sobre armazenamento de dados.

Exemplo de código

Código de entrada:
 CREATE EXTERNAL TABLE ext_csv_file (
    id INT,
    name TEXT,
    age INT,
    city TEXT
)
LOCATION (
    'gpfdist://192.168.1.100:8080/data/my_data.csv'
)
FORMAT 'CSV' (DELIMITER ',' HEADER);
Copy
Código gerado:
 --** SSC-FDM-0004 - EXTERNAL TABLE TRANSLATED TO REGULAR TABLE **
CREATE TABLE ext_csv_file (
       id INT,
       name TEXT,
       age INT,
       city TEXT
   )
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "greenplum",  "convertedOn": "07/09/2025",  "domain": "no-domain-provided" }}'
;
Copy

Práticas recomendadas

  • Os dados armazenados em arquivos de tabelas externas devem ser movidos de alguma forma para o banco de dados do Snowflake.

  • Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com

SSC-FDM-0005

TIME ZONE não são compatíveis com o tipo de dados Time.

Descrição

O tipo de dados Time no Snowflake não armazena valores de fuso horário.

TIME armazena internamente a hora do relógio de parede, e todas as operações com valores de TIME são realizadas sem levar em consideração o fuso horário. Para obter mais informações, acesse aqui.

Exemplo de código

Código de entrada:
 CREATE TABLE TABLE_TIME_TYPE (
    COLNAME TIME (9) WITH TIME ZONE
);
Copy
Código gerado:
 CREATE OR REPLACE TABLE TABLE_TIME_TYPE (
    COLNAME TIME(9) /*** SSC-FDM-0005 - TIME ZONE NOT SUPPORTED FOR TIME DATA TYPE ***/
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"teradata"}}'
;
Copy

Práticas recomendadas

SSC-FDM-0006

A coluna do tipo Number pode não se comportar da mesma forma no Snowflake.

Descrição

Esta mensagem de diferença funcional aparece quando uma coluna do tipo NUMBER está sendo criada em uma tabela. A razão para isso reside nas diferenças aritméticas ao realizar operações relacionadas às escalas de valores intermediários no Snowflake, o que pode fazer com que algumas operações falhem. Para obter mais informações, consulte a publicação da Snowflake sobre números intermediários no Snowflake e Número fora do intervalo representável.

Para evitar esses problemas aritméticos, você pode executar amostragens de dados para verificar a precisão e as escalas necessárias para essas operações.

Códigos de exemplo

Tabela simples com colunas de números

Código de entrada (Oracle):
 CREATE TABLE table1
(
column1 NUMBER,
column2 NUMBER (20, 4)
);
Copy
Código gerado:
 CREATE OR REPLACE TABLE table1
(
column1 NUMBER(38, 18) /*** SSC-FDM-0006 - NUMBER TYPE COLUMN MAY NOT BEHAVE SIMILARLY IN SNOWFLAKE. ***/,
column2 NUMBER(20, 4) /*** SSC-FDM-0006 - NUMBER TYPE COLUMN MAY NOT BEHAVE SIMILARLY IN SNOWFLAKE. ***/
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
;
Copy

Exemplos de problemas aritméticos

Os exemplos a seguir mostram como os problemas aritméticos podem ocorrer ao usar colunas do tipo Number:

Código Snowflake com erro de divisão:
 CREATE OR REPLACE TABLE number_table( column1 NUMBER(38, 19) );

INSERT INTO number_table VALUES (1);

SELECT column1 / column1 FROM number_table;
Copy
Código Snowflake com erro de multiplicação:
 CREATE OR REPLACE TABLE number_table( column1 NUMBER(38, 20) );

INSERT INTO number_table VALUES (1);

SELECT column1 * column1 FROM number_table;
Copy

Ao executar as instruções SELECT, o Snowflake retornará um erro:

Número fora do intervalo representável: tipo FIXEDSB16{nullable}, valor 1.0000000000000000000

Isso ocorre porque o resultado da operação intermediária excede a capacidade máxima do Snowflake; reduzir as escalas de números em 1 em cada exemplo corrigirá o erro e funcionará normalmente:

Código Snowflake com divisão:
 CREATE OR REPLACE TABLE number_table( column1 NUMBER(38, 18) );

INSERT INTO number_table VALUES (1);

SELECT column1 / column1 FROM number_table;
Copy
Código Snowflake com Multiplicação:
 CREATE OR REPLACE TABLE numbertable( column1 NUMBER(38, 19) );

INSERT INTO number_table VALUES (1);

SELECT column1 * column1 FROM number_table;
Copy

Por esse motivo, o SnowConvert AI define a escala padrão de Numbers como 18, minimizando o número de erros durante a migração.

Práticas recomendadas

  • Verifique se os valores intermediários de suas operações não excedem uma escala de 37, pois esse é o máximo do Snowflake.

  • Execute amostragens de dados em seus dados para garantir que você tenha a precisão e as escalas necessárias antes de executar qualquer operação.

  • Na maioria dos casos, após realizar alguma amostragem de dados ou discutir com a empresa, você pode chegar à conclusão de que a precisão pode ser diferente. Por exemplo, para colunas MONEY, uma precisão típica é NUMBER(20,4). No Snowflake, não é fácil alterar o tipo de dados de uma coluna. Você pode consultar esta postagem em nosso fórum, que fornece algumas orientações sobre como alterar os tipos de dados das suas colunas e preservar seus dados.

  • Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com

SSC-FDM-0007

Elemento com dependências ausentes

Nota

Algumas partes do código de saída foram omitidas por motivos de clareza.

Descrição

Há uma dependência ausente para um objeto. O Snow Convert não conseguiu resolver alguns tipos de dados. Também existe a possibilidade de ocorrer um erro de implantação se a dependência não está no código-fonte.

Exemplo de código

Código de entrada:
 CREATE VIEW VIEW01 AS SELECT * FROM TABLE1;
Copy
Código gerado:
 --** SSC-FDM-0007 - MISSING DEPENDENT OBJECT "TABLE1" **
CREATE OR REPLACE VIEW VIEW01
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"teradata"}}'
AS
--** SSC-FDM-0001 - VIEWS SELECTING ALL COLUMNS FROM A SINGLE TABLE ARE NOT REQUIRED IN SNOWFLAKE AND MAY IMPACT PERFORMANCE. **
SELECT
* FROM
TABLE1;
Copy

Nota

Observe que a definição TABLE1 está ausente.

Práticas recomendadas

  • Certifique-se de que todas as dependências dos objetos estejam no código-fonte.

  • Caso contrário, encontre as referências ao objeto no código e verifique se as operações estão sendo gerenciadas corretamente.

  • Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com

SSC-FDM-0008

On Commit não compatível

Nota

Algumas partes do código de saída foram omitidas por motivos de clareza.

Descrição

As cláusulas ON COMMIT em sua instrução CREATE TABLE foram comentadas. O Snowflake não é compatível com a cláusula ON COMMIT, pois ela é normalmente utilizada para tabelas temporárias em outros dialetos SQL. Se você precisar gerenciar o comportamento específico de transações, considere usar as transações ou tabelas temporárias do Snowflake com instruções TRUNCATE ou DROP explícitas.

Exemplo de código

Código de entrada
CREATE TEMPORARY TABLE TABLE02 (COLNAME VARCHAR(20)) ON COMMIT DELETE ROWS
Copy
Código gerado
CREATE OR REPLACE TEMPORARY TABLE TABLE02 (
COLNAME VARCHAR(20))
----** SSC-FDM-0008 - ON COMMIT (DELETE ROWS) IS NOT SUPPORTED **
--ON COMMIT DELETE ROWS
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "teradata",  "convertedOn": "09/22/2025",  "domain": "no-domain-provided" }}'
;
Copy

SSC-FDM-0009

A funcionalidade GLOBAL TEMPORARY TABLE não é compatível.

Descrição

Tabelas temporárias globais são consideradas um padrão complexo, devido ao fato de poderem vir em diversas variações, conforme indicado na documentação do Snowflake.

Exemplo de código

Código de entrada
 CREATE OR REPLACE GLOBAL TEMPORARY TABLE GLOBAL_TEMP_TABLE
(
    col3 INTEGER,
    col4 VARCHAR(50)
);
Copy
Código gerado
 --** SSC-FDM-0009 - GLOBAL TEMPORARY TABLE FUNCTIONALITY NOT SUPPORTED. **
CREATE OR REPLACE TABLE GLOBAL_TEMP_TABLE
    (
        col3 INTEGER,
        col4 VARCHAR(50)
    )
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
;
Copy

Práticas recomendadas

SSC-FDM-0010

Tipo alterado para Date

Descrição

Esta mensagem é exibida quando o SnowConvert AI encontra um DEFAULT SYSDATE e o tipo de dados NOT é um tipo de dados DATE ou TIMESTAMP. Nesse caso, o tipo de dados é alterado para DATE.

Exemplo de código

Código de entrada
 CREATE TABLE "SYSDATE_DEFAULT_TEST_TABLE_1"( 
 "COLUMN1" VARCHAR2(30 BYTE) DEFAULT SYSDATE
);
Copy
Código gerado
 CREATE OR REPLACE TABLE "SYSDATE_DEFAULT_TEST_TABLE_1" (
  "COLUMN1" TIMESTAMP DEFAULT CURRENT_TIMESTAMP() /*** SSC-FDM-0010 - CONVERTED FROM VARCHAR2 TO DATE FOR CURRENT_DATE DEFAULT ***/
 )
 COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
 ;
Copy

Práticas recomendadas

SSC-FDM-0011

O nome da coluna é uma palavra-chave reservada do Snowflake.

Nota

Este FDM está obsoleto. Consulte a documentação SSC-EWI-0045.

Descrição

Nomes de colunas válidos para a linguagem de origem, mas que são palavras-chave reservadas no Snowflake.

Exemplo de código

Código de entrada (Oracle):
 CREATE TABLE T1
(
    LOCALTIME VARCHAR,
    CURRENT_USER VARCHAR
);
Copy
Código gerado:
 CREATE OR REPLACE TABLE T1
    (
    --** SSC-FDM-0011 - COLUMN NAME 'LOCALTIME' IS A SNOWFLAKE RESERVED KEYWORD **
    "LOCALTIME" VARCHAR,
    --** SSC-FDM-0011 - COLUMN NAME 'CURRENT_USER' IS A SNOWFLAKE RESERVED KEYWORD **
    "CURRENT_USER" VARCHAR
    )
    COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
    ;
Copy

Práticas recomendadas

  • Considere renomear as colunas que usam nomes não compatíveis com o Snowflake.

  • Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com

SSC-FDM-0012

O nome da restrição em algumas restrições não é compatível.

Descrição

Esta mensagem é adicionada quando uma restrição é do tipo Null, Not Null ou default e foi definida com um nome. O Snowflake não é compatível com o nome nessas restrições. Para isso, o SnowConvert AI vai removê-lo e adicionar o comentário.

Exemplo de código

Código de entrada
 CREATE TABLE TABLE1 ( 
COL1 VARCHAR (10) CONSTRAINT constraintName DEFAULT ('0') NOT NULL 
);
Copy
Código gerado
 CREATE OR REPLACE TABLE TABLE1 (
COL1 VARCHAR(10) DEFAULT ('0') /*** SSC-FDM-0012 - CONSTRAINT NAME 'constraintName' IN DEFAULT EXPRESSION CONSTRAINT IS NOT SUPPORTED IN SNOWFLAKE ***/ NOT NULL
)
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "transact",  "convertedOn": "07/02/2025",  "domain": "no-domain-provided" }}'
;
Copy

Práticas recomendadas

SSC-FDM-0013

A expressão de fuso horário não pôde ser mapeada.

Descrição

Esta mensagem FMD é adicionada para indicar cenários em que o valor real de uma expressão de fuso horário não pode ser determinado e, portanto, os resultados traduzidos podem ser diferentes. Quando o valor do fuso horário utilizado é uma cadeia de caracteres literal, o SnowConvert AI pode recebê-lo e mapeá-lo para o valor de fuso horário correspondente no Snowflake. No entanto, quando esse valor é especificado por uma expressão, o SnowConvert AI não consegue obter o valor do fuso horário que será utilizado no tempo de execução e, portanto, não consegue mapear esse valor para o seu equivalente no Snowflake.

Exemplo de código

Código de entrada (Oracle)
 SELECT TIMESTAMP '1998-12-25 09:26:50.12' AT TIME ZONE SESSIONTIMEZONE FROM DUAL;
SELECT TIMESTAMP '1998-12-25 09:26:50.12' AT TIME ZONE Expression FROM DUAL;
Copy
Código gerado
 SELECT
--** SSC-FDM-0013 - TIMEZONE EXPRESSION COULD NOT BE MAPPED, RESULTS MAY BE DIFFERENT **
TO_TIMESTAMP_LTZ( TIMESTAMP '1998-12-25 09:26:50.12')
FROM DUAL;

SELECT
--** SSC-FDM-0013 - TIMEZONE EXPRESSION COULD NOT BE MAPPED, RESULTS MAY BE DIFFERENT **
CONVERT_TIMEZONE(Expression, TIMESTAMP '1998-12-25 09:26:50.12')
FROM DUAL;
Copy
Código de entrada (Teradata)
 select TIMESTAMP '1998-12-25 09:26:50.12' AT TIME ZONE SESSIONTIMEZONE;
select current_timestamp at time zone CONCAT(' America ', ' Pacific'); 
select current_timestamp at time zone (SELECT COL1 FROM TABLE1 WHERE COL2 = 2);
Copy
Código gerado
 SELECT
CONVERT_TIMEZONE(SESSIONTIMEZONE, TIMESTAMP '1998-12-25 09:26:50.12') /*** SSC-FDM-0013 - TIMEZONE EXPRESSION COULD NOT BE MAPPED, RESULTS MAY BE DIFFERENT ***/;

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

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

Nota

Compatibilidade de fuso horário no Oracle

A maioria das expressões de nomes de fuso horário no Oracle são compatíveis diretamente no Snowflake; nesse caso, a migração será executada sem problemas. Além disso, aqui está uma lista das expressões que não são compatíveis com o Snowflake no momento e, portanto, incluirão a mensagem de diferença funcional.

  • Africa/Doula

  • Asia/Ulaanbaator

  • Asia/Yetaterinburg

  • Canada/East-Saskatchewan

  • CST

  • PST

  • US/Pacific-New

Práticas recomendadas

SSC-FDM-0014

Instrução Check não compatível.

Nota

Este FDM está obsoleto. Consulte a documentação SSC-EWI-0035.

Descrição

A restrição CHECK não é compatível com o Snowflake, mas não o afeta funcionalmente.

Exemplo de código

Código de entrada Oracle:
 CREATE TABLE "Schema"."BaseTable"(
  "COLUMN1" VARCHAR2(255),
  CHECK ( COLUMN1 IS NOT NULL )
);
Copy
Código gerado:
 CREATE OR REPLACE TABLE "Schema"."BaseTable" (
    "COLUMN1" VARCHAR(255)
--                          ,
--    --** SSC-FDM-0014 - CHECK STATEMENT NOT SUPPORTED **
--    CHECK ( COLUMN1 IS NOT NULL )
  )
  COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"oracle"}}'
  ;
Copy
Código de entrada do Teradata:
 CREATE TABLE TABLE1,
    NO FALLBACK,
    NO BEFORE JOURNAL,
    NO AFTER JOURNAL
(
    COL0 BYTEINT,
    CONSTRAINT constraint_name CHECK (COL1 < COL2)
)
Copy
Código gerado:
 CREATE TABLE TABLE1
(
    COL0 BYTEINT
--                ,
--    --** SSC-FDM-0014 - CHECK STATEMENT NOT SUPPORTED **
--    CONSTRAINT constraint_name CHECK (COL1 < COL2)
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"teradata"}}'
;
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 gerado:
 ALTER TABLE IF EXISTS table_name2
ADD column_name VARCHAR(255)
----** SSC-FDM-0014 - CHECK STATEMENT NOT SUPPORTED **
--CONSTRAINT constraint_name
--CHECK NOT FOR REPLICATION (column_name > 1)
                                           ;
Copy

Práticas recomendadas

SSC-FDM-0015

​Tipo personalizado referenciado na consulta não encontrado.

Descrição

Este erro ocorre quando a definição de um tipo personalizado não foi encontrada ou um tipo de dados interno do Oracle não foi reconhecido pelo SnowConvert.

Exemplo de código

Código de entrada (Oracle):
 --Type was never defined
--CREATE TYPE type1;

CREATE TABLE table1
(
column1 type1
);
Copy
Código gerado:
 --Type was never defined
--CREATE TYPE type1;

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

Práticas recomendadas

  • Verifique se o tipo de dados referenciado foi definido no código de entrada.

  • Consulte a documentação sobre tipos de dados do Snowflake para encontrar um equivalente para o tipo de dados.

  • Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com

SSC-FDM-0016

Constantes não são compatíveis com o Snowflake Scripting. O valor foi transformado em uma variável.

Descrição

O Snowflake Scripting não é compatível com constantes. Portanto, todas as constantes dentro de procedimentos são transformadas em variáveis quando o sinalizador do Snowflake Scripting está ativo.

Exemplo de código

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

Práticas recomendadas

SSC-FDM-0017

A cláusula WITH SYSTEM VERSIONING não é compatível com o Snowflake.

Descrição

A cláusula WITH SYSTEM VERSIONING em ANSI SQL é utilizada para habilitar o controle de versão do sistema para uma tabela, permitindo que você mantenha um histórico das alterações nos dados da tabela ao longo do tempo. Esta cláusula não é compatível com o Snowflake.

Exemplo de código

Código de entrada:
 CREATE TABLE t1 (
    ID INT PRIMARY KEY,
    Name VARCHAR(50),
    SysStartTime TIMESTAMP,
    SysEndTime TIMESTAMP
) WITH SYSTEM VERSIONING;
Copy
Código gerado:
 CREATE TABLE t1 (
    ID INT PRIMARY KEY,
    Name VARCHAR(50),
    SysStartTime TIMESTAMP,
    SysEndTime TIMESTAMP
)
----** SSC-FDM-0017 - WITH SYSTEM VERSIONING CLAUSE IS NOT SUPPORTED BY SNOWFLAKE. **
--WITH SYSTEM VERSIONING
                      ;
Copy

Práticas recomendadas

  • Você pode usar o Time Travel no Snowflake. O Time Travel permite acessar dados históricos (ou seja, dados que foram alterados ou excluídos) em qualquer ponto dentro de um período definido. Ele serve como uma ferramenta poderosa para a realização das seguintes tarefas:

    • Restaurar objetos relacionados a dados (tabelas, esquemas e bancos de dados) que podem ter sido excluídos acidental ou intencionalmente.

    • Duplicar e fazer backup de dados de pontos principais no passado.

    • Analisar o uso e a manipulação de dados durante períodos especificados.

  • Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com

SSC-FDM-0018

A cláusula CHARACTER SET não é compatível com o Snowflake.

Descrição

A opção de coluna CHARACTER SET determina o conjunto permitido de caracteres que podem ser armazenados na coluna; essa cláusula não é compatível com o Snowflake.

Exemplo de código

Código de entrada:
 CREATE TABLE TABLE01(
    COLNAME VARCHAR(20) CHARACTER SET character_specification
);
Copy
Código gerado:
 CREATE TABLE TABLE01 (
    COLNAME VARCHAR(20)
--                        --** SSC-FDM-0018 - CHARACTER SET CLAUSE IS NOT SUPPORTED BY SNOWFLAKE. **
--                        CHARACTER SET character_specification
);
Copy

Práticas recomendadas

SSC-FDM-0019

Não foi possível carregar as informações semânticas.

Descrição

Este aviso informa ao usuário que o SnowConvert AI não conseguiu carregar informações semânticas para um objeto específico. Isso provavelmente ocorre porque, se houver um objeto duplicado com o mesmo nome, o SnowConvert AI não conseguirá carregar as informações semânticas desse objeto e concluir a análise.

Exemplo de código

Código de entrada:
 CREATE TABLE T1
(
    COL1 INTEGER
);


CREATE TABLE T1
(
    COL2 INTEGER
);
Copy
Código gerado:
 CREATE OR REPLACE TABLE T1
(
    COL1 INTEGER
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"teradata"}}'
;

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

Práticas recomendadas

  • Verifique se há objetos duplicados no código de entrada, pois isso pode afetar o carregamento das informações semânticas.

  • Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com

SSC-FDM-0020

Vários conjuntos de resultados são retornados em tabelas temporárias

Descrição

Os procedimentos do Snowflake Scripting permitem que apenas um conjunto de resultados seja retornado por procedimento.

Para replicar o comportamento do Teradata, quando há dois ou mais conjuntos de resultados a serem retornados, eles são armazenados em tabelas temporárias. O procedimento do Snowflake Scripting retornará uma matriz contendo o nome das tabelas temporárias.

Exemplo de código

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

Práticas recomendadas

  • Para obter os conjuntos de resultados, é necessário executar uma consulta SELECT com o nome das tabelas temporárias retornadas pelo procedimento.

  • Sempre que possível, evite procedimentos que retornem vários conjuntos de resultados; em vez disso, torne-os a única responsabilidade por resultados mais diretos.

  • Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com

SSC-FDM-0021

A criação de índices não é compatível

Descrição

Devido a razões arquitetônicas, o Snowflake não é compatível com índices; portanto, o SnowConvert AI comentará todo o código relacionado à criação de índices. O Snowflake automaticamente cria micropartições para cada tabela. Isso ajuda a acelerar o desempenho das operações DML, e o usuário não precisa se preocupar em criar ou gerenciar essas micropartições.

Normalmente, isso é suficiente para conseguir um ótimo desempenho de consulta. No entanto, existem maneiras de melhorar isso criando chaves de clustering de dados. A página oficial do Snowflake fornece mais informações sobre micropartições e agrupamento de dados.

Exemplo de código

Código de entrada (Oracle):
 CREATE INDEX index1
ON table1(column1);
Copy
Código gerado:
 ----** SSC-FDM-0021 - CREATE INDEX IS NOT SUPPORTED BY SNOWFLAKE **
----** SSC-FDM-0007 - MISSING DEPENDENT OBJECT "table1" **
--CREATE INDEX index1
--ON table1(column1)
                  ;
Copy

Práticas recomendadas

  • O clustering de dados pode ser uma maneira de acelerar o desempenho das consultas em tabelas.

  • Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com

SSC-FDM-0022

A unidade de quadro de janela foi alterada para Linhas

Gravidade

Low

Descrição

Este aviso é adicionado quando uma unidade de quadro de janela não compatível é alterada para Linhas, levando a diferenças na saída. Um exemplo disso é a unidade GROUPS, que não é compatível com o Snowflake.

Observe que essa mensagem também é utilizada em casos em que uma unidade de quadro de janela é parcialmente não compatível, levando à sua alteração, como a unidade RANGE.

Exemplo de código

Considere os dados a seguir como um exemplo para ilustrar a explicação.

C_NAME

C_BIRTH_DAY

USA

1

USA

4

Polônia

9

Canadá

10

USA

5

Canadá

12

Costa Rica

3

Polônia

4

USA

2

Costa Rica

7

Costa Rica

10

Oracle:
Código
SELECT
    C_NAME,
    SUM(C_BIRTH_DAY)
    OVER (ORDER BY C_BIRTH_DAY
    RANGE BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING) AS MAX1
FROM WINDOW_TABLE;
Resultado

C_NAME

MAX1

USA

-

USA

1

Costa Rica

3

USA

6

Polônia

6

USA

14

Costa Rica

19

Polônia

26

Canadá

35

Costa Rica

35

Canadá

55

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

C_NAME

MAX1

USA

-

USA

1

Costa Rica

3

USA

6

Polônia

10

USA

14

Costa Rica

19

Polônia

26

Canadá

35

Costa Rica

45

Canadá

55

Práticas recomendadas

  • Verifique se há ordenação determinística das linhas para garantir saídas determinísticas ao executar no Snowflake.

  • Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com

SSC-FDM-0023

Uma tabela temporária global está sendo referenciada.

Gravidade

Medium

Descrição

O SnowConvert AI transforma tabelas temporárias globais em funções de criação de tabela regulares. As referências a estas tabelas podem se comportar de forma diferente do esperado.

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
    --** SSC-FDM-0023 - A Global Temporary Table is being referenced **
    t1;
Copy

Práticas recomendadas

SSC-FDM-0024

A funcionalidade é atualmente incompatível com o Snowflake Scripting

Nota

Este FDM está obsoleto. Consulte a documentação SSC-EWI-0058.

Descrição

Este erro acontece quando uma instrução usada em um procedimento de criação é atualmente incompatível com o 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 gerado:
 CREATE OR REPLACE PROCEDURE PROC01 ()
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
EXECUTE AS CALLER
AS
$$
  DECLARE
    number_variable INTEGER;
  BEGIN
    EXECUTE IMMEDIATE 'SELECT 1 FROM DUAL'
--                                           --** SSC-FDM-0024 - FUNCTIONALITY FOR 'EXECUTE IMMEDIATE RETURNING CLAUSE' IS NOT CURRENTLY SUPPORTED BY SNOWFLAKE SCRIPTING **
--                                           INTO number_variable
                                                               ;
  END;
$$;
Copy

Práticas recomendadas

SSC-FDM-0026

Tipo não compatível com o Snowflake

Nota

Este FDM está obsoleto. Consulte a documentação SSC-EWI-0028.

Descrição

Esta mensagem aparece quando um tipo é incompatível com o Snowflake.

Exemplo

Código de entrada (Oracle):
 CREATE TABLE MYTABLE
(
    COL1 SYS.ANYDATASET
);
Copy
Código gerado:
 CREATE OR REPLACE TABLE MYTABLE
    (
    --** SSC-FDM-0026 - TYPE NOT SUPPORTED BY SNOWFLAKE **
        COL1 SYS.ANYDATASET
    )
    COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"oracle"}}'
    ;
Copy

Práticas recomendadas

SSC-FDM-0027

Próxima instrução removida, não aplicável no SnowFlake.

Nota

Algumas partes do código de saída foram omitidas por motivos de clareza.

Descrição

Esta mensagem aparece quando uma instrução específica não é aplicável no Snowflake. Isso significa que não há equivalente no Snowflake para essa instrução e ela não é mais necessária; por esse motivo, ela é removida do código-fonte. No entanto, o SnowConvert AI mantém a instrução original como parte do comentário no final.

Exemplo de código

Código de entrada:
 .LOGTABLE tduser.Employee_log;  
   .BEGIN MLOAD TABLES Employee_Stg;  
      .LAYOUT Employee;  
      .FIELD in_EmployeeNo * VARCHAR(10);  
      .FIELD in_FirstName * VARCHAR(30); 
      .FIELD in_LastName * VARCHAR(30);  
      .FIELD in_BirthDate * VARCHAR(10); 
      .FIELD in_JoinedDate * VARCHAR(10);  
      .FIELD in_DepartmentNo * VARCHAR(02);

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

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

if __name__ == "__main__":
  main()
Copy

Práticas recomendadas

SSC-FDM-0028

Sem suporte.

Nota

Este FDM está obsoleto. Consulte a documentação SSC-EWI-0021.

Descrição

Esta mensagem aparece quando um nó ou instrução específica do código-fonte não é compatível com o 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 gerado:
 ----** SSC-FDM-0028 - SubavFactoring NOT SUPPORTED IN SNOWFLAKE **
--WITH my_av ANALYTIC VIEW AS
--(USING sales_av HIERARCHIES(time_hier) ADD MEASURES(lag_sales AS (LAG(sales) OVER (HIERARCHY time_hier OFFSET 1 ))))
--SELECT aValue from my_av
                        ;
Copy

Práticas recomendadas

  • Se esse erro ocorrer, é porque não há um equivalente no Snowflake para o nó que está sendo convertido.

  • Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com

SSC-FDM-0029

A função definida pelo usuário foi transformada em um procedimento do Snowflake.

Aviso

Este EWI está obsoleto. Consulte a documentação SSC-EWI-0068.

Gravidade

Low

Descrição

As funções definidas pelo usuário do Snowflake são incompatíveis com os mesmos recursos do Oracle ou SQL Server. Para manter a equivalência funcional, a função é transformada em um procedimento armazenado do Snowflake. Isso afetará seu uso em consultas.

Exemplo de código

SQL Server:
Código de entrada
 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
Código gerado
 --** 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;
$$;
Copy
Oracle:
Código de entrada
 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;
Copy
Código gerado
 --** 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;
$$;
Copy

Práticas recomendadas

  • Separe as consultas internas para manter a mesma lógica.

  • O código-fonte pode precisar ser reestruturado se adequar à abordagem de funções definidas pelo usuário do Snowflake.

  • Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com

SSC-FDM-0030

Substituição de caracteres inválidos para o novo identificador

Descrição

O identificador fornecido contém caracteres inválidos para a linguagem de saída. Esses caracteres foram substituídos por seus códigos 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 gerado:
 CREATE OR REPLACE PROCEDURE PROC1 ()
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"oracle"}}'
EXECUTE AS CALLER
AS
$$
    DECLARE
        "VAR0" INT;
        --** SSC-FDM-0030 - IDENTIFIER '"VAR`/1ͷ"' HAS INVALID CHARACTERS. CHARACTERS WERE REPLACED WITH THEIR UTF-8 CODES **
        VAR_u60_u2F1_uCD_B7 VARCHAR(20);
        --** SSC-FDM-0030 - IDENTIFIER '"o*/o"' HAS INVALID CHARACTERS. CHARACTERS WERE REPLACED WITH THEIR UTF-8 CODES **
        o_u2A_u2Fo FLOAT;
        --** SSC-FDM-0030 - IDENTIFIER '" . "' HAS INVALID CHARACTERS. CHARACTERS WERE REPLACED WITH THEIR UTF-8 CODES **
        _u20_u2E_u20 INT;
        --** SSC-FDM-0030 - IDENTIFIER '". ."' HAS INVALID CHARACTERS. CHARACTERS WERE REPLACED WITH THEIR UTF-8 CODES **
        _u2E_u20_u2E INT;
        "123Name" INT;
        "return" INT;
        yield INT;
        IDENT_HASHTAG_10 INT;
    BEGIN
        NULL;
    END;
$$;
Copy

Práticas recomendadas

SSC-FDM-0031

Parâmetros obrigatórios de tabelas dinâmicas definidos por padrão

Descrição

As exibições materializadas (e os índices de junção, no caso do Teradata) são migradas para as tabelas dinâmicas no Snowflake. As tabelas dinâmicas exigem a configuração de dois parâmetros: TARGET_LAG e WAREHOUSE.

Se esses parâmetros não forem definidos nas opções de configuração, eles serão definidos por padrão durante a conversão.

Leia mais sobre os parâmetros obrigatórios de tabelas dinâmicas aqui.

Exemplo de código

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

Práticas recomendadas

  • Configure os parâmetros obrigatórios da tabela dinâmica de acordo com suas necessidades.

  • Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com

SSC-FDM-0032

O parâmetro não é um valor literal; não foi possível aplicar totalmente a transformação.

Descrição

Para múltiplas transformações, o SnowConvert AI às vezes requer a validação do conteúdo de um parâmetro, o que só é possível se o parâmetro for um valor literal.

Esta mensagem é gerada para alertar o usuário de que o SnowConvert AI não conseguiu recuperar o valor do parâmetro porque ele foi passado por referência, fazendo com que a transformação da função ou instrução não fosse concluída.

Exemplo de código

Código de entrada (Redshift):
 SELECT TO_CHAR(DATE '2001-01-01', 'YYY/MM/DD'),
TO_CHAR(DATE '2001-01-01', f)
FROM (SELECT 'YYY/MM/DD' as f);
Copy
Código gerado:
 SELECT
PUBLIC.YEAR_PART_UDF(DATE '2001-01-01', 3) || TO_CHAR(DATE '2001-01-01', '/MM/DD'),
--** SSC-FDM-0032 - PARAMETER 'format_string' IS NOT A LITERAL VALUE, TRANSFORMATION COULD NOT BE FULLY APPLIED **
TO_CHAR(DATE '2001-01-01', f)
FROM (SELECT 'YYY/MM/DD' as f);
Copy

Práticas recomendadas

SSC-FDM-0033

A cláusula de amostragem se comporta de maneira diferente no Snowflake.

Descrição

Esta mensagem é gerada para mostrar a diferença funcional durante a amostragem de linhas no Snowflake. As diferenças estão relacionadas à quantidade de linhas recuperadas. Quando, no Teradata, há a mesma quantidade de linhas na saída não determinística, isso pode mudar no Snowflake e retornar algumas linhas a mais ou a menos. Isso ocorre porque é um tópico relacionado à probabilidade e é esperado que se comporte dessa maneira no Snowflake.

Se houver a necessidade de recuperar os mesmos valores e a mesma quantidade, uma saída determinística, recomenda-se usar uma semente na consulta do Snowflake.

Exemplo de código

Código de entrada (Teradata):
 SELECT * FROM Employee SAMPLE 2;
SELECT * FROM Employee SAMPLE 0.25;
Copy
Código gerado:
 SELECT
    * FROM
    Employee
--** SSC-FDM-0033 - SAMPLE CLAUSE BEHAVES DIFFERENTLY IN SNOWFLAKE **
SAMPLE(2 ROWS);

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

Práticas recomendadas

  • Tente usar a parte da semente da consulta quando for necessária uma saída determinística.

  • Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com

SSC-FDM-0034

Estrutura convertida para VARIANT. Alguns de seus usos podem ter diferenças funcionais.

Descrição

O Snowflake não oferece suporte nativo ao tipo de dados STRUCT. O SnowConvert AI converte automaticamente STRUCT em VARIANT. Quando utilizado em instruções INSERT, os dados STRUCT serão tratados usando OBJECT_CONSTRUCT. Esteja ciente de que essa conversão pode introduzir diferenças funcionais em alguns casos de uso.

Exemplo de código

Código de entrada:
BigQuery
 CREATE OR REPLACE TABLE test.structTypes
(
  COL1 STRUCT<sc1 INT64>,
  COL2 STRUCT<sc2 STRING(10)>,
  COL3 STRUCT<sc3 STRUCT<sc31 INT64, sc32 INT64>>,
  COL4 STRUCT<sc4 ARRAY<INT64>>,
  COL5 STRUCT<sc5 INT64, sc51 INT64>,
  COL7 STRUCT<sc7 INT64 OPTIONS(description = "A repeated STRING field"), sc71 BOOL>,
  COL8 STRUCT<sc8 INT64 NOT NULL, sc81 BOOL NOT NULL OPTIONS(description = "A repeated STRING field")>
);
Copy
Código gerado:
Snowflake
 CREATE OR REPLACE TABLE test.structTypes
(
  COL1 VARIANT /*** SSC-FDM-0034 - STRUCT<INT64> CONVERTED TO VARIANT. SOME OF ITS USAGES MIGHT HAVE FUNCTIONAL DIFFERENCES. ***/,
    COL2 VARIANT /*** SSC-FDM-0034 - STRUCT<STRING(10)> CONVERTED TO VARIANT. SOME OF ITS USAGES MIGHT HAVE FUNCTIONAL DIFFERENCES. ***/,
    COL3 VARIANT /*** SSC-FDM-0034 - STRUCT<STRUCT<INT64, INT64>> CONVERTED TO VARIANT. SOME OF ITS USAGES MIGHT HAVE FUNCTIONAL DIFFERENCES. ***/,
    COL4 VARIANT /*** SSC-FDM-0034 - STRUCT<ARRAY<INT64>> CONVERTED TO VARIANT. SOME OF ITS USAGES MIGHT HAVE FUNCTIONAL DIFFERENCES. ***/,
    COL5 VARIANT /*** SSC-FDM-0034 - STRUCT<INT64, INT64> CONVERTED TO VARIANT. SOME OF ITS USAGES MIGHT HAVE FUNCTIONAL DIFFERENCES. ***/,
    COL7 VARIANT /*** SSC-FDM-0034 - STRUCT<INT, BOOL> CONVERTED TO VARIANT. SOME OF ITS USAGES MIGHT HAVE FUNCTIONAL DIFFERENCES. ***/,
    COL8 VARIANT /*** SSC-FDM-0034 - STRUCT<INT64, BOOLEAN> CONVERTED TO VARIANT. SOME OF ITS USAGES MIGHT HAVE FUNCTIONAL DIFFERENCES. ***/
  )
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "bigquery",  "convertedOn": "05/30/2025",  "domain": "no-domain-provided" }}';
Copy

Práticas recomendadas

SSC-FDM-0035

A função INFER_SCHEMA requer um caminho de arquivo sem curingas para gerar o modelo de tabela; substitua o espaço reservado FILE_PATH por ela.

Descrição

A função INFER_SCHEMA é utilizada no Snowflake para gerar a definição de colunas de uma tabela com base na estrutura de um arquivo. Ela requer um parâmetro LOCATION que especifica o caminho para um arquivo ou pasta que será utilizado para construir as colunas da tabela. No entanto, esse caminho não é compatível com regex, o que significa que o caractere curinga * não é compatível.

Quando a tabela não tem colunas, o SnowConvert AI verifica todas as URIS para encontrar uma que não use curingas e a usará na função INFER_SCHEMA. Quando nenhuma URI atender a esses critérios, esta FDM e um espaço reservado FILE_PATH serão gerados. O espaço reservado deve ser substituído pelo caminho de um dos arquivos referenciados pela tabela externa para gerar as colunas da tabela.

Exemplo de código

Código de entrada:
BigQuery
 CREATE OR REPLACE EXTERNAL TABLE test.my_external_table_json2
OPTIONS(
  FORMAT='JSON',
  URIS=['gs://sc_external_table_bucket/folder_with_json/*']
);
Copy
Código gerado:
Snowflake
 CREATE OR REPLACE TEMPORARY FILE FORMAT SC_TEST_MY_EXTERNAL_TABLE_JSON2_FORMAT
TYPE = JSON;


CREATE OR REPLACE EXTERNAL TABLE test.my_external_table_json2 USING TEMPLATE (
SELECT
  ARRAY_AGG(OBJECT_CONSTRUCT('COLUMN_NAME', COLUMN_NAME, 'TYPE', TYPE, 'NULLABLE', NULLABLE, 'EXPRESSION', EXPRESSION))
FROM
  --** SSC-FDM-0035 - THE INFER_SCHEMA FUNCTION REQUIRES A FILE PATH WITHOUT WILDCARDS TO GENERATE THE TABLE TEMPLATE, REPLACE THE FILE_PATH PLACEHOLDER WITH IT **
  TABLE(INFER_SCHEMA(LOCATION => '@EXTERNAL_STAGE/FILE_PATH', FILE_FORMAT => 'SC_TEST_MY_EXTERNAL_TABLE_JSON2_FORMAT'))
)
!!!RESOLVE EWI!!! /*** SSC-EWI-0032 - EXTERNAL TABLE REQUIRES AN EXTERNAL STAGE TO ACCESS gs://sc_external_table_bucket, DEFINE AND REPLACE THE EXTERNAL_STAGE PLACEHOLDER ***/!!!
LOCATION = @EXTERNAL_STAGE
AUTO_REFRESH = false
PATTERN = 'folder_with_json/.*'
FILE_FORMAT = (TYPE = JSON);
Copy

Práticas recomendadas

SSC-FDM-0036

O formato de data/numérico transformado pode ter um comportamento diferente no Snowflake.

Descrição

Os formatos numéricos transformados para o Snowflake usam formatos de posição fixa. O formato transformado poderá falhar e gerar uma saída diferente quando houver mais dígitos na parte inteira do número do que posições de dígitos no formato; todos os dígitos são impressos como # para indicar excesso.

Exemplo de código

Código de entrada:
SQL Server
SELECT
 FORMAT(value, '00.00') as formatted, 
 FORMAT(value, '#,##0') as formatSource
 FROM MY_TABLE;
Copy
Código gerado:
Snowflake
SELECT
 TO_CHAR(value, 'FM9999999999900.00') /*** SSC-FDM-0036 - TRANSFORMATION OF '00.00' FORMAT MAY HAVE A DIFFERENT BEHAVIOR IN SNOWFLAKE. ***/ as formatted,
 TO_CHAR(value, 'FM9,999,999,999,990') /*** SSC-FDM-0036 - TRANSFORMATION OF '#,##0' FORMAT MAY HAVE A DIFFERENT BEHAVIOR IN SNOWFLAKE. ***/ as formatSource
 FROM
 MY_TABLE;
Copy
Resultado
#############
Copy

Práticas recomendadas

  • Se o dígito numérico não couber no formato, atualize o formato adicionando mais dígitos com base nos possíveis valores de dados de entrada.

SSC-FDM-0037

A função de estatísticas não é necessária no Snowflake.

Descrição

As estatísticas DROP, COLLECT ou HELP não são necessárias no Snowflake. O Snowflake já coleta estatísticas utilizadas para otimização automática de consultas.

Exemplo de código

Código de entrada:
  HELP STATISTICS TestName;
Copy
Código gerado
  ----** SSC-FDM-0037 - HELP STATISTICS NOT NEEDED. SNOWFLAKE AUTOMATICALLY COLLECTS STATISTICS. **
  --HELP STATISTICS TestName
Copy

Práticas recomendadas

SSC-FDM-0038

O microparticionamento é realizado automaticamente em todas as tabelas Snowflake.

Descrição

Esta mensagem é adicionada à instrução CREATE TABLE quando uma cláusula PARTITION BY está presente. A cláusula PARTITION BY, que controla o particionamento de tabelas em alguns bancos de dados, não é compatível com o Snowflake.

No Snowflake, todas as tabelas são divididas automaticamente em micropartições, que são unidades contíguas de armazenamento que variam de 50 MB a 500 MB de dados não compactados. Essa arquitetura permite a remoção altamente granular de tabelas grandes, que podem consistir em milhões de micropartições.

O Snowflake armazena automaticamente metadados para cada micropartição, incluindo:

  • O intervalo de valores para cada coluna na micropartição.

  • O número de valores distintos.

  • Propriedades adicionais utilizadas para otimização e processamento eficiente de consultas.

As tabelas são particionadas de forma transparente com base na ordem em que os dados são inseridos ou carregados. Para mais detalhes, consulte os benefícios do microparticionamento.

Exemplo de código

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

Práticas recomendadas