SnowConvert: Problemas do Teradata¶
SSC-EWI-TD0069¶
Esse indicador de aviso antecipado (EWI) não é mais suportado. Consulte a documentação SSC-FDM-TD0031 para obter informações atualizadas.
Gravidade¶
Low
Descrição¶
A função do Teradata ST_SPHERICALDISTANCE e a função do Snowflake ST_DISTANCE calculam as distâncias entre os pontos geográficos de forma diferente. O Teradata usa a fórmula de Haversine para medir a distância entre dois pontos em uma esfera (como a Terra), enquanto ST_DISTANCE do Snowflake usa um método diferente para determinar a distância mínima entre duas coordenadas geográficas.
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 de saída¶
--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;
Recomendações¶
Para obter suporte adicional, entre em contato com nossa equipe de suporte pelo e-mail snowconvert-support@snowflake.com
SSC-EWI-TD0079¶
Partes do código de saída foram removidas para tornar o exemplo mais claro e fácil de seguir.
Gravidade¶
Low
Descrição¶
Esse aviso aparece porque a coluna «Period» necessária para replicar a funcionalidade da cláusula Normalize não pôde ser encontrada.
Exemplo de código¶
Código de entrada:¶
SELECT NORMALIZE emp_id, duration2 FROM project;
Código de saída¶
!!!RESOLVE EWI!!! /*** SSC-EWI-TD0079 - THE REQUIRED PERIOD TYPE COLUMN WAS NOT FOUND ***/!!!
// SnowConvert 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;
Recomendações¶
Para resolver esse aviso, localize a primeira coluna de período em seu código e remova todas as referências a ela, exceto onde estiver inicialmente definida. Em seguida, substitua “PeriodColumn” pelo nome da coluna que você encontrou.
Para obter assistência adicional, entre em contato conosco pelo e-mail snowconvert-support@snowflake.com
SSC-EWI-TD0008¶
Gravidade¶
Low
Descrição¶
Atualmente, o Snowflake não tem equivalentes diretos para determinadas funções de comparação de cadeias de caracteres.
Esse EWI aparece quando você usa qualquer um desses métodos de comparação de cadeias de caracteres: jaro, n_gram, LD (Levenshtein Distance), LDWS (Levenshtein Distance with Substitution), OSA (Optimal String Alignment), DL (Damerau-Levenshtein), hamming, LCS (Longest Common Subsequence), jaccard, cosine ou soundexcode.
Exemplo de código¶
O Teradata é um sistema de gerenciamento de banco de dados relacional especializado em lidar com armazenamento e análise de dados em grande escala.¶
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;
Recomendações¶
Para obter suporte adicional, entre em contato com nossa equipe de suporte pelo e-mail snowconvert-support@snowflake.com
SSC-EWI-TD0059¶
Gravidade¶
Low
Descrição¶
De forma semelhante ao Teradata, quando você define um fuso horário padrão para um usuário, todas as suas sessões usarão esse fuso horário até que um fuso horário diferente seja especificado para a sessão.
Esse aviso lembra você de definir o mesmo fuso horário no Snowflake que foi definido anteriormente para o seu usuário Teradata. Para definir o fuso horário no Snowflake, execute a seguinte consulta:
ALTER SESSION SET TIMEZONE = 'equivalent_timezone'
Observação: O Snowflake só aceita fusos horários do banco de dados de fusos horários do IANA.
Exemplo de código¶
Código de entrada:¶
SET TIME ZONE USER;
Código de saída:¶
!!!RESOLVE EWI!!! /*** SSC-EWI-TD0059 - SNOWFLAKE USER DEFAULT TIME ZONE MAY REQUIRE CONFIGURATION TO MATCH TERADATA VALUE ***/!!!
ALTER SESSION UNSET TIMEZONE;
Recomendações¶
Certifique-se de configurar o fuso horário padrão do usuário para corresponder à configuração de fuso horário do usuário original do Teradata.
Para obter assistência adicional, entre em contato conosco pelo e-mail snowconvert-support@snowflake.com
SSC-EWI-TD0049¶
Gravidade¶
High
Descrição¶
A ferramenta não conseguiu processar e converter uma instrução DML em TPT. Isso geralmente ocorre quando:
As variáveis de script são concatenadas na instrução
A instrução contém aspas escapadas
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 de saída:¶
#*** Generated code is based on the SnowConvert 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()
Recomendações¶
Para resolver esse problema, você pode escrever manualmente a instrução INSERT ou entrar em contato com a equipe do SnowConvert para solicitar suporte para essa instrução DML específica, pois ela não é suportada no momento.
Para obter assistência adicional, envie-nos um e-mail para snowconvert-support@snowflake.com
SSC-EWI-TD0009¶
Gravidade¶
Low
Descrição¶
As tabelas temporais do Teradata usam colunas de períodos derivados para rastrear dados baseados em tempo no nível da coluna. Esse recurso não está disponível no Snowflake no momento.
Exemplo de código¶
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"}}'
;
Recomendações¶
Para obter suporte adicional, entre em contato conosco pelo e-mail snowconvert-support@snowflake.com
SSC-EWI-TD0039¶
Gravidade¶
Medium
Descrição¶
O formato de arquivo que você está tentando usar não é compatível com o Snowflake.
Exemplo de código¶
Entrada:¶
SELECT
CAST('01-12-2020' AS DATE FORMAT 'dd-mm-yyyy'),
CAST('01-12-2020' AS DATE FORMAT 'DDDBEEEE');
Saída:¶
SELECT
TO_DATE('01-12-2020', 'DD-MM-YYYY') !!!RESOLVE EWI!!! /*** SSC-EWI-TD0025 - OUTPUT FORMAT 'dd-mm-yyyy' NOT SUPPORTED. ***/!!!,
TO_DATE('01-12-2020', 'DDD EEEE') !!!RESOLVE EWI!!! /*** SSC-EWI-TD0025 - OUTPUT FORMAT 'DDDBEEEE' NOT SUPPORTED. ***/!!!!!!RESOLVE EWI!!! /*** SSC-EWI-TD0039 - INPUT FORMAT 'DDD EEEE' NOT SUPPORTED ***/!!!;
Recomendações¶
Para obter suporte adicional, entre em contato com nossa equipe de suporte pelo e-mail snowconvert-support@snowflake.com
SSC-EWI-TD0068¶
Gravidade¶
Medium
Descrição¶
Os perfis do Teradata permitem que você defina vários parâmetros compartilhados que controlam o espaço de armazenamento e gerenciam as restrições de senha.
O Snowflake gerencia o armazenamento por meio de sua arquitetura de nuvem e lida com toda a otimização automaticamente, eliminando a necessidade de configuração de armazenamento no lado do usuário. Além disso, o Snowflake impõe uma política de senha padrão que se aplica universalmente a todos os usuários e não pode ser personalizada.
Esse erro ocorre quando uma referência de perfil do Teradata é detectada e convertida em uma referência de função do Snowflake. Embora as funções no Snowflake sejam o equivalente mais próximo dos perfis do Teradata, os resultados da consulta podem ser diferentes, a menos que o nome do perfil no Teradata corresponda ao nome da função no Snowflake.
Exemplo de código¶
Código de entrada:¶
SELECT PROFILE;
Código de saída:¶
SELECT
CURRENT_ROLE() !!!RESOLVE EWI!!! /*** SSC-EWI-TD0068 - SNOWFLAKE DOES NOT SUPPORT PROFILES, REFERENCING ROLE INSTEAD ***/!!!;
Recomendações¶
Não use perfis de usuário em suas consultas porque eles não são compatíveis. Os resultados da consulta podem variar se o nome do perfil do usuário for diferente do nome da função.
Para obter assistência adicional, entre em contato conosco pelo e-mail snowconvert-support@snowflake.com
SSC-EWI-TD0029¶
Gravidade¶
Low
Descrição¶
Esse aviso aparece ao migrar um TABLE
que usa o atributo QUEUE. Como o Snowflake não é compatível com a palavra-chave QUEUE
, ela será removida durante a migração.
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"}}'
;
Recomendações¶
Para obter suporte adicional, entre em contato com nossa equipe de suporte pelo e-mail snowconvert-support@snowflake.com
SSC-EWI-TD0063¶
Partes do código de saída foram removidas para tornar o exemplo mais claro e fácil de seguir.
Gravidade¶
Medium
Descrição¶
Esse erro ocorre quando o SnowConvert encontra uma cadeia de caracteres de caminho JSON que não segue o formato JSON exigido e não pode ser desserializada corretamente.
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 de saída:¶
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);
Recomendações¶
Verifique se o caminho JSON está formatado corretamente e não contém caracteres inválidos.
Para obter assistência adicional, entre em contato conosco pelo e-mail snowconvert-support@snowflake.com
SSC-EWI-TD0057¶
Gravidade¶
Low
Descrição¶
A função NEW JSON aceita dados JSON em formato de cadeia ou binário. Quando os dados estão em formato binário, a função permanece inalterada porque o Snowflake não consegue interpretar os metadados do formato binário sobre o objeto JSON. Para obter mais detalhes, consulte a documentação do Teradata NEW JSON.
Exemplo de código¶
Código de entrada¶
SELECT NEW JSON ('160000000268656C6C6F0006000000776F726C640000'xb, BSON);
Código de saída¶
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);
Recomendações¶
Para obter suporte adicional, entre em contato com nossa equipe de suporte pelo e-mail snowconvert-support@snowflake.com
SSC-EWI-TD0006¶
Gravidade¶
Low
Descrição¶
O tipo de dados FLOAT não oferece suporte a valores padrão usando as especificações DEFAULT TIME, DEFAULT DATE, DEFAULT CURRENT_DATE, DEFAULT CURRENT_TIME ou DEFAULT CURRENT_TIMESTAMP.
Exemplo de código¶
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"}}'
;
Recomendações¶
Não é necessária nenhuma ação da sua parte.
Para obter suporte adicional, entre em contato conosco pelo e-mail snowconvert-support@snowflake.com
SSC-EWI-TD0002¶
Esse EWI foi descontinuado desde a versão SnowConvert 28.1.100.
Gravidade¶
High
Descrição¶
Quando uma instrução SQL inclui um seletor de coluna do tipo INTERVAL, o SnowConvert adicionará uma mensagem EWI (Error, Warning, Information) e criará uma função stub. Como o Snowflake não é compatível com o tipo de dados INTERVAL, será necessária uma intervenção manual após a conclusão do processo de conversão.
Exemplo de código¶
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;
Recomendações¶
Para obter suporte adicional, entre em contato conosco pelo e-mail snowconvert-support@snowflake.com
SSC-EWI-TD0053¶
Partes do código foram removidas para tornar o exemplo mais claro e fácil de entender.
Precisão das representações varchar geradas¶
A função PERIOD_UDF cria uma representação de cadeia de caracteres de um período usando os formatos padrão de carimbo de data/hora do Snowflake. Por padrão, os carimbos de data/hora incluem três casas decimais para precisão, enquanto as variáveis de tempo não têm casas decimais. Se você precisar ajustar a precisão na cadeia de caracteres de saída, há duas opções disponíveis.
Use a versão de três parâmetros de PERIOD_UDF com o parâmetro PRECISIONDIGITS
. Esse parâmetro aceita um número inteiro de 0 a 9 e controla o número de casas decimais na parte do tempo fracionário do resultado. Enquanto o Snowflake suporta até nove casas decimais, o Teradata só suporta até seis. Por exemplo:
Chamada |
Resultado |
---|---|
|
|
|
|
|
|
Defina o formato de hora para a saída da sessão: Use os comandos
ALTER SESSION SET TIMESTAMP_NTZ_OUTPUT_FORMAT = <format>
eALTER SESSION SET TIME_OUTPUT_FORMAT = <format>
para modificar a forma como os carimbos de data/hora são exibidos na sessão.
Você pode modificar os formatos padrão do Snowflake para a sessão atual para especificar o número desejado de dígitos de precisão. Essas alterações afetarão todas as execuções subsequentes de PERIOD_UDF durante sua sessão.
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 de saída:¶
CREATE OR REPLACE TABLE vacations (
employeeName varchar(50),
duration VARCHAR(24) !!!RESOLVE EWI!!! /*** SSC-EWI-TD0053 - 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-EWI-TD0053 - SNOWFLAKE DOES NOT SUPPORT THE PERIOD DATATYPE, ALL PERIODS ARE HANDLED AS VARCHAR INSTEAD ***/!!!);
SELECT
PUBLIC.PERIOD_END_UDF(duration) !!!RESOLVE EWI!!! /*** SSC-EWI-TD0053 - SNOWFLAKE DOES NOT SUPPORT THE PERIOD DATATYPE, ALL PERIODS ARE HANDLED AS VARCHAR INSTEAD ***/!!! from
vacations;
Recomendações¶
Como
PERIOD
e suas funções relacionadas são simulados usando o tipo de dados varchar, recomendamos que você verifique a precisão dos resultados.Para obter assistência adicional, entre em contato conosco pelo e-mail snowconvert-support@snowflake.com
SSC-EWI-TD0077¶
Partes do código de saída foram removidas para tornar o exemplo mais claro e fácil de seguir.
Gravidade¶
Moderado
Descrição¶
O SnowConvert (SC) é compatível apenas com as cláusulas RESET WHEN
que usam operadores de comparação binária (<=, >= ou =). Se você usar qualquer outra condição, como IS NOT NULL
, o SC removerá a cláusula RESET WHEN
e exibirá uma mensagem de erro porque o Snowflake não oferece suporte a essas condições.
Essa mensagem de erro aparece quando a condição RESET WHEN
se refere a uma expressão que a ferramenta de migração não consegue localizar. No momento, a ferramenta só oferece suporte a aliases de coluna definidos 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 de saída¶
// SnowConvert 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 de saída¶
// SnowConvert 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;
Recomendações¶
Para obter suporte adicional, entre em contato com nossa equipe de suporte pelo e-mail snowconvert-support@snowflake.com
SSC-EWI-TD0012¶
Gravidade¶
Low
Descrição¶
Esse aviso aparece quando o SnowConvert detecta uma coluna de tipo de dados BINARY com um valor DEFAULT. Como o Snowflake não oferece suporte a valores padrão para colunas BINARY, o SnowConvert remove a especificação de valor DEFAULT.
Exemplo de código¶
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"}}'
;
Recomendações¶
Para obter suporte adicional, entre em contato com nossa equipe de suporte pelo e-mail snowconvert-support@snowflake.com
SSC-EWI-TD0003¶
Gravidade¶
Low
Descrição¶
No Snowflake, as funções trim (LTRIM, RTRIM,
ou TRIM
) somente suportam a colação ao remover espaços vazios ou caracteres de espaço em branco. Eles não oferecem suporte ao agrupamento de outros tipos de caracteres.
Quando o SnowConvert encontra as funções LTRIM
, RTRIM
ou TRIM
(com as opções LEADING
ou TRAILING
) em uma coluna agrupada, ele adiciona automaticamente uma função COLLATE
. Essa função cria uma cópia não compactada da coluna de entrada antes de aplicar a operação de corte. O indicador de aviso antecipado (EWI) alerta você de que o agrupamento da coluna foi removido antes da aplicação da função trim. Como resultado, a saída cortada não terá configurações de agrupamento, o que pode afetar as comparações de cadeias de caracteres subsequentes usando esse resultado.
Exemplo de código¶
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) COLLATE 'en-cs'
)
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "teradata", "convertedOn": "06/17/2024" }}'
;
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;
Recomendações¶
Para manter um comportamento de comparação consistente, acrescente o agrupamento da coluna original ao resultado da função
TRIM
usando a funçãoCOLLATE
. Especifique o valor de agrupamento original como uma cadeia de caracteres literal no segundo argumento.Para obter assistência adicional, entre em contato conosco pelo e-mail snowconvert-support@snowflake.com
SSC-EWI-TD0052¶
Gravidade¶
Low
Descrição¶
Tanto o Teradata quanto o Snowflake convertem automaticamente os valores de cadeia de caracteres em números quando eles são passados para funções que esperam parâmetros numéricos. Os valores das cadeias de caracteres são analisados e convertidos em seus equivalentes numéricos.
O Teradata e a linguagem de destino tratam as cadeias numéricas de forma diferente. O Teradata é mais flexível e pode analisar vários formatos de cadeia de caracteres como números, inclusive:
Cadeias de caracteres vazias ou com apenas espaços em branco
Cadeias de caracteres com traços incorporados
Números sem dígitos na mantissa ou no expoente
Símbolos de moeda
Números com separadores de dígitos
Números em que o sinal aparece após os dígitos
'1-2-3-4-5' -> 12345
'$50' -> 50
'5000-' -> -5000
'1,569,284.55' -> 1569284.55
O Snowflake usa a conversão de cadeias de caracteres automática otimista e espera que as cadeias correspondam aos formatos TM9 ou TME. Quando as cadeias de caracteres não correspondem a esses formatos, a conversão falha. Para resolver isso, o SnowConvert processa literais de cadeia de caracteres que exigem conversão em valores numéricos, gerando cadeias de caracteres que correspondem aos formatos TM9 ou TME. Isso garante que o Snowflake possa analisá-los corretamente. Observe que essa conversão só funciona para valores literais de cadeia de caracteres; valores não literais podem não ser analisados com êxito 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 de saída:¶
CREATE OR REPLACE TABLE myTable (
stringCol varchar(30)
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"teradata"}}'
;
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;
Recomendações¶
Não é necessária nenhuma ação da sua parte.
Para obter suporte adicional, entre em contato conosco pelo e-mail snowconvert-support@snowflake.com
SSC-EWI-TD0066¶
Partes do código de saída foram removidas para tornar o exemplo mais claro e fácil de seguir.
Gravidade¶
Low
Descrição¶
Essa mensagem é exibida quando o SnowConvert encontra um Identificador delimitado em Unicode do Teradata que contém caracteres não suportados pelo Snowflake. Para obter mais informações, consulte Identificador delimitado em Unicode do Teradata.
Exemplo de código¶
Código de entrada:¶
SELECT * FROM U&"#000f#ffff" UESCAPE '#';
Código de saída:¶
// SnowConvert 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";
Recomendações¶
Use somente caracteres Unicode válidos ao criar identificadores no Snowflake.
Para obter assistência adicional, entre em contato conosco pelo e-mail snowconvert-support@snowflake.com
SSC-EWI-TD0027¶
Gravidade¶
Low
Descrição¶
O Snowflake não é compatível com os atributos temporais incorporados do Teradata, como VALIDTIME ou TRANSACTIONTIME, o que resulta em uma mensagem EWI (Error, Warning, Information).
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 ***/!!!!!!RESOLVE EWI!!! /*** SSC-EWI-TD0053 - 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"}}'
;
Recomendações¶
Crie manualmente as colunas TIMESTAMP e defina seus valores padrão como CURRENT_TIMESTAMP.
Use fluxos de tabela para rastrear alterações nos dados e capturar metadados para cada modificação. (Guia)
Para obter assistência adicional, entre em contato conosco pelo e-mail snowconvert-support@snowflake.com
SSC-EWI-TD0076¶
Gravidade¶
Moderado
Descrição¶
As tabelas estrangeiras no Teradata permitem que você acesse dados armazenados em locais externos, como Amazon S3, Azure Blob Storage e Google Cloud Storage. Embora o Snowflake não ofereça suporte a essa sintaxe específica, você pode obter uma funcionalidade semelhante usando:
Tabelas externas
Tabelas Iceberg
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 de saída:¶
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;
Recomendações¶
Para substituir as tabelas externas do Teradata, você pode usar as tabelas externas do Snowflake. Essas tabelas leem dados diretamente das plataformas de armazenamento em nuvem (Amazon S3, Google Cloud Storage ou Microsoft Azure). Isso permite que você consulte os arquivos do data lake como se fossem tabelas de banco de dados. As tabelas externas são compatíveis com todos os formatos de arquivo que funcionam com os comandos COPY INTO
As tabelas Iceberg do Snowflake oferecem outra opção. Essas tabelas usam formatos abertos e armazenam dados como arquivos Parquet em seu próprio armazenamento em nuvem.
As tabelas padrão do Snowflake também podem substituir a funcionalidade de tabelas estrangeiras do Teradata.
Para obter ajuda adicional, entre em contato conosco pelo e-mail snowconvert-support@snowflake.com
Para obter suporte adicional, entre em contato conosco pelo e-mail snowconvert-support@snowflake.com
Observação: Você pode replicar a funcionalidade de rastreamento no Snowflake usando um
EVENT TABLE
. Para obter mais informações, consulte a documentação do Snowflake sobre Registro e rastreamento.Para obter assistência adicional, entre em contato conosco pelo e-mail snowconvert-support@snowflake.com
Para obter suporte adicional, entre em contato com nossa equipe de suporte pelo e-mail snowconvert-support@snowflake.com
Aplique manualmente a solução alternativa sugerida.
Revise SSC-FDM-TD0033 para entender as limitações do uso do
LAST_QUERY_ID
e como lidar com elas.Para obter assistência adicional, entre em contato conosco pelo e-mail snowconvert-support@snowflake.com
No Teradata, a função BYTES sempre contará os zeros finais porque usa armazenamento de comprimento fixo. Isso significa que ele retorna o tamanho da coluna em vez do tamanho real dos dados.
No Snowflake, a função LENGTH retorna o tamanho real dos dados armazenados porque usa armazenamento de comprimento variável para tipos binários.
A análise dos resultados da função BYTES mostra que a função LENGTH do Snowflake já oferece o comportamento desejado, portanto, não são necessárias modificações.
Para obter assistência adicional, entre em contato conosco pelo e-mail snowconvert-support@snowflake.com
Para obter suporte adicional, entre em contato com nossa equipe de suporte pelo e-mail snowconvert-support@snowflake.com
Para obter suporte adicional, entre em contato conosco pelo e-mail snowconvert-support@snowflake.com
A cláusula
UPPERCASE
converte caracteres minúsculos em maiúsculos ao armazenar dados. Por exemplo, “aaa” é armazenado como “AAA”. Para lidar com isso, você pode adicionar a função UPPER a todos os comandos de inserção. No entanto, esteja ciente de que você também precisará modificar todos os processos ETL que carregam dados externos.Para obter assistência adicional, entre em contato conosco pelo e-mail snowconvert-support@snowflake.com
Para obter suporte adicional, entre em contato conosco pelo e-mail snowconvert-support@snowflake.com
Você pode fornecer informações de coluna para a ferramenta de conversão usando um dos dois métodos:
Inclua a especificação da tabela no mesmo arquivo que a chamada TD_UNPIVOT
Liste colunas específicas na consulta SELECT da expressão ON em vez de usar SELECT * ou apenas o nome da tabela
Se você estiver desvinculando as colunas ALL das tabelas de entrada, poderá ignorar esse problema. No entanto, se você estiver desvinculando apenas algumas colunas, o resultado será a falta de dados.
Para obter suporte adicional, entre em contato conosco pelo e-mail snowconvert-support@snowflake.com
Identifique as instruções que podem causar a exceção e coloque-as em um bloco de código, semelhante aos exemplos mostrados em Referência da conversão de Continue Handler.
Para obter assistência adicional, entre em contato com nossa equipe de suporte pelo e-mail snowconvert-support@snowflake.com
D: Mapeado para a função
DAYOFWEEK
. Observe que os resultados podem ser diferentes entre o Teradata e o Snowflake devido às diferentes configurações padrão. A Teradata usa o domingo como o primeiro dia da semana, enquanto o Snowflake usa a segunda-feira.WW: Mapeado para a função
WEEK
. Os resultados podem ser diferentes devido a diferentes políticas de cálculo semanal. O Snowflake usa o padrão ISO por padrão (a primeira semana deve conter pelo menos quatro dias de janeiro), enquanto a Teradata considera o dia 1º de janeiro como o início da primeira semana.TIMESTAMP_LTZ_OUTPUT_FORMAT
TIMESTAMP_NTZ_OUTPUT_FORMAT
TIMESTAMP_TZ_OUTPUT_FORMAT
TIME_OUTPUT_FORMAT
Ao trabalhar com as Funções de formato (FF), use os tipos DateTime que correspondem à precisão do Teradata ou especifique uma precisão no elemento de formato para garantir um comportamento consistente.
Para a formatação do fuso horário, certifique-se de que o primeiro parâmetro seja do tipo
TIMESTAMP_TZ
para obter resultados consistentes. Observe que o tipo de dadosTIME
do Snowflake não oferece suporte a informações de fuso horário.Configure os parâmetros de sessão para corresponder aos valores padrão do Teradata para manter um comportamento consistente.
Para obter assistência adicional, entre em contato conosco pelo e-mail snowconvert-support@snowflake.com
Para obter suporte adicional, entre em contato conosco pelo e-mail snowconvert-support@snowflake.com
Lookahead
Lookbehind
Grupos sem captura
Revise cada padrão de expressão regular para identificar se são necessários ajustes manuais. Para obter mais detalhes sobre os recursos de regex do Snowflake e opções alternativas, veja aqui.
Para obter assistência adicional, entre em contato com nossa equipe de suporte pelo e-mail snowconvert-support@snowflake.com
Certifique-se de incluir definições de tabela ao fornecer o código ao SnowConvert. Sem eles, você precisará executar o código novamente.
Para obter assistência adicional, entre em contato conosco pelo e-mail snowconvert-support@snowflake.com
Para obter suporte adicional, entre em contato conosco pelo e-mail snowconvert-support@snowflake.com
Para obter informações detalhadas sobre a conversão de BTEQ para Python, consulte a especificação de conversão de BTEQ para Python.
Para obter suporte adicional, entre em contato conosco pelo e-mail snowconvert-support@snowflake.com
Para obter suporte adicional, entre em contato com nossa equipe de suporte pelo e-mail snowconvert-support@snowflake.com
Para obter suporte adicional, entre em contato com nossa equipe de suporte pelo e-mail snowconvert-support@snowflake.com
Verifique se há aliases de encaminhamento recursivos em seu código. O EWI identifica o primeiro alias recursivo, mas pode haver outros em seu código que precisam de atenção.
Para obter assistência adicional, entre em contato conosco pelo e-mail snowconvert-support@snowflake.com
Para obter suporte adicional, entre em contato com nossa equipe de suporte pelo e-mail snowconvert-support@snowflake.com
Verifique se o código convertido funciona da mesma forma que o código-fonte.
Para obter assistência adicional, entre em contato com nossa equipe de suporte pelo e-mail snowconvert-support@snowflake.com
Para obter suporte adicional, entre em contato com nossa equipe de suporte pelo e-mail snowconvert-support@snowflake.com
SSC-EWI-TD0091¶
Algumas seções do código de saída foram removidas para facilitar a compreensão.
Gravidade¶
Medium
Descrição¶
Nos scripts do Teradata, você pode converter tipos de dados usando a expressão CAST com a seguinte sintaxe:
<expression> ( <DataType> )
Ao converter tipos de dados usando CAST com DATE
ou TIME
, pode ocorrer ambiguidade porque essas palavras-chave também funcionam como funções CURRENT_DATE
e CURRENT_TIME
, respectivamente.
Portanto, ao examinar o código sem contexto adicional sobre a expressão que exige uma operação CAST, fica difícil distinguir entre uma operação CAST genuína e uma função que simplesmente recebe parâmetros DATE ou TIME como entrada.
Para determinar se <expression>
é uma coluna ou uma função definida pelo usuário (UDF), é preciso incluir a instrução correspondente CREATE TABLE
ou CREATE FUNCTION
ao converter o código. Isso fornece o contexto necessário sobre a definição da expressão.
Por exemplo, vamos examinar a seguinte instrução SELECT
. Quando encontramos AMBIGUOUS_EXPR
, sem contexto adicional, não podemos determinar se ele representa uma chamada de função ou uma conversão de tipo para DATE
. No entanto, podemos ter certeza de que COL1 (DATE)
é uma operação de conversão de tipo (CAST) porque 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 de saída¶
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;
Recomendações¶
SSC-EWI-TD0017¶
Gravidade¶
Low
Descrição¶
Esse aviso aparece quando o SnowConvert detecta uma instrução Create Table que inclui a opção GLOBAL TEMPORARY TRACE. Esse recurso, que é específico do Teradata (funcionalidade TRACE), não está disponível no Snowflake e será removido durante a conversão.
Exemplo de código¶
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"}}'
;
Recomendações¶
SSC-EWI-TD0046¶
Gravidade¶
Medium
Descrição¶
Esse erro ocorre ao fazer referência a uma tabela DBC em que a coluna selecionada não tem uma correspondê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;
Recomendações¶
SSC-EWI-TD0023¶
Gravidade¶
Low
Descrição¶
A variável de status ACTIVITY_COUNT
mostra quantas linhas foram modificadas por uma instrução SQL DML (como INSERT, UPDATE ou DELETE) quando usada em procedimentos incorporados SQL ou armazenados. Para obter mais detalhes, acesse [aqui] (https://docs.teradata.com/r/Enterprise_IntelliFlex_VMware/SQL-Stored-Procedures-and-Embedded-SQL/Result-Code-Variables/ACTIVITY_COUNT).
Para reproduzir o comportamento de ACTIVITY_COUNT
, você pode usar a solução alternativa descrita na especificação da conversão.
SELECT $1 FROM TABLE(RESULT_SCAN(LAST_QUERY_ID()));
Ao usar ACTIVITY_COUNT
em uma instrução SELECT
ou SET INTO VARIABLE
, você não pode substituí-la diretamente pela solução alternativa mencionada anteriormente.
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¶
Para recuperar a contagem de linhas que foram inseridas, atualizadas ou excluídas, você pode usar parte da solução alternativa descrita acima.
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;
$$;
Para usar essa consulta no Snowflake, você precisa modificá-la para usar a sintaxe SELECT INTO VARIABLE do Snowflake.
Além disso, se você observar resultados incorretos ao usar RESULT_SCAN(LAST_QUERY_ID())
, consulte SSC-FDM-TD0033 para obter informações sobre possíveis limitações e como resolvê-las.
Recomendações¶
SSC-EWI-TD0051¶
Gravidade¶
Low
Descrição¶
Ao trabalhar com tipos de dados de bytes, há uma diferença importante entre o Teradata e o Snowflake:
Aqui está um exemplo para ilustrar essa diferença:
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 em 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 de saída:¶
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;
Recomendações¶
SSC-EWI-TD0034¶
Partes do código de saída foram removidas para tornar o exemplo mais claro e fácil de seguir.
Gravidade¶
Low
Descrição¶
Não há suporte para a execução de várias instruções SQL em uma única solicitação. Sua solicitação foi processada como uma única transação.
Essas informações de aviso de erro (EWI) aparecem exclusivamente quando o sinalizador PL Target Language é definido como Javascript usando o comando: “–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 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`);
}
$$;
Recomendações¶
SSC-EWI-TD0024¶
Gravidade¶
Low
Descrição¶
Esse aviso aparece quando uma função AGGREGATE
é usada em uma instrução ABORT
comentada dentro de um procedimento armazenado.
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;
$$;
Recomendações¶
SSC-EWI-TD0010¶
Gravidade¶
Low
Descrição¶
O atributo de coluna UPPERCASE, que é usado para converter o texto em letras maiúsculas, não está disponível no Snowflake.
Exemplo de código¶
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"}}'
;
Recomendações¶
SSC-EWI-TD0041¶
Gravidade¶
Low
Descrição¶
O formato de arquivo fornecido não é compatível com o sistema.
Exemplo de código¶
Entrada:¶
SELECT
cast(T_2041.integer_column as integer);
Saída:¶
SELECT
cast(TRUNC(T_2041.integer_column) as integer) !!!RESOLVE EWI!!! /*** SSC-EWI-TD0041 - TRUNC FUNCTION WAS ADDED TO ENSURE INTEGER. MAY NEED CHANGES IF NOT NUMERIC OR STRING. ***/!!!;
Recomendações¶
SSC-EWI-TD0061¶
Gravidade¶
Low
Descrição¶
O SnowConvert não oferece suporte nem transforma a função TD_UNPIVOT, que converte dados de coluna em linhas em uma tabela.
Essa transformação precisa de informações sobre os nomes das colunas na(s) tabela(s) para funcionar corretamente. Se essas informações não estiverem disponíveis, a transformação poderá ser incompleta, com colunas ausentes no resultado. Nesses casos, será gerada uma mensagem EWI (Error, Warning, Information).
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 de saída:¶
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;
Recomendações¶
SSC-EWI-TD0004¶
Gravidade¶
Low
Descrição¶
Os procedimentos do Snowflake não têm um equivalente direto para a funcionalidade do Continue Handler do Teradata. Embora o SnowConvert possa lidar com alguns códigos de exceção e emular um comportamento semelhante, ele gerará uma mensagem EWI (Error, Warning ou Information) ao encontrar códigos de exceção não suportados nas instruções Continue Handler.
Exemplo de código¶
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;
$$;
Recomendações¶
SSC-EWI-TD0055¶
Esse indicador de aviso antecipado (EWI) não é mais suportado. Consulte a documentação SSC-FDM-TD0029 para obter informações atualizadas.
Elementos de formato que dependem dos parâmetros da sessão¶
Os seguintes elementos de formato do Teradata são mapeados para funções do Snowflake que exigem configurações específicas de parâmetros de sessão. Para garantir resultados consistentes entre o Teradata e o Snowflake, você deve configurar esses parâmetros de sessão para corresponder às configurações do Teradata:
Para alterar os parâmetros da sessão, use o comando ALTER SESSION SET parameter_name = value
. Para obter mais detalhes sobre os parâmetros de sessão disponíveis e seu uso, visite esta página.
Versão de parâmetro único de TO_CHAR¶
A função TO_CHAR(Datetime)
com um único parâmetro usa formatos padrão de data e hora definidos nos parâmetros da sessão. Esses parâmetros incluem:
Para garantir um comportamento consistente entre o Teradata e o Snowflake, certifique-se de que esses parâmetros correspondam às configurações do Teradata.
Ao converter valores numéricos em cadeias de caracteres usando TO_CHAR(Numeric)
, o Snowflake usa automaticamente o formato TM9
ou TME
para criar uma representação de string compacta. Como o Teradata também cria representações de números compactos por padrão, nenhuma formatação adicional é 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 de saída:¶
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 ***/!!!;
Recomendações¶
SSC-EWI-TD0082¶
Gravidade¶
Medium
Descrição¶
A função Translate com os parâmetros de codificação atuais não pode ser usada no Snowflake. Durante o processo de conversão, essa função será comentada.
Exemplo de código¶
Código de entrada:¶
SELECT Translate('abc' USING KANJISJIS_TO_LATIN);
Código de saída¶
SELECT
!!!RESOLVE EWI!!! /*** SSC-EWI-TD0082 - TRANSLATE FUNCTION USING KANJISJIS_TO_LATIN ENCODING IS NOT SUPPORTED ***/!!!
Translate('abc' USING KANJISJIS_TO_LATIN);
Recomendações¶
SSC-EWI-TD0020¶
Essa mensagem de aviso não está mais em uso. Consulte SSC-EWI-0009 para obter a documentação atual.
Gravidade¶
Low
Descrição¶
Atualmente, o Snowflake suporta apenas a sintaxe de expressão regular básica do POSIX. Os recursos avançados de expressão regular não estão disponíveis.
Esse aviso aparece sempre que uma chamada de função para _REGEX_SUBSTR, REGEX_REPLACE, _ ou REGEX_INSTR é convertida no Snowflake. Ele alerta os usuários de que alguns recursos de expressão regular podem não ser compatíveis com o Snowflake. Recursos importantes não suportados incluem:
Exemplo de código¶
Teradata:¶
SELECT REGEXP_SUBSTR('qaqequ','q(?=u)', 1, 1);
Snowflake Scripting:¶
SELECT
!!!RESOLVE EWI!!! /*** SSC-EWI-TD0020 - REGEXP_SUBSTR FUNCTION ONLY SUPPORTS POSIX REGULAR EXPRESSIONS ***/!!!
REGEXP_SUBSTR('qaqequ','q(?=u)', 1, 1);
Recomendações¶
SSC-EWI-TD0060¶
Partes do código de saída foram removidas para tornar o exemplo mais claro e fácil de seguir.
Gravidade¶
Low
Descrição¶
A ferramenta SnowConvert pode transformar a função JSON_TABLE, mas precisa saber os nomes específicos das colunas que estão sendo selecionadas na subconsulta JSON_TABLE ON para realizar a transformação corretamente.
Esse aviso aparece quando os nomes das colunas não são explicitamente especificados em uma subconsulta (por exemplo, ao usar SELECT *
) e o sistema não consegue encontrar as informações de estrutura da tabela. Sem essas informações, os nomes das colunas não podem ser determinados automaticamente.
Para saber como carregar dados JSON em uma tabela, consulte nossa página de documentação.
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 de saída:¶
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;
Recomendações¶
SSC-EWI-TD0031¶
Gravidade¶
Low
Descrição¶
Ao comparar os tipos de dados CHAR no Teradata e no Snowflake, há uma diferença importante a ser observada. No Teradata, CHAR é de comprimento fixo, o que significa que a função LIKE tenta corresponder a todo o comprimento da coluna, incluindo os espaços finais. Isso pode levar a resultados inesperados. Por outro lado, o tipo CHAR do Snowflake é de comprimento variável, de modo que a função LIKE só faz a correspondência com o valor real armazenado, sem considerar os espaços finais. Aqui está um exemplo para demonstrar esse comportamento:
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":1, "minor":0},"attributes":{"component":"teradata"}}'
;
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
!!!RESOLVE EWI!!! /*** SSC-EWI-TD0031 - THE RESULT OF LIKE MAY DIFFER DUE TO CHAR TYPE HAVING A FIXED LENGTH IN TERADATA ***/!!! col2 LIKE 'Barnum';
-- It does not return any row
Recomendações¶
SSC-EWI-TD0005¶
Gravidade¶
Crítico
Descrição¶
O código foi convertido com sucesso, mas pode não funcionar como pretendido porque esse recurso ainda não foi totalmente implementado.
O aviso informa aos usuários que o uso desse comando resultará em uma funcionalidade diferente do script original.
Exemplo de fonte¶
Código de entrada BTEQ:¶
.SET SIDETITLES ON
Código de saída Python:¶
#*** Generated code is based on the SnowConvert 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()
Recomendações¶
SSC-EWI-TD0083¶
Partes do código de saída foram removidas para facilitar a compreensão.
Gravidade¶
Medium
Descrição¶
O SnowConvert não consegue processar várias instrução SELECT complexas simultaneamente. Essa limitação existe porque a conversão dessas instruções exige o mapeamento delas para expressões de tabela comuns (CTEs) ou cláusulas FROM compostas, o que pode resultar em erros de compilação ou loops lógicos infinitos.
O que consideramos uma cláusula SELECT complexa?¶
Instruções que precisam ser mapeadas para uma expressão de tabela comum (CTE) ou uma cláusula composta FROM, incluindo as funções NORMALIZE, EXPAND ON e 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 de saída¶
// SnowConvert 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;
Recomendações¶
SSC-EWI-TD0070¶
Esse indicador de aviso antecipado (EWI) não é mais suportado. Consulte a documentação SSC-FDM-TD0030 para obter informações atualizadas.
Gravidade¶
Medium
Descrição¶
Quando o SC substitui uma instrução Goto por uma seção Label, ele adiciona automaticamente uma instrução return no final da seção, se não houver nenhuma. Isso garante que o fluxo de execução do programa permaneça o mesmo que no código original.
Quando um comando Goto BTEQ é executado, todas as instruções entre o comando Goto e o rótulo correspondente são ignoradas. Para evitar qualquer execução não intencional após atingir o rótulo, você deve incluir uma instrução de retorno na seção do rótulo.
É importante observar que, quando um comando Goto é executado, ele pula todas as instruções até chegar ao rótulo correspondente. A execução do programa continua a partir desse rótulo. As seções Label definidas antes do comando Goto nunca serão executadas.
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 de saída¶
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
$$
Recomendações¶
SSC-EWI-TD0001¶
Partes do código de saída foram removidas para facilitar a compreensão.
Gravidade¶
Low
Descrição¶
Esse aviso aparece quando o SnowConvert identifica padrões recursivos em expressões com alias. Nesses casos, o SnowConvert não pode realizar a transformação Forward Alias, que é necessária para que os aliases funcionem corretamente no Snowflake.
Um alias recursivo ocorre quando dois ou mais aliases fazem referência uns aos outros em um padrão circular. Isso pode acontecer diretamente, onde o Alias A faz referência ao Alias B e o Alias B faz referência ao Alias A, ou indiretamente (transitively), onde a referência circular ocorre por meio de vários aliases Medium.
Exemplo de código¶
Observação: Embora o Snowflake geralmente não ofereça suporte a aliases recursivos, alguns casos básicos são suportados.
Observação: O Snowflake não oferece suporte a aliases recursivos em geral. No entanto, alguns casos básicos são suportados, conforme mostrado nos exemplos abaixo.
O código abaixo demonstra a execução bem-sucedida no Snowflake após a conclusão do processo de migração:
Teradata:¶
SELECT
COL1 AS COL2,
COL2 AS COL1
FROM
TABLE_EXAMPLE;
Snowflake Scripting:¶
// SnowConvert 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;
O exemplo de código mostrado abaixo não será executado corretamente:
Teradata:¶
SELECT
A + B as C,
COL2 + C AS A,
COL3 AS B
FROM
TABLE_EXAMPLE;
Snowflake Scripting:¶
// SnowConvert 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;
Recomendações¶
SSC-EWI-TD0087¶
Essa documentação não é mais mantida. Consulte SSC-FDM-TD0026 para obter informações atualizadas.
Partes do código foram omitidas para manter o exemplo claro e conciso.
Gravidade¶
Medium
Descrição¶
Ao replicar a funcionalidade da instrução SQL IF, os desenvolvedores geralmente combinam os comandos GOTO com os comandos IF e LABEL. Essas combinações podem ser convertidas diretamente em declarações if, if-else ou if-elseif-else. Nesses casos, os comandos GOTO devem ser removidos para evitar sua substituição por seções LABEL, pois se tornam redundantes.
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 de saída¶
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
$$
Recomendações¶
SSC-EWI-TD0025¶
Gravidade¶
Low
Descrição¶
Esse aviso aparece quando você usa uma função CAST
com um formato de saída que o script do Snowflake não suporta.
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)'),
CAST('01-12-2020' AS DATE FORMAT 'dd-mm-yyyy')
FROM SAMPLE_TABLE;
Snowflake Scripting:¶
CREATE OR REPLACE TABLE SAMPLE_TABLE (
VARCHAR_TYPE VARCHAR
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"teradata"}}'
;
CREATE OR REPLACE VIEW SAMPLE_VIEW
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"teradata"}}'
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. ***/!!!,
TO_DATE('01-12-2020', 'DD-MM-YYYY') !!!RESOLVE EWI!!! /*** SSC-EWI-TD0025 - OUTPUT FORMAT 'dd-mm-yyyy' NOT SUPPORTED. ***/!!!
FROM
SAMPLE_TABLE;
Recomendações¶
SSC-EWI-TD0040¶
Gravidade¶
Low
Descrição¶
O formato de arquivo fornecido não é compatível com o sistema.
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) COLLATE 'en-cs' FORMAT 'X(50)' !!!RESOLVE EWI!!! /*** SSC-EWI-TD0040 - FORMAT IN TABLE T_2040 NOT SUPPORTED ***/!!!,
C2 VARCHAR(255) COLLATE 'en-cs' 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": "06/17/2024" }}'
;