SnowConvert AI – Problemas com o Teradata

SSC-EWI-TD0001

Erro de alias de encaminhamento recursivo.

Nota

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

Gravidade

Low

Descrição

Este EWI é exibido sempre que o SnowConvert AI detecta recursão em expressões com alias; portanto, não é possível executar a transformação de alias de encaminhamento necessária para o funcionamento correto dos aliases no ambiente Snowflake.

Um alias recursivo ocorre quando uma expressão com alias contém outro alias, e a segunda expressão com alias contém o primeiro alias. Isso pode não ser tão trivial quanto o exemplo mostra, já que a recursão pode ocorrer mais adiante na linha de forma transitiva.

Exemplo de código

Observação: aliases recursivos não são compatíveis com o Snowflake; porém, algumas instâncias simples são.

Nota

Observe que aliases recursivos não são compatíveis com o Snowflake; porém, algumas instâncias simples são. Confira os exemplos abaixo.

O seguinte código de exemplo funciona no Snowflake após a migração:

Teradata:
 SELECT
    COL1 AS COL2,
    COL2 AS COL1
FROM
    TABLE_EXAMPLE;
Copy
Snowflake Scripting:
 // SnowConvert AI Helpers Code section is omitted.
SELECT
    COL1 AS COL2,
    !!!RESOLVE EWI!!! /*** SSC-EWI-TD0001 - 'COL1' HAS RECURSIVE REFERENCES. FORWARD ALIAS CONVERSION COULD NOT BE COMPLETED ***/!!!
    COL2 AS COL1
FROM
    TABLE_EXAMPLE;
Copy

No entanto, o seguinte código de exemplo não funciona:

Teradata:
 SELECT
    A + B as C,
    COL2 + C AS A,
    COL3 AS B
FROM
    TABLE_EXAMPLE;
Copy
Snowflake Scripting:
 // SnowConvert AI Helpers Code section is omitted.
SELECT
    !!!RESOLVE EWI!!! /*** SSC-EWI-TD0001 - 'A' HAS RECURSIVE REFERENCES. FORWARD ALIAS CONVERSION COULD NOT BE COMPLETED ***/!!!
    COL2 + C AS A,
    COL3 AS B,
    A + B as C
FROM
    TABLE_EXAMPLE;
Copy

Práticas recomendadas

  • Revise seu código e certifique-se de que não haja aliases de encaminhamento recursivos. O EWI mostra o nome da primeira instância de um alias que tem referências recursivas, mas isso não significa que ele seja o único que as tem em seu código.

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

SSC-EWI-TD0002

Tipo de intervalo não compatível.

Este EWI está obsoleto desde a versão SnowConvert AI 28.1.100

Severity

High

Description

Quando o seletor de uma coluna em uma instrução SQL for do tipo INTERVAL, o EWI será adicionado e uma função Stub também será criada. Este é um tipo que não é compatível com o SnowFlake e, portanto, implica em trabalho pendente após a conclusão do SnowConvert AI.

Example Code

Teradata:
 SELECT
     CAST('07:00' AS INTERVAL HOUR(2) TO MINUTE),
     CAST('08:00' AS INTERVAL HOUR(2) TO MINUTE) As Test_Interval;
Copy
Snowflake Scripting:
 SELECT
     !!!RESOLVE EWI!!! /*** SSC-EWI-TD0002 - INTERVAL TYPE NOT SUPPORTED IN SNOWFLAKE ***/!!!
     INTERVAL '07 hour, 00 min',
     !!!RESOLVE EWI!!! /*** SSC-EWI-TD0002 - INTERVAL TYPE NOT SUPPORTED IN SNOWFLAKE ***/!!!
     INTERVAL '08 hour, 00 min' As Test_Interval;
Copy

Best Practices

SSC-EWI-TD0003

Agrupamento não é compatível com funções de remoção de caracteres; adicione o agrupamento original ao resultado da função para preservá-la.

Severity

Low

Description

No Snowflake, as funções de remoção de caracteres (LTRIM, RTRIM, ou TRIM) não são compatíveis com agrupamento, a menos que os caracteres a serem removidos estejam vazios ou sejam espaços em branco.

Se o SnowConvertAI detectar uma função LTRIM, RTRIM ou TRIM LEADING, TRAILING, ou ambas com o cenário mencionado acima, a função COLLATE será gerada automaticamente para criar uma cópia sem agrupamento da coluna de entrada. Este EWI é gerado para indicar que o agrupamento da coluna foi removido antes da função de remoção de caracteres, o que significa que o resultado da função não terá agrupamento e que isso poderá alterar os resultados de comparações posteriores usando o resultado.

Example Code

Teradata:
 CREATE TABLE collateTable (
	col1 VARCHAR(50) CHARACTER SET LATIN NOT CASESPECIFIC
);

SELECT
    TRIM(BOTH '0' FROM col1),
    TRIM(LEADING '  ' FROM col1),
    TRIM(TRAILING '0' FROM col1),
    LTRIM(col1, '0'),
    RTRIM(col1)
FROM
    collateTable;
Copy
Snowflake Scripting:
 CREATE OR REPLACE TABLE collateTable (
	col1 VARCHAR(50)
)
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "teradata",  "convertedOn": "07/14/2025",  "domain": "no-domain-provided" }}'
;

SELECT
	TRIM(COLLATE(col1, ''), '0') !!!RESOLVE EWI!!! /*** SSC-EWI-TD0003 - COLLATION NOT SUPPORTED IN TRIM FUNCTIONS, ADD ORIGINAL COLLATION TO FUNCTION RESULT TO PRESERVE IT ***/!!!,
	LTRIM(col1, '  '),
	RTRIM(COLLATE(col1, ''), '0') !!!RESOLVE EWI!!! /*** SSC-EWI-TD0003 - COLLATION NOT SUPPORTED IN TRIM FUNCTIONS, ADD ORIGINAL COLLATION TO FUNCTION RESULT TO PRESERVE IT ***/!!!,
	LTRIM(COLLATE(col1, ''), '0') !!!RESOLVE EWI!!! /*** SSC-EWI-TD0003 - COLLATION NOT SUPPORTED IN TRIM FUNCTIONS, ADD ORIGINAL COLLATION TO FUNCTION RESULT TO PRESERVE IT ***/!!!,
	RTRIM(col1)
	FROM
	collateTable;
Copy

Best Practices

  • Para evitar diferenças funcionais durante as comparações, adicione a ordenação original da coluna à cadeia de caracteres de resultado da função TRIM. Isso pode ser feito usando a função COLLATE e especificando a ordenação original da coluna como segundo argumento. Esse argumento deve ser uma cadeia de caracteres literal com o valor do agrupamento.

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

SSC-EWI-TD0004

Exceção SQL não compatível com o manipulador Continue.

Severity

Low

Description

Nos procedimentos do Snowflake, não existe uma transformação equivalente para o manipulador Continue do Teradata. Para alguns códigos de exceção compatíveis, o SnowConvert AI realiza algum tratamento para emular esse comportamento. Este EWI é adicionado às instruções do manipulador Continue que têm um código de exceção não compatível.

Example Code

Teradata:
 REPLACE PROCEDURE PURGING_ADD_TABLE
( 
 IN inDatabaseName     	VARCHAR(30), 
 IN inTableName    		VARCHAR(30)
)
BEGIN
 DECLARE vCHAR_SQLSTATE CHAR(5);
 DECLARE vSUCCESS       CHAR(5);

  DECLARE CONTINUE HANDLER FOR SQLSTATE 'UNSUPPORTED'
  BEGIN
     SET vCHAR_SQLSTATE = SQLCODE;
     SET vSUCCESS    = SQLCODE;
  END;

  SELECT 1;
 
END;
Copy
Snowflake Scripting:
 CREATE OR REPLACE PROCEDURE PURGING_ADD_TABLE
(INDATABASENAME VARCHAR(30), INTABLENAME VARCHAR(30)
)
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
  vCHAR_SQLSTATE CHAR(5);
  vSUCCESS       CHAR(5);
 BEGIN
   
   
  !!!RESOLVE EWI!!! /*** SSC-EWI-TD0004 - NOT SUPPORTED SQL EXCEPTION ON CONTINUE HANDLER ***/!!!

  DECLARE CONTINUE HANDLER FOR SQLSTATE 'UNSUPPORTED'
  BEGIN
   vCHAR_SQLSTATE := SQLCODE;
   vSUCCESS := SQLCODE;
  END;
  SELECT
   1;
 END;
$$;
Copy

Best Practices

SSC-EWI-TD0005

A instrução foi convertida, mas a funcionalidade dela ainda não foi implementada.

Severity

Crítico

Description

A instrução foi reconhecida e convertida, mas o código convertido não terá a funcionalidade esperada porque a implementação ainda não foi concluída.

O aviso foi adicionado para que o usuário esteja ciente de que, quando o script usar esta instrução, ele não terá a equivalência funcional esperada.

Exemplo de fonte

Código de entrada BTEQ:
 .SET SIDETITLES ON
Copy
Código de saída Python:
 #*** Generated code is based on the SnowConvert AI Python Helpers version 2.0.6 ***
 
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-EWI-TD0005 - THE STATEMENT WAS CONVERTED BUT ITS FUNCTIONALITY IS NOT IMPLEMENTED YET **
  Export.side_titles(True)
  snowconvert.helpers.quit_application()

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

Best Practices

SSC-EWI-TD0006

Valor padrão inválido.

Severity

Low

Description

As especificações de coluna DEFAULT TIME / DEFAULT DATE / DEFAULT CURREN_DATE / DEFAULT DEFAULT CURRENT_TIME / DEFAULT CURRENT_TIMESTAMP não são compatíveis com o tipo de dados FLOAT.

Example Code

Teradata:
CREATE TABLE T_2004
(
    -- In the output code all of these columns will be FLOAT type
    -- and will include the SSC-EWI-TD0006 message.
    COL1 FLOAT DEFAULT TIME,
    COL2 FLOAT DEFAULT DATE,
    COL3 FLOAT DEFAULT CURRENT_DATE,
    COL4 FLOAT DEFAULT CURRENT_TIME,
    COL5 FLOAT DEFAULT CURRENT_TIMESTAMP
);
Snowflake Scripting:
 CREATE OR REPLACE TABLE T_2004
(
    -- In the output code all of these columns will be FLOAT type
    -- and will include the SSC-EWI-TD0006 message.
    COL1 FLOAT DEFAULT TIME !!!RESOLVE EWI!!! /*** SSC-EWI-TD0006 - DEFAULT CURRENT_TIME NOT VALID FOR DATA TYPE ***/!!!,
    COL2 FLOAT DEFAULT DATE !!!RESOLVE EWI!!! /*** SSC-EWI-TD0006 - DEFAULT CURRENT_DATE NOT VALID FOR DATA TYPE ***/!!!,
    COL3 FLOAT DEFAULT CURRENT_DATE !!!RESOLVE EWI!!! /*** SSC-EWI-TD0006 - DEFAULT CURRENT_DATE NOT VALID FOR DATA TYPE ***/!!!,
    COL4 FLOAT DEFAULT CURRENT_TIME !!!RESOLVE EWI!!! /*** SSC-EWI-TD0006 - DEFAULT CURRENT_TIME NOT VALID FOR DATA TYPE ***/!!!,
    COL5 FLOAT DEFAULT CURRENT_TIMESTAMP !!!RESOLVE EWI!!! /*** SSC-EWI-TD0006 - DEFAULT CURRENT_TIMESTAMP NOT VALID FOR DATA TYPE ***/!!!
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"teradata"}}'
;
Copy

Best Practices

SSC-EWI-TD0007

Cláusula GROUP BY não compatível no modo Teradata para comparação de cadeias de caracteres.

Severity

Low

Description

Esta mensagem de erro indica um possível problema ao migrar consultas SQL do Teradata para o Snowflake, particularmente relacionado a diferenças em como a cláusula GROUP BY lida com a diferenciação de maiúsculas e minúsculas na comparação de cadeias de caracteres no modo Teradata.

No modo Teradata, as comparações de cadeias de caracteres nas cláusulas GROUP BY não diferenciam maiúsculas e minúsculas por padrão (NOT CASESPECIFIC), enquanto o Snowflake diferencia, a menos que as colunas sejam definidas explicitamente com uma cláusula COLLATE que não diferencia maiúsculas de minúsculas. Essa diferença pode fazer com que consultas que dependem de agrupamentos que não diferenciam maiúsculas de minúsculas no Teradata produzam resultados diferentes no Snowflake.

Example Code

Teradata:
CREATE TABLE employees (
    employee_id INTEGER,
    first_name VARCHAR(50) NOT CASESPECIFIC,
    department VARCHAR(50)
);

INSERT INTO employees VALUES (1, 'John', 'Sales');
INSERT INTO employees VALUES (2, 'JOHN', 'sales'); 
INSERT INTO employees VALUES (3, 'john', 'SALES');

SELECT first_name, COUNT(*) 
FROM employees 
GROUP BY first_name;
Copy
Snowflake Scripting:
CREATE OR REPLACE TABLE employees (
    employee_id INTEGER,
    first_name VARCHAR(50),
    department VARCHAR(50)
)
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "teradata",  "convertedOn": "10/20/2025",  "domain": "no-domain-provided",  "migrationid": "kwOaAavBVnCx8OhdxEITfg==" }}'
;

INSERT INTO employees
VALUES (1, 'John', 'Sales');

INSERT INTO employees
VALUES (2, 'JOHN', 'sales');

INSERT INTO employees
VALUES (3, 'john', 'SALES');

SELECT
    first_name,
    COUNT(*)
FROM
    employees
!!!RESOLVE EWI!!! /*** SSC-EWI-TD0007 - GROUP BY IS NOT EQUIVALENT IN TERADATA MODE ***/!!!
GROUP BY first_name;
Copy

Diferenças de comportamento esperadas

Plataforma

Comportamento de agrupamento

Exemplo de linhas de resultado

Modo Teradata

Agrupa «John», «JOHN» e «john»

John (or JOHN/john), 3

Snowflake

Trata «John», «JOHN» e «john» como separados

John, 1
JOHN, 1
john, 1

Best Practices

  • Revise as cláusulas GROUP BY que envolvem colunas de cadeia de caracteres ao migrar do modo Teradata para garantir o comportamento de agrupamento esperado.

Observação: ao usar expressões como RTRIM(UPPER(first_name)) ou RTRIM(first_name) na cláusula GROUP BY para obter agrupamento sem distinção entre maiúsculas e minúsculas ou agrupamento truncado, você deve aplicar a mesma expressão de forma consistente em todas as partes da consulta em que a coluna é referenciada. Por exemplo:

SELECT RTRIM(UPPER(first_name))
FROM employees
WHERE RTRIM(UPPER(first_name)) = 'JOHN'
GROUP BY RTRIM(UPPER(first_name));
Copy

Isso garante que a filtragem, a seleção e o agrupamento usem a mesma lógica, evitando incompatibilidades ou resultados inesperados.

  • Defina colunas com COLLATE durante a criação da tabela se for necessário um comportamento consistente sem distinção entre maiúsculas e minúsculas:

    CREATE TABLE employees (
        first_name VARCHAR(50) COLLATE 'en-cs'
    );
    
    Copy
  • Habilite o sinalizador –UseCollateForCaseSpecification CLI ou a configuração de conversão para usar COLLATE para especificação de maiúsculas e minúsculas durante a conversão. Essa opção garante que a especificação de maiúsculas e minúsculas (como CASESPECIFIC ou NOT CASESPECIFIC) seja tratada com o uso de funções COLLATE em vez de UPPER. Para obter detalhes, consulte a documentação da CLI ou as configurações de conversão.

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

SSC-EWI-TD0008

A função para comparar cadeias de caracteres não é compatível.

Severity

Low

Description

Atualmente, não há equivalência para algumas funções de comparação de cadeias de caracteres no Snowflake.

Este EWI é adicionado sempre que o tipo de comparação é jaro, n_gram, LD, LDWS, OSA, DL, hamming, LCS, jaccard, cosine e soundexcode.

Example Code

Teradata:
 SELECT * FROM StringSimilarity (
  ON (
    SELECT CAST(a AS VARCHAR(200)) AS a, CAST(b AS VARCHAR(200)) AS b
    FROM table_1
  ) PARTITION BY ANY
  USING
  ComparisonColumnPairs ('ld(a,b) AS sim_fn')
) AS dt ORDER BY 1;
Copy
Snowflake Scripting:
 SELECT
  * FROM
  !!!RESOLVE EWI!!! /*** SSC-EWI-TD0008 - FUNCTION FOR COMPARING STRINGS IS NOT SUPPORTED ***/!!! StringSimilarity (
   ON (
     SELECT CAST(a AS VARCHAR(200)) AS a, CAST(b AS VARCHAR(200)) AS b
     FROM table_1
   ) PARTITION BY ANY
   USING
   ComparisonColumnPairs ('ld(a,b) AS sim_fn')
 ) AS dt ORDER BY 1;
Copy

Best Practices

SSC-EWI-TD0009

Coluna TEMPORAL não compatível.

Severity

Low

Description

O Teradata oferece suporte a tabelas temporais no nível da coluna usando colunas de período derivadas. Essas colunas não são compatíveis com o Snowflake.

Example Code

Teradata:
 CREATE MULTISET TABLE Policy(
      Policy_ID INTEGER,
      Customer_ID INTEGER,
      Policy_Type CHAR(2) NOT NULL,
      Policy_Details CHAR(40),
      Policy_Start DATE NOT NULL,
      Policy_End DATE NOT NULL,
      PERIOD FOR Validity(Policy_Start,Policy_End) AS VALIDTIME
      )
   PRIMARY INDEX(Policy_ID);
Copy
Snowflake Scripting:
 CREATE OR REPLACE TABLE Policy (
   Policy_ID INTEGER,
   Customer_ID INTEGER,
   Policy_Type CHAR(2) NOT NULL,
   Policy_Details CHAR(40),
   Policy_Start DATE NOT NULL,
   Policy_End DATE NOT NULL,
   !!!RESOLVE EWI!!! /*** SSC-EWI-TD0009 - TEMPORAL COLUMN NOT SUPPORTED ***/!!!
         PERIOD FOR Validity(Policy_Start,Policy_End) AS VALIDTIME
         )
         COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"teradata"}}'
         ;
Copy

Best Practices

SSC-EWI-TD0010

UPPERCASE não é compatível com o Snowflake.

Severity

Low

Description

O atributo de coluna UPPERCASE não é compatível com o Snowflake.

Example Code

Teradata:
 CREATE TABLE T_2010
(
    col1 VARCHAR(1) UPPERCASE
);
Copy
Snowflake Scripting:
 CREATE OR REPLACE TABLE T_2010 (
    col1 VARCHAR(1)
                    !!!RESOLVE EWI!!! /*** SSC-EWI-TD0010 - UPPERCASE NOT SUPPORTED BY SNOWFLAKE ***/!!!
 UPPERCASE
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"teradata"}}'
;
Copy

Best Practices

  • Como a cláusula UPPERCASE indica que os caracteres digitados como «aaa» são armazenados como «AAA», uma possível solução alternativa seria adicionar a função UPPER a todas as referências de inserção. No entanto, o carregamento de dados externos por processos ETL também teria que ser modificado.

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

SSC-EWI-TD0012

Binário não é compatível com o padrão.

Severity

Low

Description

Este EWI é exibido quando o SnowConvert AI encontra um tipo de dados BINARY juntamente com uma especificação de valor DEFAULT. Como valores padrão não são permitidos em colunas BINARY, isso é removido.

Example Code

Teradata:
 CREATE TABLE TableExample
(
ColumnExample BINARY DEFAULT '00000000'XB NOT NULL
)
Copy
Snowflake Scripting:
 CREATE OR REPLACE TABLE TableExample (
ColumnExample BINARY DEFAULT NOT TO_BINARY('00000000') !!!RESOLVE EWI!!! /*** SSC-EWI-TD0012 - BINARY DOES NOT SUPPORT DEFAULT NOT TO_BINARY('00000000') ***/!!! NULL
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"teradata"}}'
;
Copy

Best Practices

SSC-EWI-TD0017

A funcionalidade de rastreamento de tabela temporária global não é compatível.

Severity

Low

Description

Este EWI é exibido quando o SnowConvert AI encontra uma criação de tabela com a opção GLOBAL TEMPORARY TRACE. Consulte a seguinte documentação da Teradata sobre a funcionalidade TRACE. Como isso não é compatível com o Snowflake, foi removido.

Example Code

Teradata:
 CREATE GLOBAL TEMPORARY TRACE TABLE TableExample
(
ColumnExample Number
)
Copy
Snowflake Scripting:
 !!!RESOLVE EWI!!! /*** SSC-EWI-TD0017 - GLOBAL TEMPORARY TABLE TRACE FUNCTIONALITY NOT SUPPORTED ***/!!!
CREATE OR REPLACE TABLE TableExample (
ColumnExample NUMBER(38, 18)
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"teradata"}}'
;
Copy

Best Practices

SSC-EWI-TD0020

A função Regexp_Substr só é compatível com expressões regulares POSIX.

Nota

Esta EWI está obsoleta. Consulte a documentação SSC-EWI-0009.

Gravidade

Low

Descrição

Atualmente, o Snowflake não é compatível com expressões regulares estendidas além da sintaxe básica de expressões regulares POSIX.

Este EWI é adicionado toda vez que uma chamada de função para REGEX_SUBSTR, REGEX_REPLACE ou REGEX_INSTR é transformada no SnowFlake para alertar o usuário sobre possíveis expressões regulares incompatíveis. Alguns dos recursos incompatíveis são lookahead, lookbehind e grupos sem captura.

Exemplo de código

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

Práticas recomendadas

  • Verifique a expressão regular utilizada em cada caso para determinar se ela precisa de intervenção manual. Mais informações sobre o suporte expandido a expressões regulares e alternativas no SnowFlake podem ser encontradas aqui.

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

SSC-EWI-TD0023

ACTIVITY_COUNT dentro de SELECT/SET INTO VARIABLE requer correção manual.

Gravidade

Low

Descrição

A variável de status ACTIVITY_COUNT retorna o número de linhas afetadas por uma instrução SQL DML em um aplicativo SQL incorporado ou de procedimento armazenado. Para mais informações, consulte aqui.

Conforme explicado em sua especificação de tradução, existe uma solução alternativa para emular o comportamento de ACTIVITY_COUNT através de:

 SELECT $1 FROM TABLE(RESULT_SCAN(LAST_QUERY_ID()));
Copy

Ao usar ACTIVITY_COUNT em uma instrução SELECT/SET INTO VARIABLE, ela não pode ser simplesmente substituída pela solução alternativa mencionada acima.

Exemplo de código

Teradata

REPLACE PROCEDURE InsertEmployeeSalaryAndLog_4 ()
BEGIN
    DECLARE rowCount INT;
    DECLARE message VARCHAR(100);

    INSERT INTO employees (employee_id, first_name, last_name, department_id, salary)
    VALUES (101, 'Alice', 'Smith', 10, 70000.00);

    SELECT ACTIVITY_COUNT INTO rowCount;
    SET message = 'ROWS INSERTED: ' || rowCount;

    -- Insert the ACTIVITY_COUNT into the activity_log table
    INSERT INTO activity_log (operation, row_count)
    VALUES (message, rowCount);
END;

Snowflake

 CREATE OR REPLACE PROCEDURE InsertEmployeeSalaryAndLog_4 ()
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "teradata",  "convertedOn": "07/15/2024" }}'
EXECUTE AS CALLER
AS
$$
    DECLARE
               rowCount INT;
               message VARCHAR(100);
    BEGIN
                
                
               INSERT INTO employees (employee_id, first_name, last_name, department_id, salary)
               VALUES (101, 'Alice', 'Smith', 10, 70000.00);
               SELECT
            ACTIVITY_COUNT !!!RESOLVE EWI!!! /*** SSC-EWI-TD0023 - ACTIVITY_COUNT INSIDE SELECT/SET INTO VARIABLE REQUIRES MANUAL FIX ***/!!! INTO
            :rowCount;
            message := 'ROWS INSERTED: ' || rowCount;

            -- Insert the ACTIVITY_COUNT into the activity_log table
            INSERT INTO activity_log (operation, row_count)
            VALUES (:message, :rowCount);
    END;
$$;
Copy

Correção manual

Parte da solução alternativa apresentada acima pode ser utilizada para ainda obter o número de linhas inseridas/atualizadas/excluídas da seguinte forma:

 CREATE OR REPLACE PROCEDURE InsertEmployeeSalaryAndLog_4 ()
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "teradata",  "convertedOn": "07/15/2024" }}'
EXECUTE AS CALLER
AS
$$
    DECLARE
               rowCount INT;
               message VARCHAR(100);
    BEGIN
                
                
               INSERT INTO employees (employee_id, first_name, last_name, department_id, salary)
               VALUES (101, 'Alice', 'Smith', 10, 70000.00);
               SELECT $1 INTO :rowCount FROM TABLE(RESULT_SCAN(LAST_QUERY_ID()));
            message := 'ROWS INSERTED: ' || rowCount;

            -- Insert the ACTIVITY_COUNT into the activity_log table
            INSERT INTO activity_log (operation, row_count)
            VALUES (:message, :rowCount);
    END;
$$;
Copy

Em vez de usar a consulta completa, ela precisa ser adaptada manualmente à sintaxe SELECT INTO VARIABLE do Snowflake.

Além disso, se RESULT_SCAN(LAST_QUERY_ID()) estiver fornecendo resultados incorretos, verifique SSC-FDM-TD0033(../functional-difference/teradataFDM.md#ssc-fdm-td0033) para saber como lidar com possíveis limitações do uso de LAST_QUERY_ID.

Práticas recomendadas

  • Adapte manualmente a solução alternativa proposta.

  • Consulte SSC-FDM-TD0033(../functional-difference/teradataFDM.md#ssc-fdm-td0033) para saber como lidar com possíveis limitações do uso de LAST_QUERY_ID.

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

SSC-EWI-TD0024

A instrução abort não é compatível devido a uma função agregada.

Gravidade

Low

Descrição

Este EWI aparece quando uma função AGGREGATE faz parte de uma instrução ABORT dentro de um procedimento armazenado. A instrução é transformada em comentário.

Exemplo de código

Teradata:
 REPLACE PROCEDURE ABORT_SAMPLE()
BEGIN 
    ABORT WHERE SUM(TABLE1.COL1) < 2;
END;
Copy
Snowflake Scripting:
 CREATE OR REPLACE PROCEDURE ABORT_SAMPLE()
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"teradata"}}'
EXECUTE AS CALLER
AS
$$
    BEGIN
        !!!RESOLVE EWI!!! /*** SSC-EWI-TD0024 - ABORT STATEMENT IS NOT SUPPORTED DUE TO AN AGGREGATE FUNCTION ***/!!!
        ABORT WHERE SUM(TABLE1.COL1) < 2;
    END;
$$;
Copy

Práticas recomendadas

SSC-EWI-TD0025

Formato de saída não compatível.

Gravidade

Low

Descrição

Este EWI aparece quando uma função CAST especifica um formato de saída não compatível com o Snowflake Scripting.

Exemplo de código

Teradata:
 CREATE TABLE SAMPLE_TABLE
(
    VARCHAR_TYPE VARCHAR
);

REPLACE VIEW SAMPLE_VIEW 
AS
SELECT
CAST(VARCHAR_TYPE AS FLOAT FORMAT 'ZZZ.ZZZZZ'),
CAST('01:02.030405' AS TIME(1) WITH TIME ZONE FORMAT 'MI:SS.S(6)')
FROM SAMPLE_TABLE;
Copy
Snowflake Scripting:
 CREATE OR REPLACE TABLE SAMPLE_TABLE
(
    VARCHAR_TYPE VARCHAR
)
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "teradata",  "convertedOn": "03/03/2025",  "domain": "test" }}'
;

CREATE OR REPLACE VIEW SAMPLE_VIEW
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "teradata",  "convertedOn": "03/03/2025",  "domain": "test" }}'
AS
SELECT
    TO_NUMBER(VARCHAR_TYPE, '999.00000', 38, 10) !!!RESOLVE EWI!!! /*** SSC-EWI-TD0025 - OUTPUT FORMAT 'ZZZ.ZZZZZ' NOT SUPPORTED. ***/!!!,
    TO_TIME('01:02.030405', 'MI:SS.FF6') !!!RESOLVE EWI!!! /*** SSC-EWI-TD0025 - OUTPUT FORMAT 'MI:SS.S(6)' NOT SUPPORTED. ***/!!!
    FROM
    SAMPLE_TABLE;
Copy

Práticas recomendadas

  • Verifique se o código de saída tem equivalência funcional com o código original.

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

SSC-EWI-TD0027

O Snowflake não é compatível com as opções de coluna de dimensões de tempo integradas do Teradata.

Gravidade

Low

Descrição

O EWI é gerado porque o Snowflake não é compatível com os atributos de dimensões de tempo integrados do Teradata, como VALIDTIME ou TRANSACTIONTIME.

Exemplo de código

Entrada Teradata:
 CREATE MULTISET TABLE SAMPLE_TABLE   
(
    COL1 PERIOD(TIMESTAMP(6) WITH TIME ZONE) NOT NULL AS TRANSACTIONTIME
);  
Copy
Saída do Snowflake:
 CREATE OR REPLACE TABLE SAMPLE_TABLE (
       COL1 VARCHAR(68) NOT NULL !!!RESOLVE EWI!!! /*** SSC-EWI-TD0027 - SNOWFLAKE DOES NOT SUPPORT 'TRANSACTIONTIME' COLUMN OPTION ***/!!! /*** SSC-FDM-TD0036 - SNOWFLAKE DOES NOT SUPPORT THE PERIOD DATATYPE, ALL PERIODS ARE HANDLED AS VARCHAR INSTEAD ***/
   )
   COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"teradata"}}'
;
Copy

Práticas recomendadas

  • Crie manualmente colunas TIMESTAMP com valores padrão, como CURRENT_TIMESTAMP.

  • Aproveite o uso de fluxos de tabela; eles podem registrar alterações de manipulação de dados feitas nas tabelas, bem como metadados sobre cada alteração. (Guia)

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

SSC-EWI-TD0029

A funcionalidade de tabela de fila não é compatível.

Gravidade

Low

Descrição

Este aviso aparece quando uma TABLE com o atributo QUEUE é migrada. A palavra-chave QUEUE foi removida porque não é compatível com o Snowflake.

Exemplo de código

Entrada:
 CREATE MULTISET TABLE SAMPLE_TABLE,
QUEUE,
NO FALLBACK 
(
    COL1 INTEGER
);
Copy
Saída:
 !!!RESOLVE EWI!!! /*** SSC-EWI-TD0029 - QUEUE TABLE FUNCTIONALITY NOT SUPPORTED ***/!!!
CREATE OR REPLACE TABLE SAMPLE_TABLE
(
    COL1 INTEGER
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"teradata"}}'
;
Copy

Práticas recomendadas

SSC-EWI-TD0031

O resultado pode variar devido ao tipo char ter um comprimento fixo no Teradata.

Gravidade

Low

Descrição

Como o tipo de dados CHAR do Teradata tem um comprimento fixo, algumas funções, como LIKE, tentarão corresponder à coluna inteira em vez da palavra inserida na coluna, resultando em falsos positivos. No entanto, no Snowflake, o tipo CHAR tem tamanho variável, o que significa que as funções LIKE sempre tentarão corresponder aos valores inseridos. Considere o seguinte código como exemplo:

Exemplo de código

Entrada:
 CREATE TABLE table1
(
    col1 VARCHAR(36),
    col2 CHAR(36)
);

INSERT INTO table1 VALUES ('Gabriel', 'Gabriel');
INSERT INTO table1 VALUES ('Barnum', 'Barnum');
INSERT INTO table1 VALUES ('Sergio', 'Sergio');

SELECT col1 FROM table1 where col1 LIKE 'Barnum';
-- The result is a single row with 'Barnum'
SELECT col2 FROM table1 where col2 LIKE 'Barnum';
-- It does not return any row
Copy
Saída:
 CREATE OR REPLACE TABLE table1
(
    col1 VARCHAR(36),
    col2 CHAR(36)
)
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "teradata",  "convertedOn": "07/14/2025",  "domain": "no-domain-provided" }}'
;

INSERT INTO table1
VALUES ('Gabriel', 'Gabriel');

INSERT INTO table1
VALUES ('Barnum', 'Barnum');

INSERT INTO table1
VALUES ('Sergio', 'Sergio');

SELECT
    col1 FROM
    table1
where col1 ILIKE 'Barnum';
-- The result is a single row with 'Barnum'
    SELECT
    col2 FROM
    table1
    where
    !!!RESOLVE EWI!!! /*** SSC-EWI-TD0031 - THE RESULT OF LIKE MAY DIFFER DUE TO CHAR TYPE HAVING A FIXED LENGTH IN TERADATA ***/!!! col2 ILIKE 'Barnum';
    -- It does not return any row
Copy

Práticas recomendadas

SSC-EWI-TD0034

SQL com várias instruções não é compatível.

Nota

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

Gravidade

Low

Descrição

A execução de SQL com várias instruções não é compatível. A solicitação foi tratada como uma transação.

Nota

O seguinte EWI só é gerado quando o sinalizador de linguagem de destino PL está definido como Javascript, assim: «–PLTargetLanguage Javascript»

Exemplo de código

Entrada:
-- Additional Params: --PLTargetLanguage Javascript
REPLACE PROCEDURE proc1()
  BEGIN
    BEGIN REQUEST;
      SELECT* FROM TABLE1;
    END REQUEST;
END;
Saída:
 CREATE OR REPLACE PROCEDURE proc1 ()
RETURNS STRING
LANGUAGE JAVASCRIPT
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"teradata"}}'
EXECUTE AS CALLER
AS
$$
  // SnowConvert AI Helpers Code section is omitted.

  var TRANSACTION_HANDLER = function (error) {
    throw error;
  };
  // ** SSC-EWI-TD0034 - MULTISTATEMENT SQL EXECUTION NOT SUPPORTED, REQUEST HANDLED AS TRANSACTION **
  try {
    EXEC(`BEGIN`);
    EXEC(`SELECT
   *
FROM
   TABLE1`,[],undefined,TRANSACTION_HANDLER);
    EXEC(`COMMIT`);
  } catch(error) {
    EXEC(`ROLLBACK`);
  }
$$;
Copy

Práticas recomendadas

SSC-EWI-TD0039

Formato de entrada não compatível.

Gravidade

Medium

Descrição

O formato de entrada especificado não é compatível com o Snowflake.

Exemplo de código

Entrada:
 SELECT 
    CAST('02/032/25' AS DATE FORMAT 'MM/DDD/YY'),
    CAST('02/032/25' AS DATE FORMAT 'MM/D3/YY'),
    CAST('03-Thursday-2025' AS DATE FORMAT 'DD-EEEE-YYYY'),
    CAST('03-Thursday-2025' AS DATE FORMAT 'DD-E4-YYYY');
Copy
Saída:
 SELECT
    TO_DATE('02/032/25', 'MM/DDD/YY') !!!RESOLVE EWI!!! /*** SSC-EWI-TD0039 - INPUT FORMAT 'MM/DDD/YY' NOT SUPPORTED ***/!!!,
    TO_DATE('02/032/25', 'MM/D3/YY') !!!RESOLVE EWI!!! /*** SSC-EWI-TD0039 - INPUT FORMAT 'MM/D3/YY' NOT SUPPORTED ***/!!!,
    TO_DATE('03-Thursday-2025', 'DD-EEEE-YYYY') !!!RESOLVE EWI!!! /*** SSC-EWI-TD0039 - INPUT FORMAT 'DD-EEEE-YYYY' NOT SUPPORTED ***/!!!,
    TO_DATE('03-Thursday-2025', 'DD-E4-YYYY') !!!RESOLVE EWI!!! /*** SSC-EWI-TD0039 - INPUT FORMAT 'DD-E4-YYYY' NOT SUPPORTED ***/!!!;
Copy

Práticas recomendadas

SSC-EWI-TD0040

O formato em uma tabela não é compatível.

Gravidade

Low

Descrição

O formato especificado não é compatível.

Exemplo de código

Entrada:
 CREATE TABLE T_2040
(
    C1 VARCHAR(255) CHARACTER SET LATIN NOT CASESPECIFIC FORMAT 'X(50)',
    C2 VARCHAR(255) CHARACTER SET LATIN NOT CASESPECIFIC FORMAT 'X(75)'
);
Copy
Saída:
 CREATE OR REPLACE TABLE T_2040
(
    C1 VARCHAR(255) FORMAT 'X(50)' !!!RESOLVE EWI!!! /*** SSC-EWI-TD0040 - FORMAT IN TABLE T_2040 NOT SUPPORTED ***/!!!,
    C2 VARCHAR(255) FORMAT 'X(75)' !!!RESOLVE EWI!!! /*** SSC-EWI-TD0040 - FORMAT IN TABLE T_2040 NOT SUPPORTED ***/!!!
)
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "teradata",  "convertedOn": "07/14/2025",  "domain": "no-domain-provided" }}'
;
Copy

SSC-EWI-TD0041

A função trunc foi adicionada para garantir a compatibilidade com números inteiros.

Gravidade

Low

Descrição

Ao migrar do Teradata para o Snowflake, você pode encontrar diferenças na forma como as conversões numéricas são tratadas. No Teradata, converter um valor para INTEGER truncará implicitamente qualquer parte decimal, mesmo que o valor original seja um número de ponto flutuante ou uma representação em cadeia de caracteres de um número. No entanto, no Snowflake, converter um valor numérico não inteiro ou uma cadeia de caracteres diretamente para INTEGER poderá resultar em erros ou resultados inesperados se o valor ainda não for um número inteiro.

Para garantir a compatibilidade, a função TRUNC() é aplicada antes da conversão para INTEGER. Isso remove qualquer parte decimal, permitindo a conversão segura para um número inteiro. No entanto, se o valor de origem não for numérico ou for uma cadeia de caracteres não numérica, ainda poderão ocorrer erros e uma intervenção manual poderá ser necessária. Por exemplo, se o SnowConvertAI não conseguir determinar o tipo da coluna devido à falta de referências, você pode precisar ajustar a conversão manualmente.

Exemplo de código

Entrada:
 SELECT
    cast(date_column as integer);
Copy
Saída:
 SELECT
    cast(TRUNC(date_column) as integer) !!!RESOLVE EWI!!! /*** SSC-EWI-TD0041 - TRUNC FUNCTION WAS ADDED TO ENSURE INTEGER. MAY NEED CHANGES IF NOT NUMERIC OR STRING. ***/!!!;
Copy

Práticas recomendadas

SSC-EWI-TD0046

Referências internas não são compatíveis com o Snowflake.

Gravidade

Medium

Descrição

Este erro ocorre quando há uma referência a uma tabela DBC e a coluna selecionada não tem equivalência no Snowflake.

Exemplo de código

Entrada:
 CREATE VIEW SAMPLE_VIEW
AS
SELECT PROTECTIONTYPE FROM DBC.DATABASES;
Copy
Saída:
 CREATE OR REPLACE VIEW SAMPLE_VIEW
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "teradata",  "convertedOn": "08/14/2024" }}'
AS
SELECT
!!!RESOLVE EWI!!! /*** SSC-EWI-TD0046 - BUILT-IN REFERENCE TO PROTECTIONTYPE IS NOT SUPPORTED IN SNOWFLAKE ***/!!!
PROTECTIONTYPE FROM
INFORMATION_SCHEMA.DATABASES;
Copy

Práticas recomendadas

SSC-EWI-TD0049

Instrução TPT não processada.

Gravidade

High

Descrição

Uma instrução DML em TPT não pôde ser processada e convertida pela ferramenta. Isso pode ocorrer por motivos como o uso de concatenação com variáveis de script ou o uso de aspas de escape dentro da instrução DML.

Exemplo de código

Código de entrada:
 -- Script1.tpt
DEFINE JOB load_job
DESCRIPTION 'LOAD TABLE FROM A FILE'
  (
     DEFINE SCHEMA schema_name
     DESCRIPTION 'define SCHEMA'
   (
       var1 VARCHAR (50)
   );

   STEP setup_tables
   (
      APPLY
       ('RELEASE MLOAD database_name.table_name;')
     TO OPERATOR (DDL_OPERATOR() );

   );
);
Copy
Código gerado:
 #*** Generated code is based on the SnowConvert AI Python Helpers version 2.0.6 ***
 
import os
import sys
import snowconvert.helpers
from snowconvert.helpers import Export
from snowconvert.helpers import exec
from snowconvert.helpers import BeginLoading
import argparse
args = None
## Script1.tpt
class load_job:
    #'LOAD TABLE FROM A FILE'

  jobname = "load_job"
    #'define SCHEMA'

  schema_name = """(
var1 VARCHAR(50)
);"""
  def setup_tables(self):
    self.DDL_OPERATOR()
    !!!RESOLVE EWI!!! /*** SSC-EWI-TD0049 - THE FOLLOWING STATEMENT COULD NOT BE PROCESSED ***/!!!
      #'RELEASE MLOAD database_name.table_name;'


con = None
def main():
  snowconvert.helpers.configure_log()
  con = snowconvert.helpers.log_on()
  _load_job = load_job()
  _load_job.setup_tables()
  snowconvert.helpers.quit_application()

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

Práticas recomendadas

  • Para este problema, você pode digitar a instrução de inserção manualmente e/ou, como a instrução DML ainda não é compatível, solicitar à equipe do SnowConvert AI que adicione suporte para esse caso específico.

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

SSC-EWI-TD0051

Os resultados da função BYTES do Teradata diferem da função LENGTH do Snowflake para colunas de bytes.

Gravidade

Low

Descrição

Como o tipo de dados byte do Teradata tem um comprimento fixo, a função BYTES sempre contará os zeros à direita inseridos para ajustar valores menores do tipo byte à coluna, retornando o tamanho da coluna em vez do tamanho do valor inserido originalmente. No entanto, o tipo binário do Snowflake tem tamanho variável, o que significa que a função LENGTH sempre retornará o tamanho dos valores inseridos. Considere o seguinte código como exemplo:

Teradata:

 create table exampleTable(
	bytecol byte(10)
);

insert into exampleTable values ('2B'XB);

select bytes(bytecol) from exampleTable; 
-- Will return 10, the size of bytecol
Copy

Código equivalente no Snowflake:

 CREATE OR REPLACE TABLE exampleTable (
	bytecol BINARY
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"teradata"}}'
;

INSERT INTO exampleTable
VALUES (TO_BINARY('2B'));

SELECT
	LENGTH(bytecol) !!!RESOLVE EWI!!! /*** SSC-EWI-TD0051 - TERADATA BYTES FUNCTION RESULTS DIFFER FROM SNOWFLAKE LENGTH FUNCTION FOR BYTE TYPE COLUMNS ***/!!! from
	exampleTable;
	-- Will return 10, the size of bytecol
Copy

Exemplo de código:

Código de entrada:
 create table sampleTable(
    byteColumn byte(10),
    varbyteColumn varbyte(15)
);

select bytes(byteColumn), bytes(varbyteColumn) from sampleTable;
Copy
Código gerado:
 CREATE OR REPLACE TABLE sampleTable (
    byteColumn BINARY,
    varbyteColumn BINARY(15)
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"teradata"}}'
;

SELECT
    LENGTH(byteColumn) !!!RESOLVE EWI!!! /*** SSC-EWI-TD0051 - TERADATA BYTES FUNCTION RESULTS DIFFER FROM SNOWFLAKE LENGTH FUNCTION FOR BYTE TYPE COLUMNS ***/!!!,
    LENGTH(varbyteColumn) from
    sampleTable;
Copy

Práticas recomendadas

  • Analise o uso dado aos resultados da função BYTES, se o comportamento da função LENGTH do Snowflake era o desejado desde o início e se nenhuma alteração é necessária.

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

SSC-EWI-TD0052

A conversão implícita do Snowflake para numérico difere do Teradata e pode falhar para cadeias de caracteres não literais.

Gravidade

Low

Descrição

Tanto o Teradata quanto o Snowflake permitem que valores de cadeia de caracteres funcionem com parâmetros que esperam valores numéricos; essas cadeias de caracteres são então analisadas e convertidas para seus equivalentes numéricos.

No entanto, existem diferenças sobre o que as duas linguagens consideram uma cadeia de caracteres numérica válida. O Teradata é mais permissivo e analisa com sucesso casos como cadeias de caracteres vazias/apenas com espaços em branco, hifens incorporados, ausência de dígitos na mantissa ou no expoente, símbolos de moeda, separadores de dígitos ou especificação do sinal do número após os dígitos. Por exemplo, as seguintes cadeias de caracteres são válidas:

  • '1-2-3-4-5' -> 12345

  • '$50' -> 50

  • '5000-' -> -5000

  • '1,569,284.55' -> 1569284.55

O Snowflake aplica conversão automática otimista de cadeia de caracteres, esperando que as cadeias de caracteres correspondam aos formatos TM9 ou TME; portanto, a conversão falha na maioria dos casos mencionados. Para resolver essas diferenças, o SnowConvert AI processa literais de cadeia de caracteres passados para funções que fazem uma conversão implícita para numérico e gera cadeias de caracteres equivalentes que correspondem a TM9 ou TME para que possam ser analisadas pelo Snowflake. Isso só se aplica a valores de cadeia de caracteres literais, o que significa que não há garantia de que valores não literais serão analisados pelo Snowflake.

Exemplo de código

Código de entrada:
 create table myTable(
    stringCol varchar(30)
);

insert into myTable values ('   1,236,857.45-');

select cos('   1,236,857.45-');

select cos(stringCol) from myTable;
Copy
Código gerado:
 CREATE OR REPLACE TABLE myTable (
    stringCol varchar(30)
)
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "teradata",  "convertedOn": "07/14/2025",  "domain": "no-domain-provided" }}'
;

INSERT INTO myTable
VALUES ('   1,236,857.45-');

SELECT
    COS('-1236857.45');

    SELECT
    COS(stringCol !!!RESOLVE EWI!!! /*** SSC-EWI-TD0052 - SNOWFLAKE IMPLICIT CONVERSION TO NUMERIC DIFFERS FROM TERADATA AND MAY FAIL FOR NON-LITERAL STRING VALUES ***/!!!)
    from
    myTable;
Copy

Práticas recomendadas

SSC-EWI-TD0053

O Snowflake não é compatível com o tipo de dados de período; todos os períodos são tratados como varchar.

Nota

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

Nota

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

Precisão das representações varchar geradas

PERIOD_UDF gera a representação varchar de um período usando os formatos padrão para carimbos de data/hora e tempo especificados no Snowflake. Isso significa que os carimbos de data/hora terão três dígitos de precisão e as variáveis de tempo terão zero. Por causa disso, você pode notar que os resultados têm uma precisão maior ou menor do que a esperada. Existem duas opções para modificar quantos dígitos de precisão são incluídos na cadeia de caracteres resultante:

  • Use a versão de três parâmetros de PERIOD_UDF: Essa sobrecarga da função usa o parâmetro PRECISIONDIGITS, um número inteiro entre 0 e 9, para controlar quantos dígitos da parte fracionária do tempo serão incluídos no resultado. Observe que, mesmo que o Snowflake seja compatível com até nove dígitos de precisão, o máximo no Teradata é seis. Exemplo:

Chamada

Resultado

PUBLIC.PERIOD_UDF(time '13:30:45.870556', time '15:35:20.344891', 0)

'13:30:45*15:35:20'

PUBLIC.PERIOD_UDF(time '13:30:45.870556', time '15:35:20.344891', 2)

'13:30:45.87*15:35:20.34'

PUBLIC.PERIOD_UDF(time '13:30:45.870556', time '15:35:20.344891', 5)

'13:30:45.87055*15:35:20.34489'

  • Altere os parâmetros de sessão TIMESTAMP_NTZ_OUTPUT_FORMAT e TIME_OUTPUT_FORMAT: Os comandos ALTER SESSION SET TIMESTAMP_NTZ_OUTPUT_FORMAT = <format> e ALTER SESSION SET TIME_OUTPUT_FORMAT = <format>

    podem ser utilizados para modificar os formatos que o Snowflake usa por padrão para a sessão atual. Modificá-los para incluir o número desejado de dígitos de precisão altera o resultado de execuções futuras de PERIOD_UDF para a sessão atual.

Exemplo de código

Código de entrada:
 create table vacations (
    employeeName varchar(50),
    duration period(date)
);

insert into vacations values ('Richard', period(date '2021-05-15', date '2021-06-15'));

select end(duration) from vacations;
Copy
Código gerado:
 CREATE OR REPLACE TABLE vacations (
    employeeName varchar(50),
    duration VARCHAR(24) /*** SSC-FDM-TD0036 - SNOWFLAKE DOES NOT SUPPORT THE PERIOD DATATYPE, ALL PERIODS ARE HANDLED AS VARCHAR INSTEAD ***/
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"teradata"}}'
;

INSERT INTO vacations
VALUES ('Richard', PUBLIC.PERIOD_UDF(date '2021-05-15', date '2021-06-15') !!!RESOLVE EWI!!! /*** SSC-FDM-TD0036 - SNOWFLAKE DOES NOT SUPPORT THE PERIOD DATATYPE, ALL PERIODS ARE HANDLED AS VARCHAR INSTEAD ***/);

SELECT
    PUBLIC.PERIOD_END_UDF(duration) /*** SSC-FDM-TD0036 - SNOWFLAKE DOES NOT SUPPORT THE PERIOD DATATYPE, ALL PERIODS ARE HANDLED AS VARCHAR INSTEAD ***/ from
    vacations;
Copy

Práticas recomendadas

  • Como o comportamento de PERIOD e as funções relacionadas são emulados usando varchar, recomendamos revisar os resultados obtidos para garantir que tudo esteja correto.

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

SSC-EWI-TD0055

Os formatos compatíveis com o Snowflake para TO_CHAR diferem do Teradata e podem falhar ou apresentar comportamento diferente.

Nota

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

Elementos de formato que dependem dos parâmetros da sessão

Alguns elementos de formato do Teradata são mapeados para funções do Snowflake que dependem do valor dos parâmetros de sessão. Para evitar diferenças funcionais nos resultados, você deve definir esses parâmetros de sessão com os mesmos valores que eles têm no Teradata. Os elementos de formato identificados que são mapeados para esse tipo de função são:

  • D: mapeado para a função DAYOFWEEK, os resultados dessa função dependem do parâmetro de sessão WEEK_START. Por padrão, o Teradata considera o domingo como o primeiro dia da semana, enquanto no Snowflake o primeiro dia é a segunda-feira.

  • WW: mapeado para a função WEEK, essa função depende do parâmetro de sessão WEEK_OF_YEAR_POLICY, que por padrão está configurado para usar o padrão ISO (a primeira semana do ano é a primeira a conter pelo menos quatro dias de janeiro), mas, no Teradata, isso está configurado para considerar o primeiro dia de janeiro como o início da primeira semana.

Para modificar os parâmetros de sessão, use ALTER SESSION SET parameter_name = value. Para obter mais informações sobre parâmetros de sessão, visite esta página.

Versão com um único parâmetro de TO_CHAR

A versão com um único parâmetro de TO_CHAR(Datetime) utiliza os formatos padrão especificados nos parâmetros de sessão TIMESTAMP_LTZ_OUTPUT_FORMAT, TIMESTAMP_NTZ_OUTPUT_FORMAT, TIMESTAMP_TZ_OUTPUT_FORMAT e TIME_OUTPUT_FORMAT. Para evitar diferenças de comportamento, defina-os com os mesmos valores utilizados no Teradata.

Para TO_CHAR(Numeric), o Snowflake gera a representação varchar usando os formatos TM9 ou TME para obter uma representação compacta do número. O Teradata também gera representações compactas dos números; portanto, nenhuma ação é necessária.

Exemplo de código

Código de entrada:
 select to_char(date '2008-09-13', 'DD/RM/YYYY');

select to_char(date '2010-10-20', 'DS');

select to_char(1255.495, 'SC9999.9999', 'nls_iso_currency = ''EUR''');

select to_char(45620);
Copy
Código gerado:
 SELECT
TO_CHAR(date '2008-09-13', 'DD/') || PUBLIC.ROMAN_NUMERALS_MONTH_UDF(date '2008-09-13') || TO_CHAR(date '2008-09-13', '/YYYY') !!!RESOLVE EWI!!! /*** SSC-EWI-TD0055 - SNOWFLAKE SUPPORTED FORMATS FOR TO_CHAR DIFFER FROM TERADATA AND MAY FAIL OR HAVE DIFFERENT BEHAVIOR ***/!!!;

SELECT
TO_CHAR(date '2010-10-20', 'MM/DD/YYYY') !!!RESOLVE EWI!!! /*** SSC-EWI-TD0055 - SNOWFLAKE SUPPORTED FORMATS FOR TO_CHAR DIFFER FROM TERADATA AND MAY FAIL OR HAVE DIFFERENT BEHAVIOR ***/!!!;

SELECT
PUBLIC.INSERT_CURRENCY_UDF(TO_CHAR(1255.495, 'S9999.0000'), 2, 'EUR') !!!RESOLVE EWI!!! /*** SSC-EWI-TD0055 - SNOWFLAKE SUPPORTED FORMATS FOR TO_CHAR DIFFER FROM TERADATA AND MAY FAIL OR HAVE DIFFERENT BEHAVIOR ***/!!!;

SELECT
TO_CHAR(45620) !!!RESOLVE EWI!!! /*** SSC-EWI-TD0055 - SNOWFLAKE SUPPORTED FORMATS FOR TO_CHAR DIFFER FROM TERADATA AND MAY FAIL OR HAVE DIFFERENT BEHAVIOR ***/!!!;
Copy

Práticas recomendadas

  • Ao usar FF, tente usar tipos DateTime com a mesma precisão que você usa no Teradata ou adicione uma precisão ao elemento de formato para evitar comportamentos diferentes.

  • Ao usar elementos de formato relacionados a fusos horários, use o primeiro parâmetro do tipo TIMESTAMP_TZ para evitar comportamentos diferentes. Lembre-se também de que o tipo TIME não pode conter informações de fuso horário no Snowflake.

  • Defina os parâmetros de sessão necessários com os valores padrão do Teradata para evitar comportamentos diferentes.

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

SSC-EWI-TD0057

Dados binários em NEW JSON não são compatíveis.

Gravidade

Low

Descrição

A função NEW JSON aceita os dados JSON representados como uma cadeia de caracteres ou em formato binário. Quando os dados estão na representação binária, a função não é transformada, pois esse formato binário não é válido no Snowflake, já que ele não consegue interpretar os metadados sobre o objeto JSON. Para mais informações, consulte a documentação sobre NEW JSON do Teradata.

Exemplo de código

Código de entrada

 SELECT NEW JSON ('160000000268656C6C6F0006000000776F726C640000'xb, BSON);
Copy
Código gerado
 SELECT
!!!RESOLVE EWI!!! /*** SSC-EWI-TD0057 - NEW JSON FUNCTION WITH BINARY DATA IS NOT SUPPORTED ***/!!!!!!RESOLVE EWI!!! /*** SSC-EWI-TD0039 - INPUT FORMAT 'BSON' NOT SUPPORTED ***/!!!
NEW JSON (TO_BINARY('160000000268656C6C6F0006000000776F726C640000'), BSON);
Copy

Práticas recomendadas

SSC-EWI-TD0059

O fuso horário padrão do usuário do Snowflake pode exigir configuração para corresponder ao valor do Teradata.

Gravidade

Low

Descrição

Assim como no Teradata, definir um valor de fuso horário padrão para o usuário fará com que as sessões comecem a usar esse fuso horário até que um novo valor seja definido para a sessão.

Este aviso é gerado para lembrar que o mesmo fuso horário definido para o usuário no Teradata deve ser definido para o usuário do Snowflake. Para fazer isso, use a seguinte consulta no Snowflake: ALTER SESSION SET TIMEZONE = 'equivalent_timezone'. Lembre-se de que o Snowflake aceita apenas fusos horários padrão do Banco de Dados de Fusos Horários IANA.

Exemplo de código

Código de entrada:
 SET TIME ZONE USER;
Copy
Código gerado:
 !!!RESOLVE EWI!!! /*** SSC-EWI-TD0059 - SNOWFLAKE USER DEFAULT TIME ZONE MAY REQUIRE CONFIGURATION TO MATCH TERADATA VALUE ***/!!!
ALTER SESSION UNSET TIMEZONE;
Copy

Práticas recomendadas

  • Lembre-se de definir o fuso horário padrão do usuário para um fuso horário equivalente ao definido para o usuário do Teradata.

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

SSC-EWI-TD0060

JSON_TABLE não transformado, os nomes das colunas não puderam ser recuperados das informações semânticas.

Nota

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

Gravidade

Low

Descrição

A função JSON_TABLE pode ser transformada pelo SnowConvert AI; no entanto, essa transformação requer o conhecimento do nome das colunas que estão sendo selecionadas na subconsulta JSON_TABLE ON.

Esta mensagem é gerada para alertar o usuário de que os nomes das colunas não foram explicitamente inseridos na subconsulta (por exemplo, foi utilizado SELECT *) e as informações semânticas das tabelas referenciadas não foram encontradas, o que significa que os nomes das colunas não puderam ser extraídos.

Se você deseja saber como carregar dados JSON em uma tabela, consulte esta página.

Exemplo de código

Código de entrada:
 CREATE TABLE demo.Train (
    firstCol INT,
    jsonCol JSON(400),
    thirdCol VARCHAR(30)
);

SELECT * FROM JSON_TABLE 
(ON (SELECT T.*
           FROM demo.Train T)
USING rowexpr('$.schools[*]')
               colexpr('[ {"jsonpath" : "$.name",
                           "type" : "CHAR(20)"},
                          {"jsonpath" : "$.type",
                           "type" : "VARCHAR(20)"}]')
)
AS JT;

SELECT * FROM JSON_TABLE 
(ON (SELECT T.*
           FROM demo.missingTable T)
USING rowexpr('$.schools[*]')
               colexpr('[ {"jsonpath" : "$.name",
                           "type" : "CHAR(20)"},
                          {"jsonpath" : "$.type",
                           "type" : "VARCHAR(20)"}]')
)
AS JT;
Copy
Código gerado:
 CREATE OR REPLACE TABLE demo.Train (
    firstCol INT,
    jsonCol VARIANT,
    thirdCol VARCHAR(30)
)
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "teradata",  "convertedOn": "12/16/2024",  "domain": "test" }}'
;

SELECT
    * FROM
    (
        SELECT
            firstCol,
            rowexpr.value:name :: CHAR(20) AS Column_0,
            rowexpr.value:type :: VARCHAR(20) AS Column_1,
            thirdCol
        FROM
            demo.Train T,
            TABLE(FLATTEN(INPUT => jsonCol:schools)) rowexpr
    ) JT;

    SELECT
    * FROM
    !!!RESOLVE EWI!!! /*** SSC-EWI-TD0060 - JSON_TABLE NOT TRANSFORMED, COLUMN NAMES COULD NOT BE RETRIEVED FROM SEMANTIC INFORMATION ***/!!! JSON_TABLE
   (ON (
        SELECT
            T.*
                  FROM
            demo.missingTable T)
   USING rowexpr('$.schools[*]')
                  colexpr('[ {"jsonpath" : "$.name",
                           "type" : "CHAR(20)"},
                          {"jsonpath" : "$.type",
                           "type" : "VARCHAR(20)"}]')
   )
   AS JT;
Copy

Práticas recomendadas

  • Verifique se o código fornecido para o SnowConvert AI está completo. Se você não forneceu a definição da tabela, execute o código novamente com a definição da tabela presente.

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

SSC-EWI-TD0061

A transformação TD_UNPIVOT requer informações de coluna que não puderam ser encontradas, resultando em colunas ausentes no resultado.

Gravidade

Low

Descrição

O SnowConvert AI não suporta e transforma a função TD_UNPIVOT, que pode ser utilizada para representar colunas de uma tabela como linhas.

Entretanto, essa transformação requer informações sobre as colunas da tabela/tabelas para funcionar, mais especificamente os nomes das colunas. Quando essas informações não estão presentes, a transformação pode ficar incompleta, com colunas ausentes no resultado. Este EWI é gerado nesses casos.

Exemplo de código

Código de entrada:
 CREATE TABLE unpivotTable  (
	myKey INTEGER NOT NULL PRIMARY KEY,
	firstSemesterIncome DECIMAL(10,2),
	secondSemesterIncome DECIMAL(10,2),
	firstSemesterExpenses DECIMAL(10,2),
	secondSemesterExpenses DECIMAL(10,2)
);

SELECT * FROM
 TD_UNPIVOT(
 	ON unpivotTable 
 	USING
 	VALUE_COLUMNS('Income', 'Expenses')
 	UNPIVOT_COLUMN('Semester')
 	COLUMN_LIST('firstSemesterIncome, firstSemesterExpenses', 'secondSemesterIncome, secondSemesterExpenses')
 	COLUMN_ALIAS_LIST('First', 'Second')
 )X ORDER BY mykey;

SELECT * FROM
 TD_UNPIVOT(
 	ON unknownTable
 	USING
 	VALUE_COLUMNS('MonthIncome')
 	UNPIVOT_COLUMN('Months')
 	COLUMN_LIST('januaryIncome', 'februaryIncome', 'marchIncome', 'aprilIncome')
 	COLUMN_ALIAS_LIST('January', 'February', 'March', 'April')
 )X ORDER BY yearKey;
Copy
Código gerado:
 CREATE OR REPLACE TABLE unpivotTable (
	myKey INTEGER NOT NULL PRIMARY KEY,
	firstSemesterIncome DECIMAL(10,2),
	secondSemesterIncome DECIMAL(10,2),
	firstSemesterExpenses DECIMAL(10,2),
	secondSemesterExpenses DECIMAL(10,2)
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"teradata"}}'
;

--** SSC-FDM-0007 - MISSING DEPENDENT OBJECTS "VALUE_COLUMNS", "UNPIVOT_COLUMN", "COLUMN_LIST", "COLUMN_ALIAS_LIST" **
SELECT
	* FROM
	(
		SELECT
			myKey,
			TRIM(GET_IGNORE_CASE(OBJECT_CONSTRUCT('FIRSTSEMESTERINCOME', 'First', 'FIRSTSEMESTEREXPENSES', 'First', 'SECONDSEMESTERINCOME', 'Second', 'SECONDSEMESTEREXPENSES', 'Second'), Semester), '"') AS Semester,
			Income,
			Expenses
		FROM
			unpivotTable UNPIVOT(Income FOR Semester IN (
				firstSemesterIncome,
				secondSemesterIncome
			)) UNPIVOT(Expenses FOR Semester1 IN (
				firstSemesterExpenses,
				secondSemesterExpenses
			))
		WHERE
			Semester = 'FIRSTSEMESTERINCOME'
			AND Semester1 = 'FIRSTSEMESTEREXPENSES'
			OR Semester = 'SECONDSEMESTERINCOME'
			AND Semester1 = 'SECONDSEMESTEREXPENSES'
	) X ORDER BY mykey;

	--** SSC-FDM-0007 - MISSING DEPENDENT OBJECTS "VALUE_COLUMNS", "UNPIVOT_COLUMN", "COLUMN_LIST", "COLUMN_ALIAS_LIST" **
	SELECT
	* FROM
	!!!RESOLVE EWI!!! /*** SSC-EWI-TD0061 - TD_UNPIVOT TRANSFORMATION REQUIRES COLUMN INFORMATION THAT COULD NOT BE FOUND, COLUMNS MISSING IN RESULT ***/!!!
	(
		SELECT
			TRIM(GET_IGNORE_CASE(OBJECT_CONSTRUCT('JANUARYINCOME', 'January', 'FEBRUARYINCOME', 'February', 'MARCHINCOME', 'March', 'APRILINCOME', 'April'), Months), '"') AS Months,
			MonthIncome
		FROM
			unknownTable UNPIVOT(MonthIncome FOR Months IN (
				januaryIncome,
				februaryIncome,
				marchIncome,
				aprilIncome
			))
	) X ORDER BY yearKey;
Copy

Práticas recomendadas

  • Existem duas maneiras de fornecer informações sobre as colunas para a ferramenta de conversão: colocar a especificação da tabela no mesmo arquivo que a chamada TD_UNPIVOT ou especificar uma lista de colunas na consulta SELECT da expressão ON em vez de SELECT * ou o nome da tabela.

  • Esse problema poderá ser ignorado com segurança se ALL as colunas da tabela/tabelas de entrada forem desempilhadas; caso contrário, o resultado terá colunas ausentes.

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

SSC-EWI-TD0063

O caminho JSON não foi reconhecido.

Nota

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

Gravidade

Medium

Descrição

Esta mensagem é exibida quando o SnowConvert AI não consegue desserializar um caminho JSON porque a cadeia de caracteres não tem o formato JSON esperado.

Exemplo de código

Código de entrada:
 SELECT
    *
FROM
JSON_TABLE (
    ON (
        SELECT
            id,
            trainSchedule as ts
        FROM
            demo.PUBLIC.Train T
    ) USING rowexpr('$weekShedule.Monday[*]') colexpr(
        '[{"jsonpath"  "$.time",
              "type"" : "CHAR ( 12 )"}]'
    )
) AS JT(Id, Ordinal, Time, City);
Copy
Código gerado:
 SELECT
    *
FROM
    !!!RESOLVE EWI!!! /*** SSC-EWI-TD0063 - UNRECOGNIZED JSON PATH $weekShedule.Monday[*] ***/!!!
JSON_TABLE (
    ON
       !!!RESOLVE EWI!!! /*** SSC-EWI-0108 - THE FOLLOWING SUBQUERY MATCHES AT LEAST ONE OF THE PATTERNS CONSIDERED INVALID AND MAY PRODUCE COMPILATION ERRORS ***/!!! (
           SELECT
               id,
               trainSchedule as ts
FROM
               demo.PUBLIC.Train T
    ) USING rowexpr('$weekShedule.Monday[*]') colexpr(
        '[{"jsonpath"  "$.time",
              "type"" : "CHAR ( 12 )"}]'
    )
) AS JT(Id, Ordinal, Time, City);
Copy

Práticas recomendadas

  • Verifique se o caminho JSON contém um caractere inesperado ou não tem o formato correto.

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

SSC-EWI-TD0066

O identificador a seguir tem um ou mais caracteres de escape Unicode inválidos no Snowflake.

Nota

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

Gravidade

Low

Descrição

Esta mensagem é exibida quando o SnowConvert AI transforma um identificador delimitado Unicode do Teradata com caracteres inválidos no Snowflake.

Exemplo de código

Código de entrada:
 SELECT * FROM U&"#000f#ffff" UESCAPE '#';
Copy
Código gerado:
 // SnowConvert AI Helpers Code section is omitted.
SELECT
* FROM
!!!RESOLVE EWI!!! /*** SSC-EWI-TD0066 - THE FOLLOWING IDENTIFIER HAS ONE OR MORE UNICODE ESCAPE CHARACTERS THAT ARE INVALID IN SNOWFLAKE ***/!!!
"\u000f\uffff";
Copy

Práticas recomendadas

SSC-EWI-TD0068

O Snowflake não é compatível com perfis; em vez disso, utiliza a função como referência.

Gravidade

Medium

Descrição

Os perfis do Teradata permitem a definição de vários parâmetros comuns relacionados ao gerenciamento de espaço de armazenamento e restrições de senha.

No entanto, o Snowflake funciona com arquitetura em nuvem e automaticamente gerencia e otimiza o armazenamento, o que significa que nenhuma personalização de armazenamento é feita pelo usuário. Além disso, o Snowflake tem atualmente uma política de senhas definida que se aplica a todas as senhas de usuário e não pode ser modificada.

Esse erro é gerado quando uma referência a um perfil do Teradata indica que ele foi alterado para uma referência à função do usuário, que é a maior aproximação de um perfil no Snowflake, embora possa haver diferenças nos resultados da consulta, a menos que os nomes do perfil e da função de um usuário sejam os mesmos.

Exemplo de código

Código de entrada:
 SELECT PROFILE;
Copy
Código gerado:
 SELECT
CURRENT_ROLE() !!!RESOLVE EWI!!! /*** SSC-EWI-TD0068 - SNOWFLAKE DOES NOT SUPPORT PROFILES, REFERENCING ROLE INSTEAD ***/!!!;
Copy

Práticas recomendadas

  • Evite fazer referência a perfis de usuário, pois eles não são compatíveis e os resultados da consulta serão diferentes, a menos que o usuário tenha o mesmo nome tanto no perfil quanto na função.

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

SSC-EWI-TD0069

Os resultados de ST_DISTANCE são ligeiramente diferentes dos de ST_SPHERICALDISTANCE

Nota

Esta EWI está obsoleta. Consulte a documentação SSC-FDM-TD0031.

Gravidade

Low

Descrição

A função ST_SPHERICALDISTANCE do Teradata calcula a distância entre duas coordenadas esféricas no planeta usando a fórmula de Haversine, enquanto a função ST_DISTANCE do Snowflake não utiliza a fórmula de Haversine para calcular a distância mínima entre dois pontos geográficos.

Exemplo de código

Código de entrada:
 --The distance between New York and Los Angeles
Select Cast('POINT(-73.989308 40.741895)' As ST_GEOMETRY) As location1,
	Cast('POINT(40.741895 34.053691)' As ST_GEOMETRY) As location2,
	location1.ST_SPHERICALDISTANCE(location2) As Distance_In_km;
Copy
Código gerado
 --The distance between New York and Los Angeles
SELECT
	Cast('POINT(-73.989308 40.741895)' As GEOGRAPHY) As location1,
	Cast('POINT(40.741895 34.053691)' As GEOGRAPHY) As location2,
	!!!RESOLVE EWI!!! /*** SSC-EWI-TD0069 - ST_DISTANCE RESULTS ARE SLIGHTLY DIFFERENT FROM ST_SPHERICALDISTANCE ***/!!!
	ST_DISTANCE(
	location1, location2) As Distance_In_km;
Copy

Práticas recomendadas

SSC-EWI-TD0070

Uma instrução de retorno foi adicionada no fim da seção do rótulo para garantir o mesmo fluxo de execução

Nota

Esta EWI está obsoleta. Consulte a documentação SSC-FDM-TD0030.

Gravidade

Medium

Descrição

Quando uma instrução Goto é substituída por uma seção de rótulo e não contém uma instrução de retorno, uma é adicionada no fim da seção para garantir o mesmo fluxo de execução.

BTEQ após a execução de um comando Goto, as instruções entre o comando goto e o comando de rótulo com o mesmo nome são ignoradas. Portanto, para evitar que essas instruções sejam executadas, a seção de rótulo deve conter uma instrução de retorno.

Além disso, vale a pena mencionar que o comando Goto ignora todas as outras instruções, exceto o rótulo com o mesmo nome, que é quando a execução é retomada. Portanto, a execução nunca será retomada em uma seção de rótulo definida antes do comando Goto.

Exemplo de código

Código de entrada:
 -- Additional Params: --scriptsTargetLanguage SnowScript
.LOGON dbc,dbc;
select 'STATEMENTS';
.GOTO LABEL_B
select 'IGNORED STATEMENTS';
.label LABEL_B
select 'LABEL_B STATEMENTS';
Copy
Código gerado
 EXECUTE IMMEDIATE
$$
  DECLARE
    STATUS_OBJECT OBJECT := OBJECT_CONSTRUCT('SQLCODE', 0);
  BEGIN
    --.LOGON dbc,dbc
    !!!RESOLVE EWI!!! /*** SSC-EWI-0073 - PENDING FUNCTIONAL EQUIVALENCE REVIEW FOR 'BTLogOn' NODE ***/!!!
    null;
    BEGIN
      SELECT
        'STATEMENTS';
      STATUS_OBJECT := OBJECT_CONSTRUCT('SQLROWCOUNT', SQLROWCOUNT);
    EXCEPTION
      WHEN OTHER THEN
        STATUS_OBJECT := OBJECT_CONSTRUCT('SQLCODE', SQLCODE, 'SQLERRM', SQLERRM, 'SQLSTATE', SQLSTATE);
    END;
     
    /*.label LABEL_B*/
     
    BEGIN
      SELECT
        'LABEL_B STATEMENTS';
      STATUS_OBJECT := OBJECT_CONSTRUCT('SQLROWCOUNT', SQLROWCOUNT);
    EXCEPTION
      WHEN OTHER THEN
        STATUS_OBJECT := OBJECT_CONSTRUCT('SQLCODE', SQLCODE, 'SQLERRM', SQLERRM, 'SQLSTATE', SQLSTATE);
    END;
    !!!RESOLVE EWI!!! /*** SSC-EWI-TD0070 - A RETURN STATEMENT WAS ADDED AT THE END OF THE LABEL SECTION LABEL_B TO ENSURE THE SAME EXECUTION FLOW ***/!!!
    RETURN 0;
    BEGIN
      SELECT
        'IGNORED STATEMENTS';
      STATUS_OBJECT := OBJECT_CONSTRUCT('SQLROWCOUNT', SQLROWCOUNT);
    EXCEPTION
      WHEN OTHER THEN
        STATUS_OBJECT := OBJECT_CONSTRUCT('SQLCODE', SQLCODE, 'SQLERRM', SQLERRM, 'SQLSTATE', SQLSTATE);
    END;
    /*.label LABEL_B*/
    --** SSC-FDM-0027 - REMOVED NEXT STATEMENT, NOT APPLICABLE IN SNOWFLAKE.  **
     
    BEGIN
      SELECT
        'LABEL_B STATEMENTS';
      STATUS_OBJECT := OBJECT_CONSTRUCT('SQLROWCOUNT', SQLROWCOUNT);
    EXCEPTION
      WHEN OTHER THEN
        STATUS_OBJECT := OBJECT_CONSTRUCT('SQLCODE', SQLCODE, 'SQLERRM', SQLERRM, 'SQLSTATE', SQLSTATE);
    END;
  END
$$
Copy

Práticas recomendadas

SSC-EWI-TD0076

O uso de tabelas estrangeiras não é compatível com o Snowflake.

Gravidade

Medium

Descrição

Tabelas estrangeiras permitem o acesso a dados em armazenamento de objetos externo, como dados semiestruturados e não estruturados no Amazon S3, Azure Blob Storage e Google Cloud Storage. Essa sintaxe não é compatível com o Snowflake. No entanto, existem outras alternativas no Snowflake que podem ser utilizadas, como tabelas externas, tabelas Iceberg e tabelas padrão.

Exemplo de código

Código de entrada:
 SELECT cust_id, income, age FROM 
FOREIGN TABLE (SELECT cust_id, income, age FROM twm_customer)@hadoop1 T1;
Copy
Código gerado:
 SELECT
cust_id,
income,
age FROM
!!!RESOLVE EWI!!! /*** SSC-EWI-TD0076 - THE USE OF FOREIGN TABLES IS NOT SUPPORTED IN SNOWFLAKE. ***/!!!
 FOREIGN TABLE (SELECT cust_id, income, age FROM twm_customer)@hadoop1 T1;
Copy

Práticas recomendadas

  • Em vez das tabelas estrangeiras no Teradata, você pode usar tabelas externas do Snowflake. Tabelas externas fazem referência a arquivos de dados localizados em um data lake de armazenamento em nuvem (Amazon S3, Google Cloud Storage ou Microsoft Azure). Isso permite consultar dados armazenados em arquivos de um data lake como se ele estivesse em um banco de dados. Tabelas externas podem acessar dados armazenados em qualquer formato compatível com instruções COPY INTO <table>.

  • Outra alternativa são as tabelas Iceberg do Snowflake. Portanto, você pode pensar nas tabelas Iceberg como tabelas que usam formatos abertos e armazenamento em nuvem fornecido pelo cliente. Esses dados são armazenados em arquivos Parquet.

  • Por fim, existem as tabelas padrão do Snowflake, que podem ser uma opção para cobrir a funcionalidade de tabelas estrangeiras no Teradata.

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

SSC-EWI-TD0077

A cláusula RESET WHEN não é compatível com este cenário devido à sua condição.

Nota

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

Gravidade

Medium

Descrição

Atualmente, o SnowConvert AI é compatível apenas com cláusulas RESET WHEN com condições binárias (<=, >= ou =). Com qualquer outro tipo de condição, como IS NOT NULL, a cláusula RESET WHEN será removida e uma mensagem de erro será adicionada, pois isso não é compatível com o Snowflake.

Esta mensagem de erro também aparece quando a condição RESET WHEN faz referência a uma expressão cuja definição não foi encontrada pela ferramenta de migração. Atualmente, a ferramenta é compatível com referências de alias para uma coluna que foi definida na mesma consulta.

Exemplo de código

A condição não é binária
Código de entrada:
 SELECT
    account_id,
    month_id,
    balance,
    ROW_NUMBER() OVER (
        PARTITION BY account_id
        ORDER BY month_id
        RESET WHEN balance IS NOT NULL
        ROWS UNBOUNDED PRECEDING
    ) as balance_increase
FROM account_balance
ORDER BY 1,2;
Copy
Código gerado
 // SnowConvert AI Helpers Code section is omitted.
SELECT
    account_id,
    month_id,
    balance,
    ROW_NUMBER() OVER (
        PARTITION BY account_id
    !!!RESOLVE EWI!!! /*** SSC-EWI-TD0077 - RESET WHEN CLAUSE IS NOT SUPPORTED IN THIS SCENARIO DUE TO ITS CONDITION ***/!!!
        ORDER BY month_id
        ROWS UNBOUNDED PRECEDING
    ) as balance_increase
FROM
    account_balance
ORDER BY 1,2;
Copy
A expressão da condição não foi encontrada
Código de entrada:
 SELECT
    account_id,
    month_id,
    balance,
    ROW_NUMBER() OVER (
        PARTITION BY account_id
        ORDER BY month_id
        RESET WHEN balance <= not_found_expresion
    ) as balance_increase
FROM account_balance
ORDER BY 1,2;
Copy
Código gerado
 // SnowConvert AI Helpers Code section is omitted.
SELECT
    account_id,
    month_id,
    balance,
    ROW_NUMBER() OVER (
        PARTITION BY account_id
    !!!RESOLVE EWI!!! /*** SSC-EWI-TD0077 - RESET WHEN CLAUSE IS NOT SUPPORTED IN THIS SCENARIO DUE TO ITS CONDITION ***/!!!
        ORDER BY month_id
    ) as balance_increase
FROM
    account_balance
ORDER BY 1,2;
Copy

Práticas recomendadas

SSC-EWI-TD0079

A coluna de tipo de período necessária não foi encontrada.

Nota

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

Gravidade

Low

Descrição

Este aviso é exibido porque a coluna de período necessária para replicar a funcionalidade da cláusula Normalize não foi encontrada.

Exemplo de código

Código de entrada:
 SELECT NORMALIZE emp_id, duration2 FROM project;
Copy
Código gerado
 !!!RESOLVE EWI!!! /*** SSC-EWI-TD0079 - THE REQUIRED PERIOD TYPE COLUMN WAS NOT FOUND ***/!!!
// SnowConvert AI Helpers Code section is omitted.
WITH NormalizeCTE AS
(
SELECT
T1.*,
SUM(GroupStartFlag)
OVER (
PARTITION BY
emp_id, duration2
ORDER BY
PeriodColumn_begin
ROWS UNBOUNDED PRECEDING) GroupID
FROM
(
SELECT 
emp_id,
duration2,
PUBLIC.PERIOD_BEGIN_UDF(PeriodColumn) PeriodColumn_begin,
PUBLIC.PERIOD_END_UDF(PeriodColumn) PeriodColumn_end,
(CASE
WHEN PeriodColumn_begin <= LAG(PeriodColumn_end)
OVER (
PARTITION BY
emp_id, duration2
ORDER BY
PeriodColumn_begin,
PeriodColumn_end)
THEN 0
ELSE 1
END) GroupStartFlag FROM 
project
) T1
)
SELECT
emp_id,
duration2,
PUBLIC.PERIOD_UDF(MIN(PeriodColumn_begin), MAX(PeriodColumn_end))
FROM
NormalizeCTE
GROUP BY
emp_id,
duration2,
GroupID;
Copy

Práticas recomendadas

  • Para corrigir este aviso manualmente, basta encontrar qual era a primeira coluna de período e remover todas as referências dela, exceto onde ela é definida, e então substituir PeriodColumn pela coluna encontrada.

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

SSC-EWI-TD0082

A função Translate com o uso da codificação atual não é compatível.

Gravidade

Medium

Descrição

O uso da função Translate com os argumentos de codificação atuais não é compatível com o Snowflake. A função é transformada em comentário durante a tradução.

Exemplo de código

Código de entrada:
 SELECT Translate('abc' USING KANJISJIS_TO_LATIN);
Copy
Código gerado
 SELECT
!!!RESOLVE EWI!!! /*** SSC-EWI-TD0082 - TRANSLATE FUNCTION USING KANJISJIS_TO_LATIN ENCODING IS NOT SUPPORTED ***/!!!
Translate('abc' USING KANJISJIS_TO_LATIN);
Copy

Práticas recomendadas

SSC-EWI-TD0083

Não é possível transformar duas ou mais cláusulas Select complexas de uma só vez.

Nota

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

Gravidade

Medium

Descrição

O SnowConvert AI não consegue transformar duas ou mais cláusulas SELECT complexas, pois é necessário mapeá-las para uma cláusula FROM composta ou CTE, o que faz com que o código mapeado não seja compilado ou entre em um ciclo lógico.

O que consideramos uma cláusula SELECT complexa?

Aquelas que precisam ser mapeadas para uma cláusula FROM composta ou CTE, como NORMALIZE, EXPAND ON ou RESET WHEN.

Exemplo de código

Código de entrada:
 SELECT 
   NORMALIZE emp_id,
   duration,
   dept_id, 
   balance, 
   (
     ROW_NUMBER() OVER (
       PARTITION BY emp_id 
       ORDER BY 
         dept_id RESET WHEN balance <= SUM(balance) OVER (
           PARTITION BY emp_id 
           ORDER BY dept_id
           ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING
         )
     ) -1
   ) AS balance_increase 
FROM project
EXPAND ON duration AS bg BY ANCHOR ANCHOR_SECOND
ORDER BY 1, 2;
Copy
Código gerado
 // SnowConvert AI Helpers Code section is omitted.
SELECT
!!!RESOLVE EWI!!! /*** SSC-EWI-TD0083 - NOT ABLE TO TRANSFORM TWO OR MORE COMPLEX SELECT CLAUSES AT A TIME ***/!!!
NORMALIZE emp_id,
   duration,
   dept_id,
   balance,
   (
     ROW_NUMBER() OVER (
   PARTITION BY
      emp_id, new_dynamic_part
   ORDER BY
         dept_id
     ) -1
   ) AS balance_increase
FROM
   (
      SELECT
         emp_id,
         duration,
         dept_id,
         balance,
         previous_value,
         SUM(dynamic_part) OVER (
                 PARTITION BY emp_id
                 ORDER BY dept_id
         ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
               ) AS new_dynamic_part
      FROM
         (
            SELECT
               emp_id,
               duration,
               dept_id,
               balance,
               SUM(balance) OVER (
                       PARTITION BY emp_id
                       ORDER BY dept_id
                       ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING
                     ) AS previous_value,
               (CASE
                  WHEN balance <= previous_value
                     THEN 1
                  ELSE 0
               END) AS dynamic_part
            FROM
               project
         )
   )
!!!RESOLVE EWI!!! /*** SSC-EWI-TD0083 - NOT ABLE TO TRANSFORM TWO OR MORE COMPLEX SELECT CLAUSES AT A TIME ***/!!!
EXPAND ON duration AS bg BY ANCHOR ANCHOR_SECOND
ORDER BY 1, 2;
Copy

Práticas recomendadas

SSC-EWI-TD0087

A instrução GOTO foi removida devido à inversão da instrução if.

Nota

Esta EWI está obsoleta. Consulte a documentação SSC-FDM-TD0026

Nota

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

Gravidade

Medium

Descrição

É comum usar o comando GOTO com os comandos IF e LABEL para replicar a funcionalidade de uma instrução SQL if. Quando utilizados dessa forma, é possível transformá-los diretamente em uma instrução if, if-else ou até mesmo if-elseif-else. No entanto, nesses casos, os comandos GOTO tornam-se desnecessários e devem ser removidos para evitar que sejam substituídos por uma seção LABEL.

Exemplo de código

Código de entrada:
-- Additional Params: --scriptsTargetLanguage SnowScript
.If ActivityCount = 0 THEN .GOTO endIf
DROP TABLE TABLE1;
.Label endIf
SELECT A FROM TABLE1;
Código gerado
 EXECUTE IMMEDIATE
$$
  DECLARE
    STATUS_OBJECT OBJECT := OBJECT_CONSTRUCT('SQLCODE', 0);
  BEGIN
    IF (NOT (STATUS_OBJECT['SQLROWCOUNT'] = 0)) THEN
      !!!RESOLVE EWI!!! /*** SSC-EWI-TD0087 - GOTO endIf WAS REMOVED DUE TO IF STATEMENT INVERSION ***/!!!
       
      BEGIN
        DROP TABLE TABLE1;
        STATUS_OBJECT := OBJECT_CONSTRUCT('SQLROWCOUNT', SQLROWCOUNT);
      EXCEPTION
        WHEN OTHER THEN
          STATUS_OBJECT := OBJECT_CONSTRUCT('SQLCODE', SQLCODE, 'SQLERRM', SQLERRM, 'SQLSTATE', SQLSTATE);
      END;
    END IF;
    /*.Label endIf*/
    --** SSC-FDM-0027 - REMOVED NEXT STATEMENT, NOT APPLICABLE IN SNOWFLAKE.  **
     
    BEGIN
      SELECT
        A
      FROM
        TABLE1;
      STATUS_OBJECT := OBJECT_CONSTRUCT('SQLROWCOUNT', SQLROWCOUNT);
    EXCEPTION
      WHEN OTHER THEN
        STATUS_OBJECT := OBJECT_CONSTRUCT('SQLCODE', SQLCODE, 'SQLERRM', SQLERRM, 'SQLSTATE', SQLSTATE);
    END;
  END
$$
Copy

Práticas recomendadas

SSC-EWI-TD0091

Expressão convertida como cast com possíveis erros devido a dependências ausentes.

Nota

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

Gravidade

Medium

Descrição

Em scripts do Teradata, você pode usar a seguinte sintaxe para expressões CAST:

<expression> ( <DataType> )

Copy

Infelizmente, essa sintaxe gera ambiguidade ao tentar converter CAST em DATE ou TIME, já que essas palavras-chave também se comportam como as funções CURRENT_DATE e CURRENT_TIME, respectivamente.

Assim, sem contexto sobre a expressão a ser CAST, não há como diferenciar com certeza quando estamos lidando com um caso real de CAST ou com uma função que aceita DATE ou TIME como parâmetros.

Em outras palavras, é necessário saber se <expression> é uma coluna ou uma função definida pelo usuário (UDF). Para conseguir isso, ao converter o código, é preciso adicionar CREATE TABLE ou CREATE FUNCTION dos quais <expression> depende.

Por exemplo, verifique a seguinte instrução SELECT. Sem contexto sobre AMBIGUOUS_EXPR, não temos como determinar se estamos lidando com uma chamada de função ou com CAST para DATE. No entanto, sabemos que COL1 (DATE) é de fato uma CAST, já que COL1 é uma coluna da tabela TAB.

CREATE TABLE TAB (
    COL1 VARCHAR(23)
)

SELECT 
    COL1 (DATE),
    AMBIGUOUS_EXPR (DATE)
FROM TAB;

Copy

Exemplo de código

Código de entrada:
 CREATE TABLE TAB (
    COL1 VARCHAR(23)
)

SELECT 
    COL1 (DATE),
    AMBIGUOUS_EXPR (DATE)
FROM TAB;
Copy
Código gerado
 CREATE OR REPLACE TABLE TAB (
    COL1 VARCHAR(23)
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"teradata"}}'
;

SELECT
    TO_DATE(
    COL1, 'YYYY/MM/DD') AS COL1,
    !!!RESOLVE EWI!!! /*** SSC-EWI-TD0091 - EXPRESSION CONVERTED AS CAST BY DEFAULT. CONVERSION MIGHT PRESENT ERRORS DUE TO MISSING DEPENDENCIES FOR 'AMBIGUOUS_EXPR'. ***/!!!
    AMBIGUOUS_EXPR :: DATE
    FROM
    TAB;
Copy

Práticas recomendadas

SSC-EWI-TD0092

A tradução para tabela/exibição integrada do Teradata não é compatível atualmente.

Gravidade

Low

Descrição

Este EWI é adicionado quando o SnowConvert AI encontra uma tabela de sistema do Teradata que não está traduzida no momento.

Exemplo de código

Código de entrada:
 SELECT
  CRLF || 
  TRIM(em.ErrorText) INTO :MsgText
FROM
  DBC.ErrorMsgs em
WHERE
  em.ErrorCode = SUBSTR(:SqlStateCode, 2, 4)
Copy
Código gerado
 SELECT
  CRLF ||
  TRIM(em.ErrorText) INTO :MsgText
FROM
  !!!RESOLVE EWI!!! /*** SSC-EWI-TD0092 - TRANSLATION FOR TERADATA BUILT-IN TABLE/VIEW DBC.ErrorMsgs IS NOT CURRENTLY SUPPORTED. ***/!!!
  DBC.ErrorMsgs em
WHERE
  UPPER(RTRIM(
  em.ErrorCode)) = UPPER(RTRIM(SUBSTR(:SqlStateCode, 2, 4)));
Copy

Práticas recomendadas

  • Pesquise por equivalentes nas tabelas internas do Snowflake, como Information_Schema ou SNOWFLAKE.ACCOUNT_USAGE.

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

SSC-EWI-TD0093

Formato não compatível; deve ser atualizado em todos os usos de conversão varchar.

Gravidade

High

Descrição

Este EWI é adicionado quando a função CAST é utilizada para converter uma expressão numérica para outro tipo numérico com um formato especificado. Embora o formato não afete o valor numérico em si, se o resultado for posteriormente convertido para uma cadeia de caracteres, o formato pretendido não será aplicado corretamente. Portanto, é necessário atualizar todas as instâncias em que o resultado é convertido para VARCHAR, garantindo que o formato definido no EWI seja utilizado.

Exemplo de código

Código de entrada:
SELECT
   CAST(245222.32 AS FORMAT '-(10)9.9(4)') AS FormattedAmount,
   CAST(FormattedAmount AS VARCHAR(30));
Copy
Código gerado
SELECT
   245222.32 !!!RESOLVE EWI!!! /*** SSC-EWI-TD0093 - FORMAT '-(10)9.9(4)' IS NOT SUPPORTED AND MUST BE UPDATED TO THE FOLLOWING FORMAT 'S9999999999.0000' IN ALL VARCHAR CAST USAGES. ***/!!! AS FormattedAmount,
   LEFT(LTRIM(TO_VARCHAR(FormattedAmount, 'MI0.00000000000000EEEEE')), 10);
Copy

Práticas recomendadas