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;
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;
Recommandations¶
Pour obtenir une assistance supplémentaire, veuillez contacter notre équipe de support à l’adresse suivante : snowconvert-support@snowflake.com
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;
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;
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;
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;
Recommandations¶
Pour obtenir une assistance supplémentaire, veuillez contacter notre équipe de support à l’adresse suivante : snowconvert-support@snowflake.com
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;
Code de sortie :¶
!!!RESOLVE EWI!!! /*** SSC-EWI-TD0059 - SNOWFLAKE USER DEFAULT TIME ZONE MAY REQUIRE CONFIGURATION TO MATCH TERADATA VALUE ***/!!!
ALTER SESSION UNSET TIMEZONE;
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() );
);
);
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()
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);
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"}}'
;
Recommandations¶
Pour une assistance supplémentaire, veuillez nous contacter à l’adresse suivante : snowconvert-support@snowflake.com
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');
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 ***/!!!;
Recommandations¶
Pour obtenir une assistance supplémentaire, veuillez contacter notre équipe de support à l’adresse suivante : snowconvert-support@snowflake.com
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;
Code de sortie :¶
SELECT
CURRENT_ROLE() !!!RESOLVE EWI!!! /*** SSC-EWI-TD0068 - SNOWFLAKE DOES NOT SUPPORT PROFILES, REFERENCING ROLE INSTEAD ***/!!!;
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
);
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"}}'
;
Recommandations¶
Pour obtenir une assistance supplémentaire, veuillez contacter notre équipe de support à l’adresse suivante : snowconvert-support@snowflake.com
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);
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);
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);
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);
Recommandations¶
Pour obtenir une assistance supplémentaire, veuillez contacter notre équipe de support à l’adresse suivante : snowconvert-support@snowflake.com
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
);
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"}}'
;
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;
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;
Recommandations¶
Pour une assistance supplémentaire, veuillez nous contacter à l’adresse suivante : snowconvert-support@snowflake.com
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 |
---|---|
|
|
|
|
|
|
Définir le format de l’heure pour la sortie de la session : utilisez les commandes
ALTER SESSION SET TIMESTAMP_NTZ_OUTPUT_FORMAT = <format>
etALTER 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;
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;
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;
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;
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;
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;
Recommandations¶
Pour obtenir une assistance supplémentaire, veuillez contacter notre équipe de support à l’adresse suivante : snowconvert-support@snowflake.com
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
)
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"}}'
;
Recommandations¶
Pour obtenir une assistance supplémentaire, veuillez contacter notre équipe de support à l’adresse suivante : snowconvert-support@snowflake.com
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;
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;
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 fonctionCOLLATE
. 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;
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;
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 '#';
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";
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
);
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"}}'
;
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;
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;
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
Pour une assistance supplémentaire, veuillez nous contacter à l’adresse suivante : snowconvert-support@snowflake.com
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
Pour obtenir une assistance supplémentaire, veuillez contacter notre équipe de support à l’adresse suivante : snowconvert-support@snowflake.com
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
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.
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
Pour obtenir une assistance supplémentaire, veuillez contacter notre équipe de support à l’adresse suivante : snowconvert-support@snowflake.com
Pour une assistance supplémentaire, veuillez nous contacter à l’adresse suivante : snowconvert-support@snowflake.com
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
Pour une assistance supplémentaire, veuillez nous contacter à l’adresse suivante : snowconvert-support@snowflake.com
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
Identifiez les instructions susceptibles de provoquer l’exception et intégrez-les dans un bloc de code, comme dans les exemples présentés dans le document Continue Handler Translation Reference.
Pour toute assistance supplémentaire, veuillez contacter notre équipe de support à l’adresse suivante : snowconvert-support@snowflake.com
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.TIMESTAMP_LTZ_OUTPUT_FORMAT
TIMESTAMP_NTZ_OUTPUT_FORMAT
TIMESTAMP_TZ_OUTPUT_FORMAT
TIME_OUTPUT_FORMAT
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éesTIME
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
Pour une assistance supplémentaire, veuillez nous contacter à l’adresse suivante : snowconvert-support@snowflake.com
Lookahead
Lookbehind
Les groupes qui ne capturent pas
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
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
Pour une assistance supplémentaire, veuillez nous contacter à l’adresse suivante : snowconvert-support@snowflake.com
Pour obtenir un support supplémentaire, contactez-nous à l’adresse suivante : snowconvert-support@snowflake.com
Pour obtenir une assistance supplémentaire, veuillez contacter notre équipe de support à l’adresse suivante : snowconvert-support@snowflake.com
Pour obtenir une assistance supplémentaire, veuillez contacter notre équipe de support à l’adresse suivante : snowconvert-support@snowflake.com
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
Pour obtenir une assistance supplémentaire, veuillez contacter notre équipe de support à l’adresse suivante : snowconvert-support@snowflake.com
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
Pour obtenir une assistance supplémentaire, veuillez contacter notre équipe de support à 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> )
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;
Exemple de code¶
Code d’entrée :¶
CREATE TABLE TAB (
COL1 VARCHAR(23)
)
SELECT
COL1 (DATE),
AMBIGUOUS_EXPR (DATE)
FROM TAB;
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;
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
)
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"}}'
;
Recommandations¶
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;
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;
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()));
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;
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;
$$;
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;
$$;
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¶
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 :
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
É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
Exemple de code :¶
Code d’entrée :¶
create table sampleTable(
byteColumn byte(10),
varbyteColumn varbyte(15)
);
select bytes(byteColumn), bytes(varbyteColumn) from sampleTable;
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;
Recommandations¶
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;
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`);
}
$$;
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;
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;
$$;
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
);
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"}}'
;
Recommandations¶
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);
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. ***/!!!;
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;
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;
Recommandations¶
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;
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;
$$;
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 :
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 :
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);
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 ***/!!!;
Recommandations¶
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);
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);
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 :
Exemple de code¶
Teradata :¶
SELECT REGEXP_SUBSTR('qaqequ','q(?=u)', 1, 1);
Snowflake Scripting:¶
SELECT
!!!RESOLVE EWI!!! /*** SSC-EWI-TD0020 - REGEXP_SUBSTR FUNCTION ONLY SUPPORTS POSIX REGULAR EXPRESSIONS ***/!!!
REGEXP_SUBSTR('qaqequ','q(?=u)', 1, 1);
Recommandations¶
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;
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;
Recommandations¶
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
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
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
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()
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;
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;
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';
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
$$
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;
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;
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;
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;
Recommandations¶
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;
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
$$
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;
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;
Recommandations¶
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)'
);
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" }}'
;