SnowConvert : problèmes liés à Teradata

SSC-EWI-TD0069

Ce numéro d’alerte précoce (EWI) n’est plus pris en charge. Veuillez consulter la documentation SSC-FDM-TD0031 pour obtenir des informations à jour.

Gravité

Faible

Description

La fonction Teradata ST_SPHERICALDISTANCE et la fonction Snowflake ST_DISTANCE calculent différemment les distances entre les points géographiques. Teradata utilise la formule de Haversine pour mesurer la distance entre deux points sur une sphère (comme la Terre), tandis que la fonction ST_DISTANCE de Snowflake utilise une méthode différente pour déterminer la distance minimale entre deux coordonnées géographiques.

Exemple de code

Code d’entrée :

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

Code de sortie

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

Recommandations

SSC-EWI-TD0079

Certaines parties du code de sortie ont été supprimées pour rendre l’exemple plus clair et plus facile à suivre.

Gravité

Faible

Description

Cet avertissement apparaît parce que la colonne « Période » requise, qui est nécessaire pour répliquer la fonctionnalité de la clause de normalisation, n’a pas pu être trouvée.

Exemple de code

Code d’entrée :

SELECT NORMALIZE emp_id, duration2 FROM project;
Copy

Code de sortie

!!!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

Recommandations

  • Pour résoudre cet avertissement, recherchez la première colonne de périodes dans votre code et supprimez toutes les références à cette colonne, sauf à l’endroit où elle est initialement définie. Remplacez ensuite “PeriodColumn” par le nom de la colonne que vous avez trouvée.

  • Pour toute assistance supplémentaire, veuillez nous contacter à l’adresse suivante : snowconvert-support@snowflake.com

SSC-EWI-TD0008

Gravité

Faible

Description

Actuellement, Snowflake ne dispose pas d’équivalents directs pour certaines fonctions de comparaison de chaînes.

Cet EWI apparaît lorsque vous utilisez l’une des méthodes de comparaison de chaînes suivantes : 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.

Exemple de code

Teradata est un système de gestion de bases de données relationnelles spécialisé dans la gestion d’entrepôts de données et d’analyses de données à grande échelle.

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

Recommandations

SSC-EWI-TD0059

Gravité

Faible

Description

Comme pour Teradata, lorsque vous avez défini un fuseau horaire par défaut pour un utilisateur, toutes ses sessions utiliseront ce fuseau horaire jusqu’à ce qu’un fuseau horaire différent soit spécifié pour la session.

Cet avertissement vous rappelle de paramétrer dans Snowflake le même fuseau horaire que celui défini précédemment pour votre utilisateur Teradata. Pour définir le fuseau horaire dans Snowflake, exécutez la requête suivante :

ALTER SESSION SET TIMEZONE = 'equivalent_timezone'

Remarque : Snowflake n’accepte que les fuseaux horaires provenant de la base de données des fuseaux horairesIANA.

Exemple de code

Code d’entrée :

SET TIME ZONE USER;
Copy

Code de sortie :

!!!RESOLVE EWI!!! /*** SSC-EWI-TD0059 - SNOWFLAKE USER DEFAULT TIME ZONE MAY REQUIRE CONFIGURATION TO MATCH TERADATA VALUE ***/!!!
ALTER SESSION UNSET TIMEZONE;
Copy

Recommandations

  • Veillez à configurer le fuseau horaire par défaut de l’utilisateur pour qu’il corresponde au paramètre de fuseau horaire de l’utilisateur Teradata d’origine.

  • Pour toute assistance supplémentaire, veuillez nous contacter à l’adresse suivante : snowconvert-support@snowflake.com

SSC-EWI-TD0049

Gravité

Élevé

Description

L’outil n’a pas été en mesure de traiter et de convertir une instruction DML en TPT. Cela se produit généralement lorsque :

  • Les variables de script sont concaténées dans l’instruction

  • L’instruction contient des guillemets échappés

Exemple de code

Code d’entrée :

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

Code de sortie :

#*** 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

Recommandations

  • Pour résoudre ce problème, vous pouvez soit écrire manuellement l’instruction INSERT, soit contacter l’équipe SnowConvert pour demander une assistance pour cette instruction DML spécifique, car elle n’est pas prise en charge actuellement.

  • Pour toute assistance supplémentaire, veuillez nous envoyer un e-mail à l’adresse suivante : snowconvert-support@snowflake.com

SSC-EWI-TD0009

Gravité

Faible

Description

Les tables temporelles de Teradata utilisent des colonnes de périodes dérivées pour suivre les données temporelles au niveau de la colonne. Cette fonction n’est pas disponible actuellement dans Snowflake.

Exemple de code

Teradata :

CREATE MULTISET TABLE Policy(
      Policy_ID INTEGER,
      Customer_ID INTEGER,
      Policy_Type CHAR(2) NOT NULL,
      Policy_Details CHAR(40),
      Policy_Start DATE NOT NULL,
      Policy_End DATE NOT NULL,
      PERIOD FOR Validity(Policy_Start,Policy_End) AS VALIDTIME
      )
   PRIMARY INDEX(Policy_ID);
Copy

Snowflake Scripting:

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

Recommandations

SSC-EWI-TD0039

Gravité

Medium

Description

Le format de fichier que vous essayez d’utiliser n’est pas compatible avec Snowflake.

Exemple de code

Entrée :

SELECT
    CAST('01-12-2020' AS DATE FORMAT 'dd-mm-yyyy'),
    CAST('01-12-2020' AS DATE FORMAT 'DDDBEEEE');
Copy

Sortie :

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

