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

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

Recomendações

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

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

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

Snowflake Scripting:

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

Recomendações

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

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

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() );

   );
);
Copy

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()
Copy

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);
Copy

Snowflake Scripting:

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

Recomendações

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');
Copy

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 ***/!!!;
Copy

Recomendações

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

Código de saída:

SELECT
CURRENT_ROLE() !!!RESOLVE EWI!!! /*** SSC-EWI-TD0068 - SNOWFLAKE DOES NOT SUPPORT PROFILES, REFERENCING ROLE INSTEAD ***/!!!;
Copy

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
);
Copy

Saída:

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

Recomendações

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);
Copy

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);
Copy

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);
Copy

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);
Copy

Recomendações

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
);
Copy

Snowflake Scripting:

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

Recomendações

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

Snowflake Scripting:

SELECT
     !!!RESOLVE EWI!!! /*** SSC-EWI-TD0002 - INTERVAL TYPE NOT SUPPORTED IN SNOWFLAKE ***/!!!
     INTERVAL '07 hour, 00 min',
     !!!RESOLVE EWI!!! /*** SSC-EWI-TD0002 - INTERVAL TYPE NOT SUPPORTED IN SNOWFLAKE ***/!!!
     INTERVAL '08 hour, 00 min' As Test_Interval;
Copy

Recomendações

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

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

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

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

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

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

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

  • Defina o formato de hora para a saída da sessão: Use os comandos ALTER SESSION SET TIMESTAMP_NTZ_OUTPUT_FORMAT = <format> e ALTER 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;
Copy

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

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

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

A expressão da condição não foi encontrada

Código de entrada:

SELECT
    account_id,
    month_id,
    balance,
    ROW_NUMBER() OVER (
        PARTITION BY account_id
        ORDER BY month_id
        RESET WHEN balance <= not_found_expresion
    ) as balance_increase
FROM account_balance
ORDER BY 1,2;
Copy

Código 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;
Copy

Recomendações

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

Snowflake Scripting:

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

Recomendações

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

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

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ção COLLATE. 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;
Copy

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

Recomendações

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 '#';
Copy

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";
Copy

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
);
Copy

Saída do Snowflake:

CREATE OR REPLACE TABLE SAMPLE_TABLE (
       COL1 VARCHAR(68) NOT NULL !!!RESOLVE EWI!!! /*** SSC-EWI-TD0027 - SNOWFLAKE DOES NOT SUPPORT 'TRANSACTIONTIME' COLUMN OPTION ***/!!!!!!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"}}'
;
Copy

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

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

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

  • 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> )
    
    Copy

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

    Exemplo de código

    Código de entrada:

    CREATE TABLE TAB (
        COL1 VARCHAR(23)
    )
    
    SELECT
        COL1 (DATE),
        AMBIGUOUS_EXPR (DATE)
    FROM TAB;
    
    Copy

    Código 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;
    
    Copy

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

    Snowflake Scripting:

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

    Recomendações

    • 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

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

    Saída:

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

    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()));
    
    Copy

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

    Snowflake

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

    Correção manual

    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;
    $$;
    
    Copy

    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

    • 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

    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:

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

    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
    
    Copy

    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
    
    Copy

    Exemplo de código:

    Código de entrada:

    create table sampleTable(
        byteColumn byte(10),
        varbyteColumn varbyte(15)
    );
    
    select bytes(byteColumn), bytes(varbyteColumn) from sampleTable;
    
    Copy

    Código 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;
    
    Copy

    Recomendações

    • 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

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

    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`);
      }
    $$;
    
    Copy

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

    Snowflake Scripting:

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

    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
    );
    
    Copy

    Snowflake Scripting:

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

    Recomendações

    • 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

    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);
    
    Copy

    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. ***/!!!;
    
    Copy

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

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

    Recomendações

    • 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

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

    Snowflake Scripting:

    CREATE OR REPLACE PROCEDURE PURGING_ADD_TABLE
    (INDATABASENAME VARCHAR(30), INTABLENAME VARCHAR(30)
    )
    RETURNS VARCHAR
    LANGUAGE SQL
    COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "teradata",  "convertedOn": "07/04/2024" }}'
    EXECUTE AS CALLER
    AS
    $$
     DECLARE
      vCHAR_SQLSTATE CHAR(5);
      vSUCCESS       CHAR(5);
     BEGIN
    
    
      !!!RESOLVE EWI!!! /*** SSC-EWI-TD0004 - NOT SUPPORTED SQL EXCEPTION ON CONTINUE HANDLER ***/!!!
    
      DECLARE CONTINUE HANDLER FOR SQLSTATE 'UNSUPPORTED'
      BEGIN
       vCHAR_SQLSTATE := SQLCODE;
       vSUCCESS := SQLCODE;
      END;
      SELECT
       1;
     END;
    $$;
    
    Copy

    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:

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

    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:

    • TIMESTAMP_LTZ_OUTPUT_FORMAT

    • TIMESTAMP_NTZ_OUTPUT_FORMAT

    • TIMESTAMP_TZ_OUTPUT_FORMAT

    • TIME_OUTPUT_FORMAT

    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);
    
    Copy

    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 ***/!!!;
    
    Copy

    Recomendações

    • 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 dados TIME 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

    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);
    
    Copy

    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);
    
    Copy

    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:

    • Lookahead

    • Lookbehind

    • Grupos sem captura

    Exemplo de código

    Teradata:

    SELECT REGEXP_SUBSTR('qaqequ','q(?=u)', 1, 1);
    
    Copy

    Snowflake Scripting:

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

    Recomendações

    • Revise cada padrão de expressão regular para identificar se são necessá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

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

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

    Recomendações

    • 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

    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
    
    Copy

    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
    
    Copy

    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
    
    Copy

    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()
    
    Copy

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

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

    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';
    
    Copy

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

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

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

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

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

    Recomendações

    • 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

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

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

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

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

    Recomendações

    • 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

    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)'
    );
    
    Copy

    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" }}'
    ;
    
    Copy

    Recomendações

    .