SnowConvert AI - Problèmes Teradata

SSC-EWI-TD0001

Erreur d’alias de transfert récursif.

Note

Certaines parties du code de sortie sont omises pour des raisons de clarté.

Gravité

Faible

Description

Cet EWI s’affiche chaque fois que SnowConvert AI détecte une récursivité dans les expressions aliasées, ce qui l’empêche d’exécuter la transformation des alias de transfert nécessaire au bon fonctionnement des alias dans l’environnement Snowflake.

Un alias récursif se produit lorsqu’une expression aliasée contient un autre alias et que la deuxième expression aliasée contient le premier alias. Cela peut ne pas être aussi simple que le montre l’exemple, car la récursivité peut se produire plus loin dans la ligne, de manière transitive.

Exemple de code

Remarque : les alias récursifs ne sont pas pris en charge dans Snowflake. Cependant, certaines instances simples le sont.

Note

Notez que l’alias récursif n’est pas pris en charge dans Snowflake. Cependant, certaines instances simples le sont. Consultez les exemples ci-dessous.

L’exemple de code suivant fonctionne dans Snowflake après la migration :

Teradata :
 SELECT
    COL1 AS COL2,
    COL2 AS COL1
FROM
    TABLE_EXAMPLE;
Copy
Snowflake Scripting:
 // SnowConvert AI Helpers Code section is omitted.
SELECT
    COL1 AS COL2,
    !!!RESOLVE EWI!!! /*** SSC-EWI-TD0001 - 'COL1' HAS RECURSIVE REFERENCES. FORWARD ALIAS CONVERSION COULD NOT BE COMPLETED ***/!!!
    COL2 AS COL1
FROM
    TABLE_EXAMPLE;
Copy

En revanche, l’exemple de code suivant ne fonctionne pas :

Teradata :
 SELECT
    A + B as C,
    COL2 + C AS A,
    COL3 AS B
FROM
    TABLE_EXAMPLE;
Copy
Snowflake Scripting:
 // SnowConvert AI Helpers Code section is omitted.
SELECT
    !!!RESOLVE EWI!!! /*** SSC-EWI-TD0001 - 'A' HAS RECURSIVE REFERENCES. FORWARD ALIAS CONVERSION COULD NOT BE COMPLETED ***/!!!
    COL2 + C AS A,
    COL3 AS B,
    A + B as C
FROM
    TABLE_EXAMPLE;
Copy

Meilleures pratiques

  • Examinez votre code et assurez-vous que des alias de transfert récursifs ne sont pas présents. L’EWI indique le nom de la première instance d’un alias qui comprend des références récursives, mais cela ne signifie pas qu’il s’agit de la seule instance de votre code qui en contient.

  • Si vous avez besoin de plus d’assistance, vous pouvez nous envoyer un e-mail à snowconvert-support@snowflake.com.

SSC-EWI-TD0002

Type Interval non pris en charge.

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

Severity

Élevé

Description

Lorsque le sélecteur d’une colonne dans une instruction SQL sera de type INTERVAL, l’EWI sera ajouté et une fonction Stub sera également créée. Il s’agit d’un type qui n’est pas pris en charge dans SnowFlake et qui implique donc un traitement en attente après l’arrêt de SnowConvert AI.

Example Code

Teradata:
 SELECT
     CAST('07:00' AS INTERVAL HOUR(2) TO MINUTE),
     CAST('08:00' AS INTERVAL HOUR(2) TO MINUTE) As Test_Interval;
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

Best Practices

SSC-EWI-TD0003

Le classement n’est pas pris en charge dans les fonctions de rognage. Ajoutez le classement d’origine au résultat de la fonction pour le conserver.

Severity

Faible

Description

Dans Snowflake, les fonctions de rognage (LTRIM, RTRIM ou TRIM) ne prennent pas en charge le classement, sauf si les caractères à rogner sont des caractères d’espacement vides ou blancs.

Si SnowConvert AI détecte une fonction LTRIM, RTRIM ou TRIM LEADING, TRAILING, ou les deux fonctions avec le scénario mentionné ci-dessus, la fonction COLLATE sera générée automatiquement pour créer une copie sans classement de la colonne d’entrée. Cet EWI est généré pour indiquer que le classement de la colonne a été supprimé avant la fonction de rognage, ce qui signifie que le résultat de la fonction n’aura pas de classement et que cela peut modifier les résultats des comparaisons ultérieures utilisant le résultat.

Example Code

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

SELECT
    TRIM(BOTH '0' FROM col1),
    TRIM(LEADING '  ' FROM col1),
    TRIM(TRAILING '0' FROM col1),
    LTRIM(col1, '0'),
    RTRIM(col1)
FROM
    collateTable;
Copy
Snowflake Scripting:
 CREATE OR REPLACE TABLE collateTable (
	col1 VARCHAR(50)
)
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "teradata",  "convertedOn": "07/14/2025",  "domain": "no-domain-provided" }}'
;

SELECT
	TRIM(COLLATE(col1, ''), '0') !!!RESOLVE EWI!!! /*** SSC-EWI-TD0003 - COLLATION NOT SUPPORTED IN TRIM FUNCTIONS, ADD ORIGINAL COLLATION TO FUNCTION RESULT TO PRESERVE IT ***/!!!,
	LTRIM(col1, '  '),
	RTRIM(COLLATE(col1, ''), '0') !!!RESOLVE EWI!!! /*** SSC-EWI-TD0003 - COLLATION NOT SUPPORTED IN TRIM FUNCTIONS, ADD ORIGINAL COLLATION TO FUNCTION RESULT TO PRESERVE IT ***/!!!,
	LTRIM(COLLATE(col1, ''), '0') !!!RESOLVE EWI!!! /*** SSC-EWI-TD0003 - COLLATION NOT SUPPORTED IN TRIM FUNCTIONS, ADD ORIGINAL COLLATION TO FUNCTION RESULT TO PRESERVE IT ***/!!!,
	RTRIM(col1)
	FROM
	collateTable;
Copy

Best Practices

  • Pour éviter des différences fonctionnelles lors des comparaisons, veuillez ajouter le classement d’origine de la colonne à la chaîne de résultat de la fonction TRIM. Pour ce faire, utilisez la fonction COLLATE et spécifiez le classement d’origine de la colonne comme deuxième argument. Cet argument doit être une chaîne littérale avec la valeur de classement.

  • Si vous avez besoin de plus d’assistance, vous pouvez nous envoyer un e-mail à snowconvert-support@snowflake.com.

SSC-EWI-TD0004

Exception SQL non prise en charge sur le Continue Handler.

Severity

Faible

Description

Dans les procédures Snowflake, il n’existe pas de transformation équivalente pour le Continue Handler de Teradata. Pour certains codes d’exception pris en charge, SnowConvert AI effectue un traitement pour émuler ce comportement. Cet EWI est ajouté aux instructions du Continue Handler ayant un code d’exception qui n’est pas pris en charge.

Example Code

Teradata:
 REPLACE PROCEDURE PURGING_ADD_TABLE
( 
 IN inDatabaseName     	VARCHAR(30), 
 IN inTableName    		VARCHAR(30)
)
BEGIN
 DECLARE vCHAR_SQLSTATE CHAR(5);
 DECLARE vSUCCESS       CHAR(5);

  DECLARE CONTINUE HANDLER FOR SQLSTATE 'UNSUPPORTED'
  BEGIN
     SET vCHAR_SQLSTATE = SQLCODE;
     SET vSUCCESS    = SQLCODE;
  END;

  SELECT 1;
 
END;
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

Best Practices

SSC-EWI-TD0005

L’instruction a été convertie, mais sa fonctionnalité n’est pas encore mise en œuvre.

Severity

Critique

Description

L’instruction a été reconnue et convertie, mais le code converti n’aura pas la fonctionnalité attendue, car la mise en œuvre n’est pas encore terminée.

L’avertissement est ajouté pour informer l’utilisateur que lorsque le script utilisera cette instruction, celui-ci n’aura pas l’équivalent fonctionnel attendu.

Exemple de source

Code d’entrée BTEQ :
 .SET SIDETITLES ON
Copy
Code de sortie Python :
 #*** Generated code is based on the SnowConvert AI Python Helpers version 2.0.6 ***
 
import os
import sys
import snowconvert.helpers
from snowconvert.helpers import Export
from snowconvert.helpers import exec
from snowconvert.helpers import BeginLoading
con = None
def main():
  snowconvert.helpers.configure_log()
  con = snowconvert.helpers.log_on()
  #** SSC-EWI-TD0005 - THE STATEMENT WAS CONVERTED BUT ITS FUNCTIONALITY IS NOT IMPLEMENTED YET **
  Export.side_titles(True)
  snowconvert.helpers.quit_application()

if __name__ == "__main__":
  main()
Copy

Best Practices

SSC-EWI-TD0006

Valeur par défaut non valide.

Severity

Faible

Description

Les spécifications de colonnes DEFAULT TIME / DEFAULT DATE / DEFAULT CURREN_DATE / DEFAULT DEFAULT CURRENT_TIME / DEFAULT CURRENT_TIMESTAMP ne sont pas prises en charge pour le type de données FLOAT.

Example Code

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

Best Practices

  • Aucune autre action de l’utilisateur n’est requise.

  • Si vous avez besoin de plus d’assistance, vous pouvez nous envoyer un e-mail à snowconvert-support@snowflake.com.

SSC-EWI-TD0007

La clause GROUP BY n’est pas prise en charge dans le mode Teradata pour la comparaison de chaînes.

Severity

Faible

Description

Ce message d’erreur indique un problème possible lors de la migration des requêtes SQL Teradata vers Snowflake, en particulier en raison de différences dans la façon dont la clause GROUP BY gère la sensibilité des comparaisons de chaînes en mode Teradata.

En mode Teradata, les comparaisons de chaînes dans les clauses GROUP BY sont insensibles à la casse par défaut (NOT CASESPECIFIC), tandis que Snowflake est sensible à la casse, à moins que les colonnes ne soient explicitement définies avec une clause COLLATE insensible à la casse. Cette différence peut entraîner des requêtes qui s’appuient sur un groupement insensible à la casse dans Teradata pour produire des résultats différents dans Snowflake.

Example Code

Teradata:
CREATE TABLE employees (
    employee_id INTEGER,
    first_name VARCHAR(50) NOT CASESPECIFIC,
    department VARCHAR(50)
);

INSERT INTO employees VALUES (1, 'John', 'Sales');
INSERT INTO employees VALUES (2, 'JOHN', 'sales'); 
INSERT INTO employees VALUES (3, 'john', 'SALES');

SELECT first_name, COUNT(*) 
FROM employees 
GROUP BY first_name;
Copy
Snowflake Scripting:
CREATE OR REPLACE TABLE employees (
    employee_id INTEGER,
    first_name VARCHAR(50),
    department VARCHAR(50)
)
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "teradata",  "convertedOn": "10/20/2025",  "domain": "no-domain-provided",  "migrationid": "kwOaAavBVnCx8OhdxEITfg==" }}'
;

INSERT INTO employees
VALUES (1, 'John', 'Sales');

INSERT INTO employees
VALUES (2, 'JOHN', 'sales');

INSERT INTO employees
VALUES (3, 'john', 'SALES');

SELECT
    first_name,
    COUNT(*)
FROM
    employees
!!!RESOLVE EWI!!! /*** SSC-EWI-TD0007 - GROUP BY IS NOT EQUIVALENT IN TERADATA MODE ***/!!!
GROUP BY first_name;
Copy

Différences de comportement attendues

Plateforme

Comportement de regroupement

Exemple de lignes de résultats

Mode Teradata

Groupe “John”, “JOHN” et “john” ensemble

John (ou JOHN/john), 3

Snowflake

Traite “John”, “JOHN” et “john” séparément

John, 1
JOHN, 1
john, 1

Best Practices

  • Examinez les clauses GROUP BY impliquant des colonnes de chaînes lors de la migration depuis le mode Teradata afin de garantir le comportement de regroupement attendu.

Remarque : lorsque vous utilisez des expressions comme RTRIM(UPPER(first_name)) ou RTRIM(first_name) dans la clause GROUP BY pour obtenir un regroupement insensible à la casse ou tronqué, vous devez appliquer la même expression de manière cohérente dans toutes les parties de la requête où la colonne est référencée. Par exemple :

SELECT RTRIM(UPPER(first_name))
FROM employees
WHERE RTRIM(UPPER(first_name)) = 'JOHN'
GROUP BY RTRIM(UPPER(first_name));
Copy

Ainsi, le filtrage, la sélection et le regroupement utilisent tous la même logique, ce qui évite des discordances ou des résultats inattendus.

  • Définissez des colonnes avec COLLATE lors de la création de la table si un comportement cohérent insensible à la casse est requis :

    CREATE TABLE employees (
        first_name VARCHAR(50) COLLATE 'en-cs'
    );
    
    Copy
  • Activez l’indicateur CLI –UseCollateForCaseSpecification ou le paramètre de conversion pour utiliser COLLATE pour la spécification de la casse pendant la conversion. Cette option garantit que la spécification de la casse (comme CASESPECIFIC ou NOT CASESPECIFIC) est géré à l’aide des fonctions COLLATE au lieu des fonctions UPPER. Pour plus de détails, référez-vous à la documentation CLI ou aux paramètres de conversion.

  • Si vous avez besoin de plus d’assistance, vous pouvez nous envoyer un e-mail à snowconvert-support@snowflake.com.

SSC-EWI-TD0008

La fonction de comparaison de chaînes n’est pas prise en charge.

Severity

Faible

Description

Actuellement, il n’existe pas d’équivalence pour certaines fonctions de comparaison de chaînes dans Snowflake.

Cet EWI est ajouté chaque fois que le type de comparaison est jaro, n_gram, LD, LDWS, OSA, DL, hamming, LCS, jaccard, cosine and soundexcode.

Example Code

Teradata:
 SELECT * FROM StringSimilarity (
  ON (
    SELECT CAST(a AS VARCHAR(200)) AS a, CAST(b AS VARCHAR(200)) AS b
    FROM table_1
  ) PARTITION BY ANY
  USING
  ComparisonColumnPairs ('ld(a,b) AS sim_fn')
) AS dt ORDER BY 1;
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

Best Practices

SSC-EWI-TD0009

Colonne TEMPORAL non prise en charge.

Severity

Faible

Description

Teradata fournit une prise en charge des tables temporelles au niveau des colonnes à l’aide de colonnes de périodes dérivées. Ces colonnes ne sont pas prises en charge dans Snowflake.

Example Code

Teradata:
 CREATE MULTISET TABLE Policy(
      Policy_ID INTEGER,
      Customer_ID INTEGER,
      Policy_Type CHAR(2) NOT NULL,
      Policy_Details CHAR(40),
      Policy_Start DATE NOT NULL,
      Policy_End DATE NOT NULL,
      PERIOD FOR Validity(Policy_Start,Policy_End) AS VALIDTIME
      )
   PRIMARY INDEX(Policy_ID);
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

Best Practices

SSC-EWI-TD0010

UPPERCASE non pris en charge par Snowflake.

Severity

Faible

Description

L’attribut de colonne UPPERCASE n’est pas pris en charge dans Snowflake.

Example 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

Best Practices

  • Étant donné que la clause UPPERCASE indique que les caractères typés “aaa” sont stockés sous la forme “AAA”, une solution de contournement possible peut consister à ajouter la fonction [UPPER] à toutes les références d’insertion(https://docs.snowflake.com/fr/sql-reference/functions/upper). Cependant, le chargement de données externes par des processus ETL devraient également être modifiés.

  • Si vous avez besoin de plus d’assistance, vous pouvez nous envoyer un e-mail à snowconvert-support@snowflake.com.

SSC-EWI-TD0012

Les binaires ne prennent pas en charge les valeurs par défaut.

Severity

Faible

Description

Cet EWI s’affiche lorsque SnowConvert AI trouve un type de données BINARY avec une spécification de valeurs par DEFAULT. Étant donné que les valeurs par défaut ne sont pas autorisées dans les colonnes BINARY, il est supprimé.

Example 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

Best Practices

SSC-EWI-TD0017

La fonctionnalité de traçage des tables temporaires globale n’est pas prise en charge.

Severity

Faible

Description

Cet EWI s’affiche lorsque SnowConvert AI trouve Create Table avec l’option GLOBAL TEMPORARY TRACE. Examinez la documentation Teradata suivante relative à la fonctionnalité TRACE. Étant donné qu’elle n’est pas prise en charge dans Snowflake, elle est supprimée.

Example 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

Best Practices

  • Remarque : Il peut être possible de répliquer certaines fonctionnalités de traçage dans Snowflake à l’aide d’EVENT TABLE. Examinez la documentation suivante de Snowflake relative à la journalisation et au traçage.

  • Si vous avez besoin de plus d’assistance, vous pouvez nous envoyer un e-mail à snowconvert-support@snowflake.com.

SSC-EWI-TD0020

La fonction Regexp_Substr prend uniquement en charge les expressions régulières POSIX.

Note

Cet EWI est obsolète. Veuillez vous référer à la documentation SSC-EWI-0009.

Gravité

Faible

Description

Actuellement, Snowflake ne prend pas en charge l’expression régulière étendue au-delà de la syntaxe d’expressions régulières de base POSIX.

Cet EWI est ajouté chaque fois qu’un appel de fonction à REGEX_SUBSTR, REGEX_REPLACE, ou REGEX_INSTR est transformé dans SnowFlake pour avertir l’utilisateur des éventuelles expressions régulières non prises en charge. Certaines des fonctionnalités non prises en charge sont les groupes lookahead, lookbehind et non-capturing.

Exemple de code

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

Meilleures pratiques

  • Vérifiez l’expression régulière utilisée dans chaque cas pour déterminer si une intervention manuelle est nécessaire. Vous trouverez plus d’informations sur la prise en charge étendue des expressions regex et sur les alternatives dans SnowFlake ici.

  • Si vous avez besoin de plus d’assistance, vous pouvez nous envoyer un e-mail à snowconvert-support@snowflake.com.

SSC-EWI-TD0023

ACTIVITY_COUNT à l’intérieur de SELECT/SET INTO VARIABLE nécessite une correction manuelle.

Gravité

Faible

Description

La variable d’état ACTIVITY_COUNT retourne le nombre de lignes affectées par une instruction SQL DML dans une application SQL ou de procédure stockée intégrée. Pour plus d’informations, rendez-vous ici.

Comme expliqué dans sa spécification de traduction, il existe une solution de contournement pour émuler le comportement de ACTIVITY_COUNT via :

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

Lorsque vous utilisez ACTIVITY_COUNT dans une instruction SELECT/SET INTO VARIABLE, elle ne peut pas être simplement remplacée par la solution de contournement mentionnée ci-dessus.

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

Correction manuelle

Une partie de la solution de contournement présentée ci-dessus peut être utilisée pour obtenir le nombre de lignes insérées/mises à jour/supprimées, comme suit :

 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

Au lieu d’utiliser la requête complète, il convient de l’adapter manuellement à la syntaxe [SELECT INTO VARIABLE] de Snowflake(https://docs.snowflake.com/fr/sql-reference/constructs/into).

Par ailleurs, si RESULT_SCAN(LAST_QUERY_ID()) donne des résultats incorrects, vérifiez SSC-FDM-TD0033(../functional-difference/teradataFDM.md#ssc-fdm-td0033) pour savoir comment gérer les limitations possibles de l’utilisation de LAST_QUERY_ID.

Meilleures pratiques

  • Adaptez manuellement la solution de contournement proposée.

  • Vérifiez SSC-FDM-TD0033(../functional-difference/teradataFDM.md#ssc-fdm-td0033) pour savoir comment gérer les limitations possibles de l’utilisation de LAST_QUERY_ID.

  • Si vous avez besoin de plus d’assistance, vous pouvez nous envoyer un e-mail à snowconvert-support@snowflake.com.

SSC-EWI-TD0024

L’instruction annulée n’est pas prise en charge en raison d’une fonction d’agrégation.

Gravité

Faible

Description

Cet EWI apparaît lorsqu’une fonction AGGREGATE fait partie d’une instruction ABORT à l’intérieur d’une procédure stockée. L’instruction est commenté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

Meilleures pratiques

SSC-EWI-TD0025

Format de sortie non pris en charge.

Gravité

Faible

Description

Cet EWI apparaît lorsqu’une fonction CAST spécifie un format de sortie non pris en charge par l’Exécution de scripts Snowflake.

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)')
FROM SAMPLE_TABLE;
Copy
Snowflake Scripting:
 CREATE OR REPLACE TABLE SAMPLE_TABLE
(
    VARCHAR_TYPE VARCHAR
)
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "teradata",  "convertedOn": "03/03/2025",  "domain": "test" }}'
;

CREATE OR REPLACE VIEW SAMPLE_VIEW
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "teradata",  "convertedOn": "03/03/2025",  "domain": "test" }}'
AS
SELECT
    TO_NUMBER(VARCHAR_TYPE, '999.00000', 38, 10) !!!RESOLVE EWI!!! /*** SSC-EWI-TD0025 - OUTPUT FORMAT 'ZZZ.ZZZZZ' NOT SUPPORTED. ***/!!!,
    TO_TIME('01:02.030405', 'MI:SS.FF6') !!!RESOLVE EWI!!! /*** SSC-EWI-TD0025 - OUTPUT FORMAT 'MI:SS.S(6)' NOT SUPPORTED. ***/!!!
    FROM
    SAMPLE_TABLE;
Copy

Meilleures pratiques

  • Vérifiez si le code de sortie présente une équivalence fonctionnelle avec le code d’origine.

  • Si vous avez besoin de plus d’assistance, vous pouvez nous envoyer un e-mail à snowconvert-support@snowflake.com.

SSC-EWI-TD0027

Snowflake ne prend pas en charge les options de colonnes de dimensions temporelles intégrées de Teradata.

Gravité

Faible

Description

L’EWI est généré, car Snowflake ne prend pas en charge les attributs de dimensions temporelles intégrés de Teradata comme VALIDTIME ou TRANSACTIONTIME.

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 ***/!!! /*** SSC-FDM-TD0036 - SNOWFLAKE DOES NOT SUPPORT THE PERIOD DATATYPE, ALL PERIODS ARE HANDLED AS VARCHAR INSTEAD ***/
   )
   COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"teradata"}}'
;
Copy

Meilleures pratiques

  • Créez manuellement les colonnes TIMESTAMP avec des valeurs par défaut telles que CURRENT_TIMESTAMP.

  • En tirant parti de l’utilisation des flux de tables, elles peuvent enregistrer les modifications de manipulation de données apportées aux tables, ainsi que les métadonnées relatives à chaque modification. (Guide)

  • Si vous avez besoin de plus d’assistance, vous pouvez nous envoyer un e-mail à snowconvert-support@snowflake.com.

SSC-EWI-TD0029

La fonctionnalité Queue table n’est pas prise en charge.

Gravité

Faible

Description

Cet avertissement apparaît lorsqu’une TABLE avec l’attribut QUEUE est migrée. Le mot-clé QUEUE est supprimé, car il n’est pas pris en charge dans Snowflake.

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

Meilleures pratiques

SSC-EWI-TD0031

Le résultat peut différer, car le type Char possède une longueur fixe dans Teradata.

Gravité

Faible

Description

Étant donné que le type de données CHAR de Teradata possède une longueur fixe, certaines fonctions telles que LIKE tenteront de faire correspondre la colonne complète à la place du mot inséré dans la colonne, ce qui entraînera des correspondances fausses. Cependant, le type CHAR de Snowflake est de taille variable, ce qui signifie que les fonctions LIKE essaieront toujours de faire correspondre les valeurs insérées. Prenons l’exemple du code suivant :

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": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "teradata",  "convertedOn": "07/14/2025",  "domain": "no-domain-provided" }}'
;

INSERT INTO table1
VALUES ('Gabriel', 'Gabriel');

INSERT INTO table1
VALUES ('Barnum', 'Barnum');

INSERT INTO table1
VALUES ('Sergio', 'Sergio');

SELECT
    col1 FROM
    table1
where col1 ILIKE 'Barnum';
-- The result is a single row with 'Barnum'
    SELECT
    col2 FROM
    table1
    where
    !!!RESOLVE EWI!!! /*** SSC-EWI-TD0031 - THE RESULT OF LIKE MAY DIFFER DUE TO CHAR TYPE HAVING A FIXED LENGTH IN TERADATA ***/!!! col2 ILIKE 'Barnum';
    -- It does not return any row
Copy

Meilleures pratiques

SSC-EWI-TD0034

Le SQL multi-instructions n’est pas pris en charge.

Note

Certaines parties du code de sortie sont omises pour des raisons de clarté.

Gravité

Faible

Description

L’exécution du SQL multi-instructions n’est pas prise en charge. La demande a été traitée comme une transaction.

Note

L’EWI suivant n’est généré que lorsque l’indicateur de langage cible PL est défini sur Javascript, comme ceci : “–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 AI Helpers Code section is omitted.

  var TRANSACTION_HANDLER = function (error) {
    throw error;
  };
  // ** SSC-EWI-TD0034 - MULTISTATEMENT SQL EXECUTION NOT SUPPORTED, REQUEST HANDLED AS TRANSACTION **
  try {
    EXEC(`BEGIN`);
    EXEC(`SELECT
   *
FROM
   TABLE1`,[],undefined,TRANSACTION_HANDLER);
    EXEC(`COMMIT`);
  } catch(error) {
    EXEC(`ROLLBACK`);
  }
$$;
Copy

Meilleures pratiques

SSC-EWI-TD0039

Format d’entrée non pris en charge.

Gravité

Medium

Description

Le format d’entrée spécifié n’est pas pris en charge dans Snowflake.

Exemple de code

Entrée :
 SELECT 
    CAST('02/032/25' AS DATE FORMAT 'MM/DDD/YY'),
    CAST('02/032/25' AS DATE FORMAT 'MM/D3/YY'),
    CAST('03-Thursday-2025' AS DATE FORMAT 'DD-EEEE-YYYY'),
    CAST('03-Thursday-2025' AS DATE FORMAT 'DD-E4-YYYY');
Copy
Sortie :
 SELECT
    TO_DATE('02/032/25', 'MM/DDD/YY') !!!RESOLVE EWI!!! /*** SSC-EWI-TD0039 - INPUT FORMAT 'MM/DDD/YY' NOT SUPPORTED ***/!!!,
    TO_DATE('02/032/25', 'MM/D3/YY') !!!RESOLVE EWI!!! /*** SSC-EWI-TD0039 - INPUT FORMAT 'MM/D3/YY' NOT SUPPORTED ***/!!!,
    TO_DATE('03-Thursday-2025', 'DD-EEEE-YYYY') !!!RESOLVE EWI!!! /*** SSC-EWI-TD0039 - INPUT FORMAT 'DD-EEEE-YYYY' NOT SUPPORTED ***/!!!,
    TO_DATE('03-Thursday-2025', 'DD-E4-YYYY') !!!RESOLVE EWI!!! /*** SSC-EWI-TD0039 - INPUT FORMAT 'DD-E4-YYYY' NOT SUPPORTED ***/!!!;
Copy

Meilleures pratiques

SSC-EWI-TD0040

Le format dans une table n’est pas pris en charge.

Gravité

Faible

Description

Le format spécifié n’est pas pris en charge.

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) FORMAT 'X(50)' !!!RESOLVE EWI!!! /*** SSC-EWI-TD0040 - FORMAT IN TABLE T_2040 NOT SUPPORTED ***/!!!,
    C2 VARCHAR(255) FORMAT 'X(75)' !!!RESOLVE EWI!!! /*** SSC-EWI-TD0040 - FORMAT IN TABLE T_2040 NOT SUPPORTED ***/!!!
)
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "teradata",  "convertedOn": "07/14/2025",  "domain": "no-domain-provided" }}'
;
Copy

SSC-EWI-TD0041

La fonction Trunc a été ajoutée pour garantir l’entier.

Gravité

Faible

Description

Lors de la migration de Teradata vers Snowflake, vous pouvez rencontrer des différences dans la façon dont les conversions numériques sont gérées. Dans Teradata, convertir une valeur en INTEGER tronquera implicitement toute partie décimale, même si la valeur d’origine est un nombre à virgule flottante ou une représentation sous forme de chaîne d’un nombre. Cependant, dans Snowflake, la conversion d’un numérique non entier ou d’une chaîne directement en INTEGER peut entraîner des erreurs ou des résultats inattendus si la valeur n’est pas déjà un entier.

Pour assurer la compatibilité, la fonction TRUNC() est appliquée avant le conversion en INTEGER. Cela supprime toute partie décimale, ce qui permet une conversion sûre en entier. Toutefois, si la valeur source n’est pas numérique ou est une chaîne non numérique, des erreurs peuvent persister et une intervention manuelle peut être nécessaire. Par exemple, si SnowConvert AI ne peut pas déterminer le type de colonne en raison de références manquantes, vous devrez peut-être ajuster manuellement la conversion.

Exemple de code

Entrée :
 SELECT
    cast(date_column as integer);
Copy
Sortie :
 SELECT
    cast(TRUNC(date_column) as integer) !!!RESOLVE EWI!!! /*** SSC-EWI-TD0041 - TRUNC FUNCTION WAS ADDED TO ENSURE INTEGER. MAY NEED CHANGES IF NOT NUMERIC OR STRING. ***/!!!;
Copy

Meilleures pratiques

SSC-EWI-TD0046

La référence intégrée n’est pas prise en charge dans Snowflake.

Gravité

Medium

Description

Cette erreur apparaît lorsqu’il existe une référence à une table DBC et que la colonne sélectionnée n’a pas d’équivalence 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

Meilleures pratiques

SSC-EWI-TD0049

Instruction TPT non traitée.

Gravité

Élevé

Description

Une instruction DML dans TPT n’a pas pu être traitée et convertie par l’outil. Cela peut se produire pour diverses raisons, telles que l’utilisation de la concaténation avec des variables de script ou l’utilisation de guillemets d’échappement à l’intérieur de l’instruction DML.

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 généré :
 #*** Generated code is based on the SnowConvert AI Python Helpers version 2.0.6 ***
 
import os
import sys
import snowconvert.helpers
from snowconvert.helpers import Export
from snowconvert.helpers import exec
from snowconvert.helpers import BeginLoading
import argparse
args = None
## Script1.tpt
class load_job:
    #'LOAD TABLE FROM A FILE'

  jobname = "load_job"
    #'define SCHEMA'

  schema_name = """(
var1 VARCHAR(50)
);"""
  def setup_tables(self):
    self.DDL_OPERATOR()
    !!!RESOLVE EWI!!! /*** SSC-EWI-TD0049 - THE FOLLOWING STATEMENT COULD NOT BE PROCESSED ***/!!!
      #'RELEASE MLOAD database_name.table_name;'


con = None
def main():
  snowconvert.helpers.configure_log()
  con = snowconvert.helpers.log_on()
  _load_job = load_job()
  _load_job.setup_tables()
  snowconvert.helpers.quit_application()

if __name__ == "__main__":
  main()
Copy

Meilleures pratiques

  • Pour ce problème, vous pouvez saisir l’instruction d’insertion manuellement et/ou, étant donné que la valeur DML n’est pas encore prise en charge, demander à l’équipe SnowConvert AI d’ajouter la prise en charge pour ce cas spécifique.

  • Si vous avez besoin de plus d’assistance, vous pouvez nous envoyer un e-mail à snowconvert-support@snowflake.com.

SSC-EWI-TD0051

Les résultats de la fonction BYTES de Teradata diffèrent de ceux de la fonction LENGTH pour les colonnes d’octets de Snowflake.

Gravité

Faible

Description

Étant donné que le type de données octets de Teradata possède une longueur fixe, la fonction BYTES comptera toujours les zéros de fin insérés pour s’adapter aux valeurs de type octets plus petites dans la colonne, en renvoyant la taille de la colonne au lieu de la taille de la valeur insérée à l’origine. Cependant, le type binaire de Snowflake a une taille variable, ce qui signifie que la fonction LENGTH renverra toujours la taille des valeurs insérées. Prenons l’exemple du code suivant :

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

Code équivalent 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 généré :
 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

Meilleures pratiques

  • Analysez l’utilisation faite des résultats de la fonction BYTES. Le comportement de la fonction LENGTH de Snowflake correspond à celui souhaité dès le départ et aucun changement n’est nécessaire.

  • Si vous avez besoin de plus d’assistance, vous pouvez nous envoyer un e-mail à snowconvert-support@snowflake.com.

SSC-EWI-TD0052

La conversion implicite de Snowflake en numérique diffère de Teradata et peut échouer pour les chaînes non littérales.

Gravité

Faible

Description

Teradata et Snowflake autorisent tous deux les valeurs de chaînes pour les fonctions qui attendent des paramètres numériques. Ces chaînes sont ensuite analysées et converties en leur équivalent numérique.

Cependant, ces deux langages présentent des différences quant à ce qu’ils considèrent comme une chaîne numérique valide. Teradata est plus permissif et analyse correctement des cas tels que les chaînes vides/avec espaces blancs uniquement, les tirets intégrés, l’absence de chiffres dans la mantisse ou l’exposant, les signes monétaires, les séparateurs de chiffres ou la spécification du signe du nombre après les chiffres. Par exemple, les chaînes suivantes sont valides :

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

  • '$50' -> 50

  • '5000-' -> -5000

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

Snowflake applique une conversion de chaîne optimiste automatique et s’attend à ce que les chaînes correspondent aux formats TM9 ou TME, de sorte que la conversion échoue pour la plupart des cas mentionnés. Pour résoudre ces différences, SnowConvert AI traite les littéraux de chaînes transmis aux fonctions qui effectuent une conversion implicite en numériques et génère des chaînes équivalentes qui correspondent à TM9 ou TME afin qu’elles puissent être analysées par Snowflake. Ceci ne s’applique qu’aux valeurs de chaînes littérales, ce qui signifie que les valeurs non littérales n’ont aucune garantie d’être analysées 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 généré :
 CREATE OR REPLACE TABLE myTable (
    stringCol varchar(30)
)
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "teradata",  "convertedOn": "07/14/2025",  "domain": "no-domain-provided" }}'
;

INSERT INTO myTable
VALUES ('   1,236,857.45-');

SELECT
    COS('-1236857.45');

    SELECT
    COS(stringCol !!!RESOLVE EWI!!! /*** SSC-EWI-TD0052 - SNOWFLAKE IMPLICIT CONVERSION TO NUMERIC DIFFERS FROM TERADATA AND MAY FAIL FOR NON-LITERAL STRING VALUES ***/!!!)
    from
    myTable;
Copy

Meilleures pratiques

  • Aucune autre action de l’utilisateur n’est requise.

  • Si vous avez besoin de plus d’assistance, vous pouvez nous envoyer un e-mail à snowconvert-support@snowflake.com.

SSC-EWI-TD0053

Snowflake ne prend pas en charge le type de données Period. Toutes les périodes sont traitées en tant que varchar à la place.

Note

Certaines parties du code de sortie sont omises pour des raisons de clarté.

Note

Cet EWI est obsolète. Veuillez vous référer à la documentation SSC-FDM-TD0036.

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

PERIOD_UDF génère la représentation varchar d’une période en utilisant les formats par défaut pour les horodatages et l’heure spécifiés dans Snowflake. Cela signifie que les horodatages auront trois chiffres de précision et que les variables temporelles en auront zéro. Pour cette raison, vous pouvez remarquer que les résultats ont une précision plus/moins élevée que celle attendue. Il existe deux options pour modifier le nombre de chiffres de précision inclus dans la chaîne résultante :

  • Utilisez la version à trois paramètres de PERIOD_UDF : Cette surcharge de la fonction prend le paramètre PRECISIONDIGITS, un entier compris entre 0 et 9, pour contrôler combien de chiffres de la partie fractionnaire seront inclus dans le résultat. Notez que même si Snowflake prend en charge jusqu’à neuf chiffres de précision, le maximum dans Teradata est de six. 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'

  • Modifiez les paramètres de session TIMESTAMP_NTZ_OUTPUT_FORMAT et TIME_OUTPUT_FORMAT : les commandes ALTER SESSION SET TIMESTAMP_NTZ_OUTPUT_FORMAT = <format> etALTER SESSION SET TIME_OUTPUT_FORMAT = <format>

    peuvent être utilisées pour modifier les formats utilisés par défaut par Snowflake pour la session en cours. Les modifier pour inclure le nombre souhaité de chiffres de précision modifie le résultat des exécutions futures de PERIOD_UDF pour la session en cours.

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 généré :
 CREATE OR REPLACE TABLE vacations (
    employeeName varchar(50),
    duration VARCHAR(24) /*** SSC-FDM-TD0036 - SNOWFLAKE DOES NOT SUPPORT THE PERIOD DATATYPE, ALL PERIODS ARE HANDLED AS VARCHAR INSTEAD ***/
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"teradata"}}'
;

INSERT INTO vacations
VALUES ('Richard', PUBLIC.PERIOD_UDF(date '2021-05-15', date '2021-06-15') !!!RESOLVE EWI!!! /*** SSC-FDM-TD0036 - SNOWFLAKE DOES NOT SUPPORT THE PERIOD DATATYPE, ALL PERIODS ARE HANDLED AS VARCHAR INSTEAD ***/);

SELECT
    PUBLIC.PERIOD_END_UDF(duration) /*** SSC-FDM-TD0036 - SNOWFLAKE DOES NOT SUPPORT THE PERIOD DATATYPE, ALL PERIODS ARE HANDLED AS VARCHAR INSTEAD ***/ from
    vacations;
Copy

Meilleures pratiques

  • Étant donné que le comportement dePERIODet ses fonctions associées sont émulés à l’aide de varchar, nous vous recommandons d’examiner les résultats obtenus pour vous assurer de leur exactitude.

  • Si vous avez besoin de plus d’assistance, vous pouvez nous envoyer un e-mail à snowconvert-support@snowflake.com.

SSC-EWI-TD0055

Les formats pris en charge par Snowflake pour TO_CHAR diffèrent par rapport à Teradata et peuvent échouer ou avoir un comportement différent.

Note

Cet EWI est obsolète. Veuillez vous référer à la documentation SSC-FDM-TD0029.

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

Certains éléments de format Teradata sont mappés à des fonctions Snowflake qui dépendent de la valeur des paramètres de session. Pour éviter des différences fonctionnelles dans les résultats, vous devez définir ces paramètres de session sur les mêmes valeurs que celles définies dans Teradata. Les éléments de format identifiés qui sont mappés vers ce type de fonctions sont :

  • D : mappés vers la fonction DAYOFWEEK, les résultats de cette fonction dépendent du paramètre de session WEEK_START. Par défaut, Teradata considère le dimanche comme le premier jour de la semaine, tandis que dans Snowflake, il s’agit du lundi.

  • WW : mappée vers la fonction WEEK, cette fonction dépend du paramètre de session WEEK_OF_YEAR_POLICY, qui est configuré par défaut pour utiliser l’ISO standard (la première semaine de l’année étant la première à contenir au moins quatre jours du mois janvier) mais qui, dans Teradata, est configuré pour considérer le 1er janvier comme le début de la première semaine.

Pour modifier les paramètres de session, utilisez ALTER SESSION SET parameter_name = value. Pour plus d’informations sur les paramètres de session, consultez cette page.

Version à paramètre unique de TO_CHAR

La version à paramètre unique de TO_CHAR(Datetime) utilise les formats par défaut spécifiés dans les paramètres de session TIMESTAMP_LTZ_OUTPUT_FORMAT, TIMESTAMP_NTZ_OUTPUT_FORMAT, TIMESTAMP_TZ_OUTPUT_FORMAT et TIME_OUTPUT_FORMAT. Pour éviter des différences de comportement, veuillez les définir sur les mêmes valeurs que celles utilisées dans Teradata.

Pour TO_CHAR(Numeric), Snowflake génère la représentation varchar en utilisant les formats TM9 ou TME pour obtenir une représentation compacte du nombre. Teradata génère également des représentations compactes des nombres, de sorte qu’aucune action n’est requise.

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 généré :
 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

Meilleures pratiques

  • Lorsque vous utilisez FF, essayez d’utiliser les types DateTime avec la même précision que celle que vous utilisez dans Teradata, ou ajoutez une précision à l’élément de format pour éviter un comportement différent.

  • Lorsque vous utilisez des éléments de format liés au fuseau horaire, utilisez le premier paramètre de type TIMESTAMP_TZ pour éviter un comportement différent. Gardez également à l’esprit que le type TIME ne peut pas avoir d’informations de fuseau horaire dans Snowflake.

  • Définissez les paramètres de session nécessaires avec les valeurs par défaut de Teradata pour éviter des comportements différents.

  • Si vous avez besoin de plus d’assistance, vous pouvez nous envoyer un e-mail à snowconvert-support@snowflake.com.

SSC-EWI-TD0057

Les données binaires dans NEW JSON ne sont pas prises en charge.

Gravité

Faible

Description

La fonction NEW JSON accepte les données JSON représentées sous forme de chaîne ou au format binaire. Lorsque les données sont dans leur représentation binaire, la fonction n’est pas transformée, car ce format binaire n’est pas valide dans Snowflake étant donné qu’il ne peut pas interpréter les métadonnées relatives à l’objet JSON. Pour plus d’informations à ce sujet, consultez la [documentation] NEW JSON de Teradata (https://docs.teradata.com/r/C8cVEJ54PO4~YXWXeXGvsA/QpXrJfufgZ4uyeXFz7Rtcg).

Exemple de code

Code d’entrée

 SELECT NEW JSON ('160000000268656C6C6F0006000000776F726C640000'xb, BSON);
Copy
Code généré
 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

Meilleures pratiques

SSC-EWI-TD0059

Le fuseau horaire par défaut de l’utilisateur de Snowflake peut nécessiter une configuration pour correspondre à la valeur de Teradata.

Gravité

Faible

Description

Comme pour Teradata, la définition d’une valeur de fuseau horaire par défaut pour l’utilisateur fera démarrer les sessions avec ce fuseau horaire, jusqu’à ce qu’une nouvelle valeur soit définie pour la session.

Cet avertissement est généré pour rappeler que le même fuseau horaire que celui défini pour l’utilisateur dans Teradata doit être défini pour l’utilisateur Snowflake. Pour ce faire, veuillez utiliser la requête suivante dans Snowflake : ALTER SESSION SET TIMEZONE 'equivalent_timezone'. Rappelez-vous que Snowflake n’accepte que la base de données de fuseaux horaires IANA.

Exemple de code

Code d’entrée :
 SET TIME ZONE USER;
Copy
Code généré :
 !!!RESOLVE EWI!!! /*** SSC-EWI-TD0059 - SNOWFLAKE USER DEFAULT TIME ZONE MAY REQUIRE CONFIGURATION TO MATCH TERADATA VALUE ***/!!!
ALTER SESSION UNSET TIMEZONE;
Copy

Meilleures pratiques

  • N’oubliez pas de définir le fuseau horaire par défaut de l’utilisateur sur un fuseau horaire équivalent à celui défini pour l’utilisateur Teradata.

  • Si vous avez besoin de plus d’assistance, vous pouvez nous envoyer un e-mail à snowconvert-support@snowflake.com.

SSC-EWI-TD0060

JSON_TABLE non transformée. Les noms des colonnes n’ont pas pu être récupérés depuis les informations sémantiques.

Note

Certaines parties du code de sortie sont omises pour des raisons de clarté.

Gravité

Faible

Description

La fonction JSON_TABLE peut être transformée par SnowConvert AI. Cependant, cette transformation nécessite de connaître le nom des colonnes qui sont sélectionnées dans la sous-requête JSON_TABLE ON.

Ce message est généré pour avertir l’utilisateur que les noms des colonnes n’ont pas été explicitement placés dans la sous-requête (par exemple, SELECT * a été utilisé) et que les informations sémantiques des tables référencées n’ont pas été trouvées, ce qui signifie que les noms des colonnes n’ont pas pu être extraits.

Si vous voulez savoir comment charger des données JSON dans une table, consultez cette page.

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 généré :
 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

Meilleures pratiques

  • Veuillez vérifier si le code fourni à SnowConvert AI est complet. Si vous n’avez pas fourni la définition de table, veuillez réexécuter le code avec la définition de table présente.

  • Si vous avez besoin de plus d’assistance, vous pouvez nous envoyer un e-mail à snowconvert-support@snowflake.com.

SSC-EWI-TD0061

La transformation TD_UNPIVOT nécessite des informations de colonnes qui n’ont pas pu être trouvées. Colonnes manquantes dans le résultat.

Gravité

Faible

Description

SnowConvert AI prend en charge et transforme la fonction TD_UNPIVOT, qui peut être utilisée pour représenter les colonnes d’une table sous forme de lignes.

Cependant, pour fonctionner, cette transformation a besoin d’informations sur la table et les colonnes de la table ou, plus précisément, des noms des colonnes. Lorsque ces informations ne sont pas présentes, la transformation peut rester incomplète, avec des colonnes manquantes dans le résultat. Dans ce cas, cet 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 généré :
 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

Meilleures pratiques

  • Il existe deux façons de fournir des informations sur les colonnes à l’outil de conversion : placez la spécification de la table dans le même fichier que l’appel TD_UNPIVOT, ou spécifiez une liste de colonnes dans la requête SELECT de l’expression ON au lieu de SELECT * ou du nom de la table.

  • Ce problème peut être ignoré en toute sécurité si ALL les colonnes de la/des table(s) d’entrée ne sont pas pivotées. Sinon, le résultat présentera des colonnes manquantes.

  • Si vous avez besoin de plus d’assistance, vous pouvez nous envoyer un e-mail à snowconvert-support@snowflake.com.

SSC-EWI-TD0063

Le chemin JSON n’a pas été reconnu.

Note

Certaines parties du code de sortie sont omises pour des raisons de clarté.

Gravité

Medium

Description

Ce message s’affiche lorsque SnowConvert AI ne peut pas désérialiser un chemin JSON, car la chaîne n’a pas le format JSON attendu.

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 généré :
 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

Meilleures pratiques

  • Vérifiez si le chemin JSON contient un caractère inattendu ou s’il ne présente pas le bon format.

  • Si vous avez besoin de plus d’assistance, vous pouvez nous envoyer un e-mail à snowconvert-support@snowflake.com.

SSC-EWI-TD0066

L’identificateur suivant comporte un ou plusieurs caractères d’échappement Unicode qui ne sont pas valides dans Snowflake.

Note

Certaines parties du code de sortie sont omises pour des raisons de clarté.

Gravité

Faible

Description

Ce message s’affiche lorsque SnowConvert AI transforme un identificateur délimité Unicode Teradata avec des caractères non valides dans Snowflake.

Exemple de code

Code d’entrée :
 SELECT * FROM U&"#000f#ffff" UESCAPE '#';
Copy
Code généré :
 // SnowConvert AI Helpers Code section is omitted.
SELECT
* FROM
!!!RESOLVE EWI!!! /*** SSC-EWI-TD0066 - THE FOLLOWING IDENTIFIER HAS ONE OR MORE UNICODE ESCAPE CHARACTERS THAT ARE INVALID IN SNOWFLAKE ***/!!!
"\u000f\uffff";
Copy

Meilleures pratiques

  • Utilisez des identificateurs avec des caractères Unicode valides dans Snowflake.

  • Si vous avez besoin de plus d’assistance, vous pouvez nous envoyer un e-mail à snowconvert-support@snowflake.com.

SSC-EWI-TD0068

Snowflake ne prend pas en charge les profils, mais référence les rôles à la place.

Gravité

Medium

Description

Les profils Teradata permettent de définir plusieurs paramètres communs liés à la gestion de l’espace de stockage et des contraintes de mot de passe.

Cependant, Snowflake fonctionne avec une architecture Cloud et gère et optimise automatiquement le stockage, ce qui signifie qu’aucune personnalisation du stockage n’est effectuée du côté de l’utilisateur. De plus, Snowflake possède actuellement une politique de mot de passe définie qui s’applique à tous les mots de passe des utilisateurs et est non modifiable.

Cette erreur est générée lorsqu’une référence à un profil Teradata est trouvée pour indiquer qu’elle a été modifiée en référence au rôle de l’utilisateur, qui est l’approximation la plus proche d’un profil dans Snowflake (bien qu’il puisse y avoir des différences dans les résultats de la requête), à moins que le profil et les noms de rôles d’un utilisateur ne soient identiques.

Exemple de code

Code d’entrée :
 SELECT PROFILE;
Copy
Code généré :
 SELECT
CURRENT_ROLE() !!!RESOLVE EWI!!! /*** SSC-EWI-TD0068 - SNOWFLAKE DOES NOT SUPPORT PROFILES, REFERENCING ROLE INSTEAD ***/!!!;
Copy

Meilleures pratiques

  • Évitez de référencer des profils d’utilisateurs, car ils ne sont pas pris en charge. Les résultats de la requête seront différents, à moins que l’utilisateur n’ait le même nom pour son profil et son rôle.

  • Si vous avez besoin de plus d’assistance, vous pouvez nous envoyer un e-mail à snowconvert-support@snowflake.com.

SSC-EWI-TD0069

Les résultats ST_DISTANCE sont légèrement différents de ST_SPHERICALDISTANCE.

Note

Cet EWI est obsolète. Veuillez vous référer à la documentation SSC-FDM-TD0031.

Gravité

Faible

Description

La fonction ST_SPHERICALDISTANCE de Teradata calcule la distance entre deux coordonnées sphériques sur la planète en utilisant la formule Haversine. De l’autre côté, la fonction ST_DISTANCE de Snowflake n’utilise pas la formule Haversine pour calculer la distance minimale entre deux points 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 généré
 --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

Meilleures pratiques

SSC-EWI-TD0070

Une instruction de retour a été ajoutée à la fin de la section Label pour assurer le même flux d’exécution.

Note

Cet EWI est obsolète. Veuillez vous référer à la documentation SSC-FDM-TD0030.

Gravité

Medium

Description

Lorsqu’une instruction Goto est remplacée par une section Label et ne contient pas d’instruction de retour, cette dernière est ajoutée à la fin de la section pour assurer le même flux d’exécution.

BTEQ est exécuté après une commande Goto. Les instructions entre la commande Goto et la commande Label avec le même nom sont ignorées. Ainsi, afin d‘éviter que ces instructions ne soient exécutées, la section Label doit contenir une instruction de retour.

De plus, il convient de mentionner que la commande Goto ignore toutes les autres instructions, à l’exception de l’instruction Label avec le même nom, qui marque la reprise de l’exécution. Par conséquent, l’exécution ne reprendra jamais dans une section Label définie avant la commande Goto.

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 généré
 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

Meilleures pratiques

SSC-EWI-TD0076

L’utilisation de tables étrangères n’est pas prise en charge dans Snowflake.

Gravité

Medium

Description

Les tables étrangères permettent l’accès aux données du stockage d’objets externe, telles que les données semi-structurées et non structurées dans Amazon S3, le stockage Azure Blob et Google Cloud Storage. Cette syntaxe n’est pas prise en charge dans Snowflake. Toutefois, d’autres alternatives peuvent être utilisées à la place dans Snowflake, telles que les tables externes, les tables Iceberg et les 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 généré :
 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

Meilleures pratiques

  • Au lieu des tables étrangères dans Teradata, vous pouvez utiliser des tables externes Snowflake. Les tables externes référencent des fichiers de données situés dans un data lake de stockage Cloud (Amazon S3, Google Cloud Storage ou Microsoft Azure). Cela permet d’interroger des données stockées dans des fichiers d’un lac de données comme si elles se trouvaient dans une base de données. Les tables externes peuvent accéder aux données stockées dans n’importe quel format pris en charge par les instructions COPY INTO <table>.

  • Les tables Iceberg de Snowflake constituent une autre alternative. Vous pouvez donc considérer les tables Iceberg comme des tables qui utilisent des formats ouverts et un stockage Cloud fourni par le client. Ces données sont stockées dans des fichiers Parquet.

  • Enfin, il existe les tables Snowflake standards, qui peuvent être une option pour couvrir la fonctionnalité des tables étrangères dans Teradata.

  • Si vous avez besoin de plus d’assistance, vous pouvez nous envoyer un e-mail à snowconvert-support@snowflake.com.

SSC-EWI-TD0077

La clause RESET WHEN n’est pas prise en charge dans ce scénario en raison de sa condition.

Note

Certaines parties du code de sortie sont omises pour des raisons de clarté.

Gravité

Medium

Description

SnowConvert AI ne prend actuellement en charge que les clauses RESET WHEN avec des conditions binaires (<=, >= ou =). Pour tout autre type de condition, comme IS NOT NULL, la clause RESET WHEN sera supprimée et un message d’erreur sera ajouté, car elle n’est pas prise en charge dans Snowflake.

Ce message d’erreur apparaît également lorsque la condition RESET WHEN fait référence à une expression dont la définition n’a pas été trouvée par l’outil de migration. Actuellement, l’outil prend en charge les références d’alias à une colonne qui a été définie dans la 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 généré
 // SnowConvert AI Helpers Code section is omitted.
SELECT
    account_id,
    month_id,
    balance,
    ROW_NUMBER() OVER (
        PARTITION BY account_id
    !!!RESOLVE EWI!!! /*** SSC-EWI-TD0077 - RESET WHEN CLAUSE IS NOT SUPPORTED IN THIS SCENARIO DUE TO ITS CONDITION ***/!!!
        ORDER BY month_id
        ROWS UNBOUNDED PRECEDING
    ) as balance_increase
FROM
    account_balance
ORDER BY 1,2;
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 généré
 // SnowConvert AI Helpers Code section is omitted.
SELECT
    account_id,
    month_id,
    balance,
    ROW_NUMBER() OVER (
        PARTITION BY account_id
    !!!RESOLVE EWI!!! /*** SSC-EWI-TD0077 - RESET WHEN CLAUSE IS NOT SUPPORTED IN THIS SCENARIO DUE TO ITS CONDITION ***/!!!
        ORDER BY month_id
    ) as balance_increase
FROM
    account_balance
ORDER BY 1,2;
Copy

Meilleures pratiques

SSC-EWI-TD0079

La colonne de type Period requise est introuvable.

Note

Certaines parties du code de sortie sont omises pour des raisons de clarté.

Gravité

Faible

Description

Cet avertissement est affiché, car la colonne Period nécessaire pour répliquer la fonctionnalité de la clause Normalize n’a pas été trouvée.

Exemple de code

Code d’entrée :
 SELECT NORMALIZE emp_id, duration2 FROM project;
Copy
Code généré
 !!!RESOLVE EWI!!! /*** SSC-EWI-TD0079 - THE REQUIRED PERIOD TYPE COLUMN WAS NOT FOUND ***/!!!
// SnowConvert AI Helpers Code section is omitted.
WITH NormalizeCTE AS
(
SELECT
T1.*,
SUM(GroupStartFlag)
OVER (
PARTITION BY
emp_id, duration2
ORDER BY
PeriodColumn_begin
ROWS UNBOUNDED PRECEDING) GroupID
FROM
(
SELECT 
emp_id,
duration2,
PUBLIC.PERIOD_BEGIN_UDF(PeriodColumn) PeriodColumn_begin,
PUBLIC.PERIOD_END_UDF(PeriodColumn) PeriodColumn_end,
(CASE
WHEN PeriodColumn_begin <= LAG(PeriodColumn_end)
OVER (
PARTITION BY
emp_id, duration2
ORDER BY
PeriodColumn_begin,
PeriodColumn_end)
THEN 0
ELSE 1
END) GroupStartFlag FROM 
project
) T1
)
SELECT
emp_id,
duration2,
PUBLIC.PERIOD_UDF(MIN(PeriodColumn_begin), MAX(PeriodColumn_end))
FROM
NormalizeCTE
GROUP BY
emp_id,
duration2,
GroupID;
Copy

Meilleures pratiques

  • Pour corriger cet avertissement manuellement, vous devez simplement trouver la première colonne Period et supprimer toutes ses références, sauf là où elle est définie, puis remplacer PeriodColumn par la colonne trouvée.

  • Si vous avez besoin de plus d’assistance, vous pouvez nous envoyer un e-mail à snowconvert-support@snowflake.com.

SSC-EWI-TD0082

La fonction Translate utilisant l’encodage actuel n’est pas prise en charge.

Gravité

Medium

Description

L’utilisation de la fonction Translate utilisant les arguments d’encodage actuels n’est pas prise en charge dans Snowflake. La fonction est commentée pendant la traduction.

Exemple de code

Code d’entrée :
 SELECT Translate('abc' USING KANJISJIS_TO_LATIN);
Copy
Code généré
 SELECT
!!!RESOLVE EWI!!! /*** SSC-EWI-TD0082 - TRANSLATE FUNCTION USING KANJISJIS_TO_LATIN ENCODING IS NOT SUPPORTED ***/!!!
Translate('abc' USING KANJISJIS_TO_LATIN);
Copy

Meilleures pratiques

SSC-EWI-TD0083

Impossible de transformer deux ou plusieurs clauses Select complexes à la fois

Note

Certaines parties du code de sortie sont omises pour des raisons de clarté.

Gravité

Medium

Description

SnowConvert AI n’est pas capable de transformer deux ou plusieurs clauses SELECT complexes, car il est nécessaire de les mapper à une CTE ou à une clause FROM composite, qui entraîne la non compilation ou l’entrée dans un cycle logique du code mappé.

Qu’entend-on par clause complexe SELECT ?

Clauses qui doivent être mappées à une CTE ou à une clause FROM composite, comme NORMALIZE, EXPAND ON ou 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 généré
 // SnowConvert AI Helpers Code section is omitted.
SELECT
!!!RESOLVE EWI!!! /*** SSC-EWI-TD0083 - NOT ABLE TO TRANSFORM TWO OR MORE COMPLEX SELECT CLAUSES AT A TIME ***/!!!
NORMALIZE emp_id,
   duration,
   dept_id,
   balance,
   (
     ROW_NUMBER() OVER (
   PARTITION BY
      emp_id, new_dynamic_part
   ORDER BY
         dept_id
     ) -1
   ) AS balance_increase
FROM
   (
      SELECT
         emp_id,
         duration,
         dept_id,
         balance,
         previous_value,
         SUM(dynamic_part) OVER (
                 PARTITION BY emp_id
                 ORDER BY dept_id
         ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
               ) AS new_dynamic_part
      FROM
         (
            SELECT
               emp_id,
               duration,
               dept_id,
               balance,
               SUM(balance) OVER (
                       PARTITION BY emp_id
                       ORDER BY dept_id
                       ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING
                     ) AS previous_value,
               (CASE
                  WHEN balance <= previous_value
                     THEN 1
                  ELSE 0
               END) AS dynamic_part
            FROM
               project
         )
   )
!!!RESOLVE EWI!!! /*** SSC-EWI-TD0083 - NOT ABLE TO TRANSFORM TWO OR MORE COMPLEX SELECT CLAUSES AT A TIME ***/!!!
EXPAND ON duration AS bg BY ANCHOR ANCHOR_SECOND
ORDER BY 1, 2;
Copy

Meilleures pratiques

SSC-EWI-TD0087

L’instruction GOTO a été supprimée en raison d’une inversion de l’instruction if.

Note

Cet EWI est obsolète. Veuillez vous référer à la documentation SSC-FDM-TD0026.

Note

Certaines parties du code de sortie sont omises pour des raisons de clarté.

Gravité

Medium

Description

Il est courant d’utiliser la commande GOTO avec les commandes IF et LABEL pour répliquer la fonctionnalité d’une instruction if SQL. Lorsqu’elles sont utilisées de cette manière, il est possible de les transformer directement en une instruction if, if-else, ou même if-elseif-else. Cependant, dans ces cas, les commandes GOTO deviennent inutiles et doivent être supprimées afin d’éviter qu’elles ne soient remplacées par une section LABEL.

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 généré
 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

Meilleures pratiques

SSC-EWI-TD0091

Expression transformée en conversion, avec des erreurs possibles dues à des dépendances manquantes.

Note

Certaines parties dans le code de sortie sont omises pour des raisons de clarté.

Gravité

Medium

Description

Dans les scripts Teradata, vous pouvez utiliser la syntaxe suivante pour CAST des expressions :

<expression> ( <DataType> )

Copy

Malheureusement, cette syntaxe génère une ambiguïté lors d’une tentative de transformation d’une CAST en DATE ou TIME, car ces mots-clés se comportent également comme les fonctions CURRENT_DATE et CURRENT_TIME, respectivement.

Par conséquent, sans contexte sur l’expression à CAST, il n’existe pas de moyen sûr de faire la différence entre un cas réel de CAST et une fonction qui accepte DATE ou TIME comme paramètres.

Autrement dit, il est nécessaire de savoir si l’<expression> correspond à une colonne ou à une fonction définie par l’utilisateur (UDF). Pour ce faire, lors de la conversion du code, il convient d’ajouter le fichier CREATE TABLE ou CREATE FUNCTION dont dépend l’<expression>.

Par exemple, considérez l’instruction SELECT suivante. Sans contexte sur l’AMBIGUOUS_EXPR, nous n’avons aucun moyen de déterminer s’il s’agit d’un appel de fonction ou d’un CAST en DATE. Cependant, nous savons que COL1(DATE) est effectivement un 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 généré
 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

Meilleures pratiques

SSC-EWI-TD0092

La traduction pour la table/vue intégrée Teradata n’est pas prise en charge actuellement.

Gravité

Faible

Description

Cet EWI est ajouté lorsque SnowConvert AI trouve une table système Teradata qui n’est pas traduite actuellement.

Exemple de code

Code d’entrée :
 SELECT
  CRLF || 
  TRIM(em.ErrorText) INTO :MsgText
FROM
  DBC.ErrorMsgs em
WHERE
  em.ErrorCode = SUBSTR(:SqlStateCode, 2, 4)
Copy
Code généré
 SELECT
  CRLF ||
  TRIM(em.ErrorText) INTO :MsgText
FROM
  !!!RESOLVE EWI!!! /*** SSC-EWI-TD0092 - TRANSLATION FOR TERADATA BUILT-IN TABLE/VIEW DBC.ErrorMsgs IS NOT CURRENTLY SUPPORTED. ***/!!!
  DBC.ErrorMsgs em
WHERE
  UPPER(RTRIM(
  em.ErrorCode)) = UPPER(RTRIM(SUBSTR(:SqlStateCode, 2, 4)));
Copy

Meilleures pratiques

  • Recherchez des équivalents dans les tables internes de Snowflake, telles que Information_Schema ou SNOWFLAKE.ACCOUNT_USAGE.

  • Si vous avez besoin de plus d’assistance, vous pouvez nous envoyer un e-mail à snowconvert-support@snowflake.com.

SSC-EWI-TD0093

Format non pris en charge, qui doit être mis à jour dans toutes les utilisations de conversion de type varchar.

Gravité

Élevé

Description

Cet EWI est ajouté lorsque la fonction CAST est utilisée pour convertir une expression numérique en un autre type numérique avec un format spécifié. Bien que le format n’ait pas d’impact sur la valeur numérique elle-même, si le résultat est ensuite converti en chaîne, le format prévu ne sera pas appliqué correctement. Par conséquent, il est nécessaire de mettre à jour toutes les instances où le résultat est converti en VARCHAR, afin de garantir que le format défini dans l’EWI est utilisé.

Exemple de code

Code d’entrée :
SELECT
   CAST(245222.32 AS FORMAT '-(10)9.9(4)') AS FormattedAmount,
   CAST(FormattedAmount AS VARCHAR(30));
Copy
Code généré
SELECT
   245222.32 !!!RESOLVE EWI!!! /*** SSC-EWI-TD0093 - FORMAT '-(10)9.9(4)' IS NOT SUPPORTED AND MUST BE UPDATED TO THE FOLLOWING FORMAT 'S9999999999.0000' IN ALL VARCHAR CAST USAGES. ***/!!! AS FormattedAmount,
   LEFT(LTRIM(TO_VARCHAR(FormattedAmount, 'MI0.00000000000000EEEEE')), 10);
Copy

Meilleures pratiques