Recommandations

SSC-EWI-TD0068

Gravité

Medium

Description

Les profils Teradata vous permettent de définir plusieurs paramètres partagés qui contrôlent l’espace de stockage et gèrent les restrictions de mot de passe.

Snowflake gère le stockage grâce à son architecture Cloud et s’occupe de toute l’optimisation automatiquement, éliminant ainsi le besoin de configuration du stockage côté utilisateur. En outre, Snowflake applique une politique de mot de passe standard qui s’applique universellement à tous les utilisateurs et ne peut pas être personnalisée.

Cette erreur se produit lorsqu’une référence de profil Teradata est détectée et convertie en référence de rôle Snowflake. Bien que les rôles dans Snowflake soient l’équivalent le plus proche des profils Teradata, les résultats de la requête peuvent différer à moins que le nom du profil dans Teradata ne corresponde au nom du rôle dans Snowflake.

Exemple de code

Code d’entrée :

SELECT PROFILE;
Copy

Code de sortie :

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

Recommandations

  • N’utilisez pas de profils d’utilisateurs dans vos requêtes car ils ne sont pas pris en charge. Les résultats de la requête peuvent varier si le nom du profil de l’utilisateur diffère de son nom de rôle.

  • Pour toute assistance supplémentaire, veuillez nous contacter à l’adresse suivante : snowconvert-support@snowflake.com

SSC-EWI-TD0029

Gravité

Faible

Description

Cet avertissement apparaît lors de la migration d’une TABLE qui utilise l’attribut QUEUE. Comme Snowflake ne supporte pas le mot-clé QUEUE, il sera supprimé lors de la migration.

Exemple de code

Entrée :

CREATE MULTISET TABLE SAMPLE_TABLE,
QUEUE,
NO FALLBACK
(
    COL1 INTEGER
);
Copy

Sortie :

!!!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

Recommandations

SSC-EWI-TD0063

Certaines parties du code de sortie ont été supprimées pour rendre l’exemple plus clair et plus facile à suivre.

Gravité

Medium

Description

Cette erreur se produit lorsque SnowConvert rencontre une chaîne de chemin JSON qui ne respecte pas le format JSON requis et ne peut être correctement désérialisée.

Exemple de code

Code d’entrée :

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

Code de sortie :

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

Recommandations

  • Vérifiez que le chemin JSON est correctement formaté et qu’il ne contient pas de caractères non valides.

  • Pour toute assistance supplémentaire, veuillez nous contacter à l’adresse suivante : snowconvert-support@snowflake.com

SSC-EWI-TD0057

Gravité

Faible

Description

La fonction NEW JSON accepte les données JSON au format chaîne ou binaire. Lorsque les données sont au format binaire, la fonction reste inchangée car Snowflake ne peut pas interpréter les métadonnées du format binaire concernant l’objet JSON. Pour plus de détails, veuillez vous référer à la documentation de Teradata NEW JSON.

Exemple de code

Code d’entrée

SELECT NEW JSON ('160000000268656C6C6F0006000000776F726C640000'xb, BSON);
Copy

Code de sortie

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

Recommandations

SSC-EWI-TD0006

Gravité

Faible

Description

Le type de données FLOAT ne prend pas en charge les valeurs par défaut à l’aide des spécifications DEFAULT TIME, DEFAULT DATE, DEFAULT CURRENT_DATE, DEFAULT CURRENT_TIME ou DEFAULT CURRENT_TIMESTAMP.

Exemple de code

Teradata :

CREATE TABLE T_2004
(
    -- In the output code all of these columns will be FLOAT type
    -- and will include the SSC-EWI-TD0006 message.
    COL1 FLOAT DEFAULT TIME,
    COL2 FLOAT DEFAULT DATE,
    COL3 FLOAT DEFAULT CURRENT_DATE,
    COL4 FLOAT DEFAULT CURRENT_TIME,
    COL5 FLOAT DEFAULT CURRENT_TIMESTAMP
);
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

Recommandations

  • Aucune action n’est requise de votre part.

  • Pour une assistance supplémentaire, veuillez nous contacter à l’adresse suivante : snowconvert-support@snowflake.com

SSC-EWI-TD0002

Cet EWI est obsolète depuis la version SnowConvert 28.1.100.

Gravité

Élevé

Description

Lorsqu’une instruction SQL inclut un sélecteur de colonne de type INTERVAL, SnowConvert ajoute un message EWI (Erreur, Avertissement, Information) et crée une fonction stub. Snowflake ne prenant pas en charge le type de données INTERVAL, une intervention manuelle sera nécessaire une fois la conversion terminée.

Exemple de code

Teradata :

SELECT
     CAST('07:00' AS INTERVAL HOUR(2) TO MINUTE),
     CAST('08:00' AS INTERVAL HOUR(2) TO MINUTE) As Test_Interval;
Copy

Snowflake Scripting:

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

Recommandations

SSC-EWI-TD0053

Certaines parties du code ont été supprimées pour rendre l’exemple plus clair et plus facile à comprendre.

Précision des représentations varchar générées

La fonction PERIOD_UDF crée une représentation sous forme de chaîne d’une période en utilisant les formats d’horodatage et d’heure par défaut de Snowflake. Par défaut, les horodatages comportent trois décimales pour plus de précision, tandis que les variables temporelles n’ont pas de décimales. Si vous devez ajuster la précision de la chaîne de sortie, deux options s’offrent à vous.

