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;
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;
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;
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;
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;
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;
Best Practices
Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com
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;
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;
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çãoCOLLATEe 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;
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;
$$;
Best Practices
Verifique as possíveis instruções que podem gerar o código de exceção e encapsule-as em um bloco de código semelhante ao visto em Referência de tradução do manipulador Continue.
Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com
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
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()
Best Practices
Para mais informações, consulte a especificação de tradução de BTEQ para Python.
Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com
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"}}'
;
Best Practices
Não são necessárias ações adicionais do usuário.
Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com
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;
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;
Diferenças de comportamento esperadas
Plataforma |
Comportamento de agrupamento |
Exemplo de linhas de resultado |
|---|---|---|
Modo Teradata |
Agrupa «John», «JOHN» e «john» |
|
Snowflake |
Trata «John», «JOHN» e «john» como separados |
|
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));
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' );
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;
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;
Best Practices
Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com
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);
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"}}'
;
Best Practices
Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com
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
);
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"}}'
;
Best Practices
Como a cláusula
UPPERCASEindica 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
)
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"}}'
;
Best Practices
Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com
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
)
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"}}'
;
Best Practices
Nota: Pode ser possível replicar algumas funcionalidades de rastreamento no Snowflake usando um
EVENT TABLE. Consulte a seguinte documentação do Snowflake sobre registro e rastreamento.Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com
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);
Snowflake Scripting:¶
SELECT
!!!RESOLVE EWI!!! /*** SSC-EWI-0009 - REGEXP_SUBSTR FUNCTION ONLY SUPPORTS POSIX REGULAR EXPRESSIONS ***/!!!
REGEXP_SUBSTR('qaqequ','q(?=u)', 1, 1);
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()));
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;
$$;
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;
$$;
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;
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;
$$;
Práticas recomendadas¶
Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com
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;
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;
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
);
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"}}'
;
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
);
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"}}'
;
Práticas recomendadas¶
Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com
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
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
Práticas recomendadas¶
Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com
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`);
}
$$;
Práticas recomendadas¶
Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com
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');
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 ***/!!!;
Práticas recomendadas¶
Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com
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)'
);
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" }}'
;
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);
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. ***/!!!;
Práticas recomendadas¶
Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com
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;
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;
Práticas recomendadas¶
Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com
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() );
);
);
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()
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
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
Exemplo de código:¶
Código de entrada:¶
create table sampleTable(
byteColumn byte(10),
varbyteColumn varbyte(15)
);
select bytes(byteColumn), bytes(varbyteColumn) from sampleTable;
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;
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;
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;
Práticas recomendadas¶
Não são necessárias ações adicionais do usuário.
Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com
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 |
|---|---|
|
|
|
|
|
|
Altere os parâmetros de sessão
TIMESTAMP_NTZ_OUTPUT_FORMATeTIME_OUTPUT_FORMAT: Os comandosALTER SESSION SET TIMESTAMP_NTZ_OUTPUT_FORMAT = <format>eALTER 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;
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;
Práticas recomendadas¶
Como o comportamento de
PERIODe 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ãoWEEK_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ãoWEEK_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);
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 ***/!!!;
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_TZpara evitar comportamentos diferentes. Lembre-se também de que o tipoTIMEnã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);
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);
Práticas recomendadas¶
Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com
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;
Código gerado:¶
!!!RESOLVE EWI!!! /*** SSC-EWI-TD0059 - SNOWFLAKE USER DEFAULT TIME ZONE MAY REQUIRE CONFIGURATION TO MATCH TERADATA VALUE ***/!!!
ALTER SESSION UNSET TIMEZONE;
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;
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;
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;
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;
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);
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);
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 '#';
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";
Práticas recomendadas¶
Use identificadores com caracteres Unicode válidos no Snowflake.
Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com
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;
Código gerado:¶
SELECT
CURRENT_ROLE() !!!RESOLVE EWI!!! /*** SSC-EWI-TD0068 - SNOWFLAKE DOES NOT SUPPORT PROFILES, REFERENCING ROLE INSTEAD ***/!!!;
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;
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;
Práticas recomendadas¶
Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com
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';
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
$$
Práticas recomendadas¶
Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com
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;
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;
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;
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;
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;
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;
Práticas recomendadas¶
Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com
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;
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;
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);
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);
Práticas recomendadas¶
Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com
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;
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;
Práticas recomendadas¶
Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com
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
$$
Práticas recomendadas¶
Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com
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> )
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;
Exemplo de código¶
Código de entrada:¶
CREATE TABLE TAB (
COL1 VARCHAR(23)
)
SELECT
COL1 (DATE),
AMBIGUOUS_EXPR (DATE)
FROM TAB;
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;
Práticas recomendadas¶
Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com
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)
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)));
Práticas recomendadas¶
Pesquise por equivalentes nas tabelas internas do Snowflake, como
Information_SchemaouSNOWFLAKE.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));
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);
Práticas recomendadas¶
Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com