Utilisez la version à trois paramètres de PERIOD_UDF avec le paramètre PRECISIONDIGITS. Ce paramètre accepte un entier de 0 à 9 et contrôle le nombre de décimales dans la partie temps fractionnel du résultat. Alors que Snowflake supporte jusqu’à neuf décimales, Teradata n’en supporte que six. Par exemple :

Appel

Résultat

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'

  • Définir le format de l’heure pour la sortie de la session : utilisez les commandes ALTER SESSION SET TIMESTAMP_NTZ_OUTPUT_FORMAT = <format> et ALTER SESSION SET TIME_OUTPUT_FORMAT = <format> pour modifier l’affichage des horodatages et des heures dans votre session.

Vous pouvez modifier les formats par défaut de Snowflake pour la session en cours afin de spécifier le nombre de chiffres de précision souhaité. Ces changements affecteront toutes les exécutions ultérieures de PERIOD_UDF au cours de votre session.

Exemple de code

Code d’entrée :

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

Code de sortie :

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

Recommandations

  • Étant donné que PERIOD et ses fonctions connexes sont simulés en utilisant le type de données varchar, nous vous recommandons de vérifier l’exactitude des résultats.

  • Pour toute assistance supplémentaire, veuillez nous contacter à l’adresse suivante : snowconvert-support@snowflake.com

SSC-EWI-TD0077

Certaines parties du code de sortie ont été supprimées pour rendre l’exemple plus clair et plus facile à suivre.

Gravité

Modéré

Description

SnowConvert (SC) ne prend en charge que les clauses RESET WHEN qui utilisent des opérateurs de comparaison binaires (<=, >= ou =). Si vous utilisez d’autres conditions, telles que IS NOT NULL, SC supprimera la clause RESET WHEN et affichera un message d’erreur car Snowflake ne prend pas en charge ces conditions.

Ce message d’erreur apparaît lorsque la condition RESET WHEN fait référence à une expression que l’outil de migration ne peut pas localiser. À l’heure actuelle, l’outil ne prend en charge que les alias de colonne définis au sein d’une même requête.

Exemple de code

La condition n’est pas binaire

Code d’entrée :

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

Code de sortie

// 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

L’expression de la condition n’a pas été trouvée

Code d’entrée :

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

Code de sortie

// 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

Recommandations

SSC-EWI-TD0012

Gravité

Faible

Description

Cet avertissement apparaît lorsque SnowConvert détecte une colonne de type de données BINARY avec une valeur DEFAULT. Étant donné que Snowflake ne prend pas en charge les valeurs par défaut pour les colonnes BINARY, SnowConvert supprime la spécification de la valeur DEFAULT.

Exemple de code

Teradata :

CREATE TABLE TableExample
(
ColumnExample BINARY DEFAULT '00000000'XB NOT NULL
)
Copy

Snowflake Scripting:

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

Recommandations

SSC-EWI-TD0003

Gravité

Faible

Description

Dans Snowflake, les fonctions de découpage (LTRIM, RTRIM ou TRIM) ne prennent en charge le classement que lorsqu’elles suppriment les espaces vides ou les caractères d’espacement. Elles ne prennent pas en charge le classement des autres types de caractères.

Lorsque SnowConvert rencontre les fonctions LTRIM, RTRIM ou TRIM (avec les options LEADING ou TRAILING) sur une colonne classée, il ajoute automatiquement une fonction COLLATE. Cette fonction crée une copie sans classement de la colonne d’entrée avant d’appliquer l’opération de découpe. L’EWI vous alerte que le classement de la colonne a été supprimé avant l’application de la fonction de découpage. Par conséquent, la sortie coupée n’aura pas de paramètres de classement, ce qui peut affecter les comparaisons de chaînes ultérieures utilisant ce résultat.

Exemple de code

Teradata :

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

SELECT
    TRIM(BOTH '0' FROM col1),
    TRIM(LEADING '  ' FROM col1),
    TRIM(TRAILING '0' FROM col1),
    LTRIM(col1, '0'),
    RTRIM(col1)
FROM
    collateTable;
Copy

Snowflake Scripting:

CREATE OR REPLACE TABLE collateTable (
	col1 VARCHAR(50) 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

Recommandations

  • Pour maintenir un comportement de comparaison cohérent, ajoutez le classement de la colonne d’origine au résultat de la fonction TRIM à l’aide de la fonction COLLATE. Spécifiez la valeur de classement d’origine sous la forme d’une chaîne littérale dans le deuxième argument.

  • Pour toute assistance supplémentaire, contactez-nous à l’adresse suivante : snowconvert-support@snowflake.com

SSC-EWI-TD0052

Gravité

Faible

Description

Teradata et Snowflake convertissent automatiquement les valeurs des chaînes en nombres lorsqu’elles sont transmises à des fonctions qui attendent des paramètres numériques. Les valeurs des chaînes sont analysées et converties en leurs équivalents numériques.

Teradata et la langue cible traitent différemment les chaînes numériques. Teradata est plus flexible et peut analyser différents formats de chaînes en tant que nombres, y compris :

  • Chaînes vides ou chaînes contenant uniquement des espaces blancs

  • Chaînes avec tirets intégrés

  • Nombres sans chiffres dans la mantisse ou l’exposant

  • Symboles monétaires

  • Nombres avec séparateurs de chiffres

  • Nombres où le signe apparaît après les chiffres

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

  • '$50' -> 50

  • '5000-' -> -5000

  • '1 569 284,55' -> 1569284,55

Snowflake utilise une conversion optimiste automatique des chaînes et s’attend à ce que les chaînes correspondent aux formats TM9 ou TME. Lorsque les chaînes ne correspondent pas à ces formats, la conversion échoue. Pour remédier à ce problème, SnowConvert traite les littéraux de chaîne qui exigent une conversion en valeurs numériques en générant des chaînes qui correspondent aux formats TM9 ou TME. Cela permet à Snowflake de les analyser correctement. Notez que cette conversion ne fonctionne que pour les valeurs littérales des chaînes ; les valeurs non littérales peuvent ne pas être analysées correctement par Snowflake.

Exemple de code

Code d’entrée :

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

Code de sortie :

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

Recommandations

  • Aucune action n’est requise de votre part.

  • Pour une assistance supplémentaire, veuillez nous contacter à l’adresse suivante : snowconvert-support@snowflake.com

SSC-EWI-TD0066

Certaines parties du code de sortie ont été supprimées pour rendre l’exemple plus clair et plus facile à suivre.

Gravité

Faible

Description

Ce message apparaît lorsque SnowConvert rencontre un identificateur délimiteur Unicode de Teradata qui contient des caractères non pris en charge par Snowflake. Pour plus d’informations, voir Teradata Unicode Delimited Identifier.

Exemple de code

Code d’entrée :

SELECT * FROM U&"#000f#ffff" UESCAPE '#';
Copy

Code de sortie :

// 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

Recommandations

  • N’utilisez que des caractères Unicode valides lorsque vous créez des identificateurs dans Snowflake.

  • Pour toute assistance supplémentaire, veuillez nous contacter à l’adresse suivante : snowconvert-support@snowflake.com

SSC-EWI-TD0027

Gravité

Faible

Description

Snowflake ne prend pas en charge les attributs temporels intégrés de Teradata tels que VALIDTIME ou TRANSACTIONTIME, ce qui se traduit par un message d’erreur, d’avertissement ou d’information (EWI).

Exemple de code

Entrée Teradata :

CREATE MULTISET TABLE SAMPLE_TABLE
(
    COL1 PERIOD(TIMESTAMP(6) WITH TIME ZONE) NOT NULL AS TRANSACTIONTIME
);
Copy

Sortie 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

Recommandations

  • Créez manuellement les colonnes TIMESTAMP et définissez leurs valeurs par défaut sur CURRENT_TIMESTAMP.

  • Utilisez les flux de table pour suivre les modifications de vos données et capturer des métadonnées pour chaque modification.(Guide)

  • Pour toute assistance supplémentaire, contactez-nous à l’adresse suivante : snowconvert-support@snowflake.com

SSC-EWI-TD0076

Gravité

Modéré

Description

Les tables étrangères dans Teradata vous permettent d’accéder aux données stockées dans des emplacements externes comme Amazon S3, Azure Blob storage et Google Cloud Storage. Bien que Snowflake ne prenne pas en charge pas cette syntaxe spécifique, vous pouvez obtenir une fonctionnalité similaire en utilisant :

  • Tables externes

  • Tables Iceberg

  • Tables standards

Exemple de code

Code d’entrée :

SELECT cust_id, income, age FROM
FOREIGN TABLE (SELECT cust_id, income, age FROM twm_customer)@hadoop1 T1;
Copy

Code de sortie :

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

Recommandations

  • Pour remplacer les tables étrangères de Teradata, vous pouvez utiliser les tables externes de Snowflake. Ces tables lisent les données directement à partir des plateformes de stockage Cloud (Amazon S3, Google Cloud Storage ou Microsoft Azure). Cela vous permet d’interroger les fichiers data lake comme s’il s’agissait de tables de base de données. Les tables externes prennent en charge tous les formats de fichier qui fonctionnent avec les commandes COPY INTO

  • Les tables Iceberg de Snowflake offrent une autre option. Ces tables utilisent des formats ouverts et stockent les données sous forme de fichiers Parquet dans votre propre stockage Cloud.

  • Les tables standard de Snowflake peuvent également remplacer la fonctionnalité des tables étrangères de Teradata.

  • Pour obtenir de l’aide supplémentaire, contactez-nous à l’adresse suivante : snowconvert-support@snowflake.com

  • SSC-EWI-TD0091

    Certaines sections du code de sortie ont été supprimées pour en faciliter la compréhension.

    Gravité

    Medium

    Description

    Dans les scripts Teradata, vous pouvez convertir les types de données en utilisant l’expression CAST avec la syntaxe suivante :

    <expression> ( <DataType> )
    
    Copy

    Lors de la conversion de types de données utilisant CAST avec DATE ou TIME, une ambiguïté peut survenir car ces mots-clés fonctionnent également comme des fonctions CURRENT_DATE et CURRENT_TIME respectivement.

    Par conséquent, lors de l’examen d’un code sans contexte supplémentaire concernant l’expression nécessitant une opération CAST, il devient difficile de faire la distinction entre une véritable opération CAST et une fonction qui prend simplement des paramètres DATE ou TIME en entrée.

    Pour déterminer si <expression> est une colonne ou une fonction définie par l’utilisateur (UDF), vous devez inclure l’instruction CREATE TABLE ou CREATE FUNCTION correspondante lors de la conversion du code. Cela fournit le contexte nécessaire à la définition de l’expression.

    Par exemple, examinons l’instruction suivante SELECT. Lorsque nous rencontrons AMBIGUOUS_EXPR, sans contexte supplémentaire, nous ne pouvons pas déterminer s’il s’agit d’un appel de fonction ou d’une conversion de type vers DATE. Cependant, nous pouvons être certains que COL1 (DATE) est une opération de conversion de type (CAST) car COL1 est une colonne de la table TAB.

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

    Exemple de code

    Code d’entrée :

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

    Code de sortie

    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

    Recommandations

    SSC-EWI-TD0017

    Gravité

    Faible

    Description

    Cet avertissement apparaît lorsque SnowConvert détecte une instruction Create Table qui inclut l’option GLOBAL TEMPORARY TRACE. Cette fonctionnalité, qui est spécifique à Teradata (TRACE), n’est pas disponible dans Snowflake et sera supprimée lors de la conversion.

    Exemple de code

    Teradata :

    CREATE GLOBAL TEMPORARY TRACE TABLE TableExample
    (
    ColumnExample Number
    )
    
    Copy

    Snowflake Scripting:

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

    Recommandations

    • Remarque : vous pouvez répliquer la fonctionnalité de traçage dans Snowflake à l’aide d’une EVENT TABLE. Pour plus d’informations, veuillez vous référer à la documentation de Snowflake sur la connexion et le traçage.

    • Pour toute assistance supplémentaire, veuillez nous contacter à l’adresse suivante : snowconvert-support@snowflake.com

    SSC-EWI-TD0046

    Gravité

    Medium

    Description

    Cette erreur se produit lors du référencement d’une table DBC où la colonne sélectionnée n’a pas de correspondance dans Snowflake.

    Exemple de code

    Entrée :

    CREATE VIEW SAMPLE_VIEW
    AS
    SELECT PROTECTIONTYPE FROM DBC.DATABASES;
    
    Copy

    Sortie :

    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

    Recommandations

    SSC-EWI-TD0023

    Gravité

    Faible

    Description

    La variable de statut ACTIVITY_COUNT indique le nombre de lignes modifiées par une instruction SQL DML (telle que INSERT, UPDATE ou DELETE) lorsqu’elle est utilisée dans une procédure intégrée SQL ou une procédure stockée. Pour plus de détails, visitez ici.

    Pour répliquer le comportement de ACTIVITY_COUNT, vous pouvez utiliser la solution de contournement décrite dans la spécification de traduction.

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

    Lorsque vous utilisez ACTIVITY_COUNT dans une instruction SELECT ou SET INTO VARIABLE, vous ne pouvez pas le remplacer directement par la solution de contournement mentionnée précédemment.

    Exemple de code

    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

    Correction manuelle

    Pour récupérer le nombre de lignes qui ont été insérées, mises à jour ou supprimées, vous pouvez utiliser une partie de la solution de contournement décrite ci-dessus.

    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

    Pour utiliser cette requête dans Snowflake, vous devez la modifier pour utiliser la syntaxe SELECT INTO VARIABLE de Snowflake.

    En outre, si vous constatez des résultats incorrects lors de l’utilisation de RESULT_SCAN(LAST_QUERY_ID()), veuillez vous référer à [SSC-FDM-TD0033](../functional-difference/teradataFDM. md) pour obtenir des informations sur les limites potentielles et sur la manière d’y remédier.

    Recommandations

    • Appliquez manuellement la solution de contournement proposée.

    • Consultez [SSC-FDM-TD0033](../functional-difference/teradataFDM. md) pour comprendre les limites de l’utilisation de LAST_QUERY_ID et la manière de les gérer.

    • Pour toute assistance supplémentaire, contactez-nous à l’adresse suivante : snowconvert-support@snowflake.com

    SSC-EWI-TD0051

    Gravité

    Faible

    Description

    Lorsque vous travaillez avec des types de données octet, il existe une différence importante entre Teradata et Snowflake :

    • Dans Teradata, la fonction BYTES comptera toujours les zéros de fin parce qu’elle utilise un stockage de longueur fixe. Cela signifie qu’il renvoie la taille de la colonne plutôt que la taille réelle des données.

    • Dans Snowflake, la fonction LENGTH renvoie la taille réelle des données stockées car elle utilise un stockage de longueur variable pour les types binaires.

    Voici un exemple pour illustrer cette différence :

    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

    Équivalent du code dans 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

    Exemple de code :

    Code d’entrée :

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

    Code de sortie :

    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

    Recommandations

    • L’analyse des résultats de la fonction BYTES montre que la fonction LENGTH de Snowflake fournit déjà le comportement souhaité et qu’aucune modification n’est donc nécessaire.

    • Pour toute assistance supplémentaire, veuillez nous contacter à l’adresse suivante : snowconvert-support@snowflake.com

    SSC-EWI-TD0034

    Certaines parties du code de sortie ont été supprimées pour rendre l’exemple plus clair et plus facile à suivre.

    Gravité

    Faible

    Description

    L’exécution de plusieurs instructions SQL dans une seule requête n’est pas possible. Votre requête a été traitée en une seule transaction.

    Cette information d’avertissement d’erreur (EWI) apparaît exclusivement lorsque l’indicateur de langue cible PL est défini sur Javascript à l’aide de la commande : “–PLTargetLanguage Javascript”

    Exemple de code

    Entrée :

    -- Additional Params: --PLTargetLanguage Javascript
    REPLACE PROCEDURE proc1()
      BEGIN
        BEGIN REQUEST;
          SELECT* FROM TABLE1;
        END REQUEST;
    END;
    
    Copy

    Sortie :

    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

    Recommandations

    SSC-EWI-TD0024

    Gravité

    Faible

    Description

    Cet avertissement apparaît lorsqu’une fonction AGGREGATE est utilisée dans une instruction ABORT commentée à l’intérieur d’une procédure stockée.

    Exemple de code

    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

    Recommandations

    SSC-EWI-TD0010

    Gravité

    Faible

    Description

    L’attribut de colonne UPPERCASE, utilisé pour convertir le texte en majuscules, n’est pas disponible dans Snowflake.

    Exemple de code

    Teradata :

    CREATE TABLE T_2010
    (
        col1 VARCHAR(1) UPPERCASE
    );
    
    Copy

    Snowflake Scripting:

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

    Recommandations

    • La clause UPPERCASE convertit les caractères minuscules en majuscules lors du stockage des données. Par exemple, « aaa » est enregistré sous la forme « AAA ». Pour ce faire, vous pouvez ajouter la fonction UPPER à toutes les instructions d’insertion. Toutefois, sachez que vous devrez également modifier tous les processus ETL qui chargent des données externes.

    • Pour toute assistance supplémentaire, veuillez nous contacter à l’adresse suivante : snowconvert-support@snowflake.com

    SSC-EWI-TD0041

    Gravité

    Faible

    Description

    Le format de fichier que vous avez fourni n’est pas pris en charge par le système.

    Exemple de code

    Entrée :

    SELECT
        cast(T_2041.integer_column as integer);
    
    Copy

    Sortie :

    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

    Recommandations

    SSC-EWI-TD0061

    Gravité

    Faible

    Description

    SnowConvert ne prend pas en charge ni ne transforme la fonction TD_UNPIVOT, qui convertit les données des colonnes en lignes dans une table.

    Cette transformation a besoin d’informations sur les noms des colonnes de la ou des tables pour fonctionner correctement. Si ces informations ne sont pas disponibles, la transformation peut être incomplète, avec des colonnes manquantes dans le résultat. Dans ces cas, un message d’erreur, d’avertissement ou d’information (EWI) est généré.

    Exemple de code

    Code d’entrée :

    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

    Code de sortie :

    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

    Recommandations

    • Vous pouvez fournir des informations sur les colonnes à l’outil de conversion en utilisant l’une des deux méthodes suivantes :

      • Incluez la spécification de la table dans le même fichier que l’appel TD_UNPIVOT

      • Listez des colonnes spécifiques dans la requête SELECT de l’expression ON au lieu d’utiliser SELECT * ou simplement le nom de la table

    • Si vous dépivotez les colonnes ALL des tables d’entrée, vous pouvez ignorer ce problème. Toutefois, si vous ne dépivotez que certaines colonnes, il en résultera des données manquantes.

    • Pour une assistance supplémentaire, veuillez nous contacter à l’adresse suivante : snowconvert-support@snowflake.com

    SSC-EWI-TD0004

    Gravité

    Faible

    Description

    Les procédures Snowflake n’ont pas d’équivalent direct pour la fonctionnalité Continue Handler de Teradata. Bien que SnowConvert puisse gérer certains codes d’exception et émuler un comportement similaire, il génère un message EWI (erreur, avertissement ou information) lorsqu’il rencontre des codes d’exception non pris en charge dans les instructions du gestionnaire Continue.

    Exemple de code

    Teradata :

    REPLACE PROCEDURE PURGING_ADD_TABLE
    (
     IN inDatabaseName     	VARCHAR(30),
     IN inTableName    		VARCHAR(30)
    )
    BEGIN
     DECLARE vCHAR_SQLSTATE CHAR(5);
     DECLARE vSUCCESS       CHAR(5);
    
      DECLARE CONTINUE HANDLER FOR SQLSTATE 'UNSUPPORTED'
      BEGIN
         SET vCHAR_SQLSTATE = SQLCODE;
         SET vSUCCESS    = SQLCODE;
      END;
    
      SELECT 1;
    
    END;
    
    Copy

    Snowflake Scripting:

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

    Recommandations

    SSC-EWI-TD0055

    Ce numéro d’alerte précoce (EWI) n’est plus pris en charge. Veuillez consulter la documentation SSC-FDM-TD0029 pour obtenir des informations à jour.

    Éléments de format qui dépendent des paramètres de session

    Les éléments de format Teradata suivants sont mappés à des fonctions Snowflake qui nécessitent des paramètres de session spécifiques. Pour garantir des résultats cohérents entre Teradata et Snowflake, vous devez configurer ces paramètres de session en fonction de vos paramètres Teradata :

    • D : mappé à la fonction DAYOFWEEK. Notez que les résultats peuvent différer entre Teradata et Snowflake en raison des différents paramètres par défaut. Teradata utilise le dimanche comme premier jour de la semaine, tandis que Snowflake utilise le lundi.

    • WW : mappé à la fonction WEEK. Les résultats peuvent différer en raison des différentes politiques de calcul des semaines. Snowflake utilise par défaut la norme ISO (la première semaine doit contenir au moins quatre jours de janvier), tandis que Teradata considère le 1er janvier comme le début de la première semaine.

    Pour modifier les paramètres de session, utilisez la commande ALTER SESSION SET parameter_name = value. Pour plus de détails sur les paramètres de session disponibles et leur utilisation, consultez cette page.

    Version à paramètre unique de TO_CHAR

    La fonction TO_CHAR(Datetime) avec un seul paramètre utilise les formats de date et d’heure par défaut définis dans les paramètres de votre session. Ces paramètres sont les suivants :

    • TIMESTAMP_LTZ_OUTPUT_FORMAT

    • TIMESTAMP_NTZ_OUTPUT_FORMAT

    • TIMESTAMP_TZ_OUTPUT_FORMAT

    • TIME_OUTPUT_FORMAT

    Pour garantir un comportement cohérent entre Teradata et Snowflake, assurez-vous que ces paramètres correspondent à vos paramètres Teradata.

    Lors de la conversion de valeurs numériques en chaînes à l’aide de TO_CHAR(numérique), Snowflake utilise automatiquement le format TM9 ou TME pour créer une représentation compacte de la chaîne. Étant donné que Teradata crée également des représentations numériques compactes par défaut, aucun formatage supplémentaire n’est nécessaire.

    Exemple de code

    Code d’entrée :

    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

    Code de sortie :

    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

    Recommandations

    • Lorsque vous travaillez avec des fonctions de format (FF), utilisez des types DateTime qui correspondent à la précision de Teradata ou spécifiez une précision dans l’élément de format pour garantir un comportement cohérent.

    • Pour le formatage des fuseaux horaires, assurez-vous que le premier paramètre est de type TIMESTAMP_TZ pour obtenir des résultats cohérents. Notez que le type de données TIME de Snowflake ne prend pas en charge les informations relatives au fuseau horaire.

    • Configurez les paramètres de session pour qu’ils correspondent aux valeurs par défaut de Teradata afin de maintenir un comportement cohérent.

    • Pour toute assistance supplémentaire, contactez-nous à l’adresse suivante : snowconvert-support@snowflake.com

    SSC-EWI-TD0082

    Gravité

    Medium

    Description

    La fonction Translate avec les paramètres d’encodage actuels ne peut pas être utilisée dans Snowflake. Au cours du processus de traduction, cette fonction sera commentée.

    Exemple de code

    Code d’entrée :

    SELECT Translate('abc' USING KANJISJIS_TO_LATIN);
    
    Copy

    Code de sortie

    SELECT
    !!!RESOLVE EWI!!! /*** SSC-EWI-TD0082 - TRANSLATE FUNCTION USING KANJISJIS_TO_LATIN ENCODING IS NOT SUPPORTED ***/!!!
    Translate('abc' USING KANJISJIS_TO_LATIN);
    
    Copy

    Recommandations

    SSC-EWI-TD0020

    Ce message d’avertissement n’est plus utilisé. Veuillez consulter SSC-EWI-0009 pour la documentation actuelle.

    Gravité

    Faible

    Description

    Snowflake ne prend en charge actuellement que la syntaxe POSIX Basic Regular Expression. Les fonctions avancées d’expression régulière ne sont pas disponibles.

    Cet avertissement apparaît lorsqu’un appel de fonction à _REGEX_SUBSTR, REGEX_REPLACE _ ou REGEX_INSTR est converti en Snowflake. Il alerte les utilisateurs sur le fait que certaines fonctions d’expression régulière peuvent ne pas être prises en charge par Snowflake. Les fonctionnalités importantes non prises en charge sont les suivantes :

    • Lookahead

    • Lookbehind

    • Les groupes qui ne capturent pas

    Exemple de code

    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

    Recommandations

    • Examinez chaque modèle d’expression régulière pour déterminer si des ajustements manuels sont nécessaires. Pour plus de détails sur les capacités regex de Snowflake et les options alternatives, consultez ici.

    • Pour toute assitance supplémentaire, contactez notre équipe de support à l’adresse suivante : snowconvert-support@snowflake.com

    SSC-EWI-TD0060

    Certaines parties du code de sortie ont été supprimées pour rendre l’exemple plus clair et plus facile à suivre.

    Gravité

    Faible

    Description

    L’outil SnowConvert peut transformer la fonction JSON_TABLE, mais il doit connaître les noms des colonnes sélectionnées dans la sous-requête JSON_TABLE ON pour effectuer la transformation correctement.

    Cet avertissement apparaît lorsque les noms des colonnes ne sont pas explicitement spécifiés dans une sous-requête (comme lors de l’utilisation de SELECT *) et que le système ne peut pas trouver les informations relatives à la structure de la table. Sans cette information, les noms des colonnes ne peuvent pas être déterminés automatiquement.

    Pour savoir comment charger les données JSON dans une table, veuillez vous référer à notre page de documentation.

    Exemple de code

    Code d’entrée :

    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

    Code de sortie :

    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

    Recommandations

    • Veillez à inclure les définitions des tables lorsque vous fournissez du code à SnowConvert. Sans elles, vous devrez réexécuter le code.

    • Pour toute assistance supplémentaire, contactez-nous à l’adresse suivante : snowconvert-support@snowflake.com

    SSC-EWI-TD0031

    Gravité

    Faible

    Description

    Lorsque vous comparez les types de données CHAR dans Teradata et Snowflake, il y a une différence importante à noter. Dans Teradata, CHAR est de longueur fixe, ce qui signifie que la fonction LIKE tente de correspondre à la longueur totale de la colonne, y compris les espaces de fin. Cela peut conduire à des résultats inattendus. En revanche, le type CHAR de Snowflake est de longueur variable, de sorte que la fonction LIKE ne correspond qu’à la valeur réelle stockée, sans tenir compte des espaces de fin. Voici un exemple qui illustre ce comportement :

    Exemple de code

    Entrée :

    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

    Sortie :

    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

    Recommandations

    SSC-EWI-TD0005

    Gravité

    Critique

    Description

    Le code a été converti avec succès, mais il se peut qu’il ne fonctionne pas comme prévu car cette fonction n’a pas encore été entièrement mise en œuvre.

    L’avertissement prévient les utilisateurs que l’utilisation de cette instruction entraînera une fonctionnalité différente du script original.

    Exemple de source

    Code d’entrée BTEQ :

    .SET SIDETITLES ON
    
    Copy

    Code de sortie 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

    Recommandations

    SSC-EWI-TD0083

    Certaines parties du code de sortie ont été supprimées pour en faciliter la compréhension.

    Gravité

    Medium

    Description

    SnowConvert ne peut pas traiter simultanément plusieurs instructions SELECT complexes. Cette limite existe parce que la conversion de ces instructions nécessite de les mapper soit à des expressions de table communes (CTEs), soit à des clauses FROM composites, ce qui peut entraîner des erreurs de compilation ou des boucles logiques infinies.

    Qu’entend-on par clause complexe SELECT ?

    Les instructions qui doivent être mappées à une expression de table commune (CTE) ou à une clause composite FROM, y compris les fonctions NORMALIZE, EXPAND ON et RESET WHEN.

    Exemple de code

    Code d’entrée :

    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

    Code de sortie

    // 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

    Recommandations

    SSC-EWI-TD0070

    Ce numéro d’alerte précoce (EWI) n’est plus pris en charge. Veuillez consulter la documentation SSC-FDM-TD0030 pour obtenir des informations à jour.

    Gravité

    Medium

    Description

    Lorsque SC remplace une instruction Goto par une section Label, il ajoute automatiquement une instruction de retour à la fin de la section s’il n’y en a pas. Cela permet de s’assurer que le flux d’exécution du programme reste le même que dans le code d’origine.

    Lorsqu’une commande Goto BTEQ est exécutée, toutes les instructions situées entre la commande Goto et l’étiquette correspondante sont ignorées. Pour éviter toute exécution involontaire après avoir atteint l’étiquette, vous devez inclure une instruction de retour dans la section de l’étiquette.

    Il est important de noter que lorsqu’une commande Goto est exécutée, elle saute toutes les instructions jusqu’à ce qu’elle atteigne l’étiquette correspondante. L’exécution du programme se poursuit ensuite à partir de cette étiquette. Toute section d’étiquette définie avant la commande Goto ne sera jamais exécutée.

    Exemple de code

    Code d’entrée :

    -- Additional Params: --scriptsTargetLanguage SnowScript
    .LOGON dbc,dbc;
    select 'STATEMENTS';
    .GOTO LABEL_B
    select 'IGNORED STATEMENTS';
    .label LABEL_B
    select 'LABEL_B STATEMENTS';
    
    Copy

    Code de sortie

    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

    Recommandations

    SSC-EWI-TD0001

    Certaines parties du code de sortie ont été supprimées pour en faciliter la compréhension.

    Gravité

    Faible

    Description

    Cet avertissement apparaît lorsque SnowConvert identifie des modèles récursifs dans les expressions aliasées. Dans de tels cas, SnowConvert ne peut pas effectuer la transformation Forward Alias, qui est nécessaire pour que les alias fonctionnent correctement dans Snowflake.

    On parle d’alias récursif lorsque deux alias ou plus font référence les uns aux autres selon un modèle circulaire. Cela peut se produire directement, lorsque l’alias A fait référence à l’alias B et que l’alias B fait référence à l’alias A, ou indirectement (transitivement), lorsque la référence circulaire se produit par l’intermédiaire de plusieurs alias Medium.

    Exemple de code

    Remarque : bien que Snowflake ne prenne généralement pas en charge les alias récursifs, certains cas de base sont pris en charge.

    Remarque : Snowflake ne prend pas en charge les alias récursifs en général. Toutefois, certains cas de base sont pris en charge, comme le montrent les exemples ci-dessous.

    Le code ci-dessous montre l’exécution réussie dans Snowflake après l’achèvement du processus de migration :

    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

    L’exemple de code ci-dessous ne s’exécutera pas correctement :

    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

    Recommandations

    • Vérifiez que votre code ne contient pas d’alias récursifs. L’EWI identifie le premier alias récursif, mais il peut y en avoir d’autres dans votre code qui nécessitent une attention particulière.

    • Pour toute assistance supplémentaire, contactez-nous à l’adresse suivante : snowconvert-support@snowflake.com

    SSC-EWI-TD0087

    Cette documentation n’est plus conservée. Veuillez vous référer à SSC-FDM-TD0026 pour des informations actualisées.

    Certaines parties du code ont été omises pour que l’exemple reste clair et concis.

    Gravité

    Medium

    Description

    Lorsqu’ils répliquent la fonctionnalité de l’instruction SQL IF, les développeurs combinent souvent les commandes GOTO avec les commandes IF et LABEL. Ces combinaisons peuvent être directement converties en instructions if, if-else ou if-elseif-else. Dans ces cas, vous devez supprimer les commandes GOTO pour éviter qu’elles ne soient remplacées par des sections LABEL, car elles deviennent redondantes.

    Exemple de code

    Code d’entrée :

    -- Additional Params: --scriptsTargetLanguage SnowScript
    .If ActivityCount = 0 THEN .GOTO endIf
    DROP TABLE TABLE1;
    .Label endIf
    SELECT A FROM TABLE1;
    
    Copy

    Code de sortie

    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

    Recommandations

    SSC-EWI-TD0025

    Gravité

    Faible

    Description

    Cet avertissement apparaît lorsque vous utilisez une fonction CAST avec un format de sortie que Snowflake Scripting ne prend pas en charge.

    Exemple de code

    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

    Recommandations

    • Vérifiez que le code converti fonctionne de la même manière que le code source.

    • Pour toute assitance supplémentaire, contactez notre équipe de support à l’adresse suivante : snowconvert-support@snowflake.com

    SSC-EWI-TD0040

    Gravité

    Faible

    Description

    Le format de fichier que vous avez fourni n’est pas pris en charge par le système.

    Exemple de code

    Entrée :

    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

    Sortie :

    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

    Recommandations

    .