SnowConvert AI - Différences fonctionnelles de Teradata

SSC-FDM-TD0001

Colonne convertie à partir du type de données Blob.

Description

Ce message s’affiche lorsque SnowConvert AI trouve un type de données BLOB. Étant donné que BLOB n’est pas pris en charge dans Snowflake, le type devient Binary.

Exemple de code

Code d’entrée :
 CREATE TABLE TableExample
(
ColumnExample BLOB
);
Copy
Code généré :
 CREATE OR REPLACE TABLE TableExample
(
ColumnExample BINARY /*** SSC-FDM-TD0001 - COLUMN CONVERTED FROM BLOB DATA TYPE ***/
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"teradata"}}'
;
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-FDM-TD0002

Colonne convertie à partir du type de données Clob.

Description

Ce message s’affiche lorsque SnowConvert AI trouve un type de données CLOB. Étant donné que CLOB n’est pas pris en charge dans SnowConvert AI, le type devient VARCHAR.

Exemple de code

Code d’entrée :
 CREATE TABLE TableExample
(
ColumnExample CLOB
)
Copy
Code généré :
 CREATE OR REPLACE TABLE TableExample
(
ColumnExample VARCHAR /*** SSC-FDM-TD0002 - COLUMN CONVERTED FROM CLOB DATA TYPE ***/
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"teradata"}}'
;
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-FDM-TD0003

Variables Bash trouvées. L’utilisation de SnowSQL avec la substitution de variables activée est nécessaire pour exécuter ce script.

Description

Lorsque le code source d’un fichier de script migré vers l’Exécution de scripts Snowflake contient des espaces réservés de variables Bash ($variable ou ${variable}), SnowConvert AI les transforme en variables SnowSQL (&variable ou &{variable}).

Cet avertissement est généré pour indiquer que l’exécution du script migré dépend maintenant de SnowSQL pour fonctionner. Veuillez tenir compte des points suivants lorsque vous exécutez le script dans SnowSQL :

Exemple de code

Code d’entrée :
 .LOGON dbc, dbc;

select '$variable', '${variable}', '${variable}_concatenated';

select $colname from $tablename where info = $id;

select ${colname} from ${tablename} where info = ${id};

.LOGOFF;
Copy
Code généré :
EXECUTE IMMEDIATE
$$
  --** SSC-FDM-TD0003 - BASH VARIABLES FOUND, USING SNOWSQL WITH VARIABLE SUBSTITUTION ENABLED IS REQUIRED TO RUN THIS SCRIPT **
  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
        '&variable',
        '&{variable}',
        '&{variable}_concatenated';
      STATUS_OBJECT := OBJECT_CONSTRUCT('SQLROWCOUNT', SQLROWCOUNT);
    EXCEPTION
      WHEN OTHER THEN
        STATUS_OBJECT := OBJECT_CONSTRUCT('SQLCODE', SQLCODE, 'SQLERRM', SQLERRM, 'SQLSTATE', SQLSTATE);
    END;
    BEGIN
      SELECT
        &colname
      from
        &tablename
      where
        info = &id;
      STATUS_OBJECT := OBJECT_CONSTRUCT('SQLROWCOUNT', SQLROWCOUNT);
    EXCEPTION
      WHEN OTHER THEN
        STATUS_OBJECT := OBJECT_CONSTRUCT('SQLCODE', SQLCODE, 'SQLERRM', SQLERRM, 'SQLSTATE', SQLSTATE);
    END;
    BEGIN
      SELECT
        &{colname}
      from
        &{tablename}
      where
        info = &{id};
      STATUS_OBJECT := OBJECT_CONSTRUCT('SQLROWCOUNT', SQLROWCOUNT);
    EXCEPTION
      WHEN OTHER THEN
        STATUS_OBJECT := OBJECT_CONSTRUCT('SQLCODE', SQLCODE, 'SQLERRM', SQLERRM, 'SQLSTATE', SQLSTATE);
    END;
    --.LOGOFF
    !!!RESOLVE EWI!!! /*** SSC-EWI-0073 - PENDING FUNCTIONAL EQUIVALENCE REVIEW FOR 'LogOff' NODE ***/!!!
    null;
  END
$$
Copy

Meilleures pratiques

SSC-FDM-TD0004

Les types de période sont traités comme deux champs de données.

Description

Teradata possède un type de données de période utilisé pour représenter un intervalle de temps, les instances de ce type ayant un début et une fin de limite du même type (heure, date ou horodatage), ainsi qu’un ensemble de fonctions qui permettent d’initialiser et de manipuler des données de période comme PERIOD, BEGIN, END, OVERLAPS, etc.

Comme le type de période n’est pas pris en charge par Snowflake, SnowConvert AI transforme ce type et ses fonctions associées en utilisant les règles suivantes :

  • Toute déclaration de type de période dans les tables de colonnes est migrée en tant que deux colonnes du même type.

  • La fonction de construction de valeur de période est migré dans deux constructeurs différents du sous-type de période, l’un avec la valeur de début et l’autre avec la valeur de fin.

  • Les fonctions prises en charge qui attendent des paramètres de type de période sont également migrées vers des UDFs. Ces UDFs attendent généralement deux paramètres pour la valeur de début et la valeur de fin.

Exemple de code

Code d’entrée :
 -- Additional Params: --SplitPeriodDatatype
CREATE TABLE DateTable
(
	COL1 PERIOD(DATE) DEFAULT PERIOD (DATE '2005-02-03', UNTIL_CHANGED)
);
Copy
Code généré :
CREATE OR REPLACE TABLE DateTable
(
	COL1_begin DATE DEFAULT DATE '2005-02-03',
	COL1_end DATE DEFAULT DATE '9999-12-31' /*** SSC-FDM-TD0004 - PERIOD DATA TYPES ARE HANDLED AS TWO DATA FIELDS ***/
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"teradata"}}'
;
Copy

Meilleures pratiques

SSC-FDM-TD0005

Les décalages de fuseau horaire non standards ne sont pas pris en charge dans Snowflake et sont arrondis au fuseau horaire valide le plus proche.

Description

Bien que Teradata offre la possibilité de définir n’importe quel décalage de fuseau horaire entre -12:59 et +14:00 en utilisant la requête SET TIME ZONE, Snowflake prend exclusivement en charge les fuseaux horaires répertoriés dans la Base de données des fuseaux horaires IANA.

Si le décalage spécifié dans la requête SET TIME ZONE ne s’aligne pas avec un fuseau horaire standard IANA, Snowflake l’arrondira automatiquement au fuseau horaire standard le plus proche avec le décalage le plus proche. Dans ce cas, un message d’avertissement sera généré.

Exemple de code

Code d’entrée :
-- Will be rounded to Asia/Colombo (+05:30)
SET TIME ZONE '05:26';
Copy
Code généré :
 -- Will be rounded to Asia/Colombo (+05:30)
--** SSC-FDM-TD0005 - NON-STANDARD TIME ZONE OFFSETS NOT SUPPORTED IN SNOWFLAKE, ROUNDED TO NEAREST VALID TIME ZONE **
ALTER SESSION SET TIMEZONE = 'Asia/Colombo';
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-FDM-TD0006

La vue With Check Option n’est pas prise en charge.

Description

Ce message s’affiche lorsque SnowConvert AI trouve une vue avec la clause WITH CHECK OPTION. Celle-ci n’est pas prise en charge dans Snowflake et est donc commentée dans le code.

Cette clause fonctionne avec les vues actualisables qui peuvent être utilisées pour exécuter les commandes INSERT et UPDATE sur la vue et mettre à jour en interne la table associée à la vue.

La clause est utilisée pour restreindre les lignes qui seront affectées par la commande à l’aide de la clause WHERE dans la vue.

Pour plus de détails, consultez la documentation sur la fonctionnalité de la clause.

Exemple de code

Code d’entrée :
REPLACE VIEW VIEWWITHOPTIONTEST AS
LOCKING ROW FOR ACCESS
SELECT 
    *        
FROM SOMETABLE
WHERE app_id = 'SUPPLIER'
WITH CHECK OPTION;
Copy
Code généré :
 CREATE OR REPLACE VIEW VIEWWITHOPTIONTEST
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "teradata",  "convertedOn": "07/02/2025",  "domain": "no-domain-provided" }}'
AS
SELECT
    *
FROM
    SOMETABLE
WHERE
    UPPER(RTRIM( app_id)) = UPPER(RTRIM('SUPPLIER'))
--    --** SSC-FDM-TD0006 - VIEW WITH OPTION NOT SUPPORTED IN SNOWFLAKE **
--    WITH CHECK OPTION
                     ;
Copy

Meilleures pratiques

SSC-FDM-TD0007

La colonne Variant ne prend pas en charge le classement.

Description

Ce message s’affiche lorsque SnowConvert AI trouve un type de données Variant dans la transformation d’un code avec une clause COLLATE. Étant donné que COLLATE n’est pas pris en charge avec le type de données VARIANT, il sera supprimé et un message sera ajouté.

Exemple de code

Code d’entrée :
-- Additional Params: --useCollateForCaseSpecification
CREATE TABLE TableExample
(
ColumnExample JSON(2500) NOT CASESPECIFIC
)
Copy
Code généré :
 CREATE OR REPLACE TABLE TableExample
(
ColumnExample VARIANT
--                      NOT CASESPECIFIC /*** SSC-FDM-TD0007 - VARIANT COLUMN DOES NOT SUPPORT COLLATION ***/
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"teradata"}}'
;
Copy

Le type de données JSON est converti en VARIANT, tandis que NOT CASESPECIFIC est converti en clause COLLATE.

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

Lorsque le quatrième paramètre NVP_UDF est non littéral et contient une barre oblique inverse, cette barre oblique inverse doit être échappée.

Description

Les délimiteurs non littéraux comportant des espaces ont besoin que leur barre oblique inverse soit échappée dans Snowflake.

Exemple de code

Code d’entrée
SELECT NVP('store = whole foods&&store: ?Bristol farms','store', '&&', valueDelimiter, 2);
Copy
Code généré
 SELECT
PUBLIC.NVP_UDF('store = whole foods&&store: ?Bristol farms', 'store', '&&', valueDelimiter, 2) /*** SSC-FDM-TD0008 - WHEN NVP_UDF FOURTH PARAMETER IS NON-LITERAL AND IT CONTAINS A BACKSLASH, THAT BACKSLASH NEEDS TO BE ESCAPED ***/;
Copy

Meilleures pratiques

SSC-FDM-TD0009

Conversion de integer en varchar pour la session en cours par défaut.

Description

Ce message s’affiche lorsque SnowConvert AI trouve une DEFAULT SESSION et que le type de données n’est NOT un VARCHAR. Si c’est le cas, le type de données devient VARCHAR, et un message est ajouté.

Exemple de code

Code d’entrée :
 CREATE TABLE TableExample
(
ColumnExample INTEGER DEFAULT SESSION,
ColumnExample2 VARCHAR DEFAULT SESSION
)
Copy
Code généré :
 CREATE OR REPLACE TABLE TableExample
(
ColumnExample VARCHAR DEFAULT CURRENT_SESSION() /*** SSC-FDM-TD0009 - CONVERTED FROM INTEGER TO VARCHAR FOR CURRENT_SESSION DEFAULT ***/,
ColumnExample2 VARCHAR DEFAULT CURRENT_SESSION()
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"teradata"}}'
;
Copy

Voyons l’exemple. Notez que ColumnExample possède un type de données INTEGER avec une DEFAULT SESSION. Comme le type de données n’est pas VARCHAR, dans la sortie, il est transformé en VARCHAR.

Le type de données de ColumnExample2 n’a pas changé, car il s’agit déjà de VARCHAR.

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

Colonnes de table entre les tables (Teradata) DBC.COLUMNSV et INFORMATION_SCHEMA.COLUMNS (SnowFlake). Cependant, certaines colonnes peuvent ne pas avoir de correspondance exacte dans Snowflake.

Description

Les utilisations des DBC.COLUMNSV de table dans Teradata sont converties en INFORMATION_SCHEMA.COLUMNS, mais certaines colonnes peuvent ne pas avoir de correspondance exacte dans SnowFlake. Cela signifie qu’il existe certaines colonnes dans Teradata pour lesquelles il n’y a pas d’équivalent dans SnowFlake, tandis que d’autres ont une colonne correspondante, mais leur contenu n’est pas exactement le même.

An example of the contents of DBC.COLUMNSV table in Teradata

An example of the contents of INFORMATION_SCHEMA.COLUMNS table in SnowFlake

Remarquez, par exemple, qu’il n’y a pas de colonne équivalente pour « ColumnFormat «  dans SnowFlake. Remarquez également que _ »DATA_TYPE » _ semble être la correspondance pour la colonne _ « ColumnType » _ dans Teradata, mais que leur contenu diffère fortement.

Exemple de code

Code d’entrée :
 SELECT columnname FROM dbc.columnsV WHERE tablename = 'TableN';
Copy
Code généré :
 SELECT
COLUMN_NAME AS COLUMNNAME
FROM
--** SSC-FDM-TD0010 - USES OF TABLE DBC.COLUMNSV ARE CONVERTED TO INFORMATION_SCHEMA.COLUMNS, BUT SOME COLUMNS MIGHT NOT HAVE AND EXACT MATCH IN SNOWFLAKE **
INFORMATION_SCHEMA.COLUMNS
WHERE
UPPER(RTRIM(TABLE_NAME)) = UPPER(RTRIM('TableN'));
Copy

Meilleures pratiques

  • Examinez les colonnes qui ont été utilisées dans Teradata et vérifiez si le contenu disponible dans SnowFlake correspond à vos besoins.

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

SSC-FDM-TD0011

L’échappement BMP Unicode n’est pas pris en charge.

Description

Snowflake ne prend pas en charge le format BMP Unicode. Ce message s’affiche donc lorsque SnowConvert AI transforme le [littéral de caractères délimités Unicode] de Teradata (https://docs.teradata.com/r/Enterprise_IntelliFlex_VMware/SQL-Data-Types-and-Literals/Data-Literals/Unicode-Delimited-Character-Literals) avec l’échappement BMP Unicode vers Snowflake.

Exemple de code

Code d’entrée :
 SELECT U&'hola #+005132 mundo' UESCAPE '#';
Copy
Code généré :
 SELECT
--** SSC-FDM-TD0011 - UNICODE BMP IS NOT SUPPORTED IN SNOWFLAKE **
'hola \u+005132 mundo';
Copy

Meilleures pratiques

  • Vérifiez s’il existe un équivalent Unicode.

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

SSC-FDM-TD0012

Valeur par défaut non valide.

Note

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

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.

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-FDM-TD0012 message.
    COL1 FLOAT DEFAULT TIME,
    COL2 FLOAT DEFAULT DATE,
    COL3 FLOAT DEFAULT CURRENT_DATE,
    COL4 FLOAT DEFAULT CURRENT_TIME,
    COL5 FLOAT DEFAULT CURRENT_TIMESTAMP
);
Copy
Snowflake Scripting:
 CREATE TABLE T_2004
(
    -- In the output code all of these columns will be FLOAT type
    -- and will include the SSC-FDM-TD0012 message.
    COL1 FLOAT DEFAULT TIME /*** SSC-FDM-TD0012 - DEFAULT CURRENT_TIME NOT VALID FOR DATA TYPE ***/,
    COL2 FLOAT DEFAULT DATE /*** SSC-FDM-TD0012 - DEFAULT CURRENT_DATE NOT VALID FOR DATA TYPE ***/,
    COL3 FLOAT DEFAULT CURRENT_DATE /*** SSC-FDM-TD0012 - DEFAULT CURRENT_DATE NOT VALID FOR DATA TYPE ***/,
    COL4 FLOAT DEFAULT CURRENT_TIME /*** SSC-FDM-TD0012 - DEFAULT CURRENT_TIME NOT VALID FOR DATA TYPE ***/,
    COL5 FLOAT DEFAULT CURRENT_TIMESTAMP /*** SSC-FDM-TD0012 - DEFAULT CURRENT_TIMESTAMP NOT VALID FOR DATA TYPE ***/
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"teradata"}}'
;
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-FDM-TD0013

Le code d’erreur Snowflake ne correspond pas au code d’erreur Teradata d’origine.

Description

Ce message s’affiche, car le code d’erreur enregistré dans la variable BTEQ ERRORCODE intégrée pourrait ne pas être le même dans l’Exécution de scripts Snowflake.

Exemple de code

Code d’entrée :
SELECT * FROM table1;
 
.IF ERRORCODE<>0 THEN .EXIT 1

.QUIT 0
Copy
Code généré :
 -- Additional Params: -q snowscript

EXECUTE IMMEDIATE
$$
  DECLARE
    STATUS_OBJECT OBJECT := OBJECT_CONSTRUCT('SQLCODE', 0);
  BEGIN
    BEGIN
      SELECT
        *
      FROM
        table1;
      STATUS_OBJECT := OBJECT_CONSTRUCT('SQLROWCOUNT', SQLROWCOUNT);
    EXCEPTION
      WHEN OTHER THEN
        STATUS_OBJECT := OBJECT_CONSTRUCT('SQLCODE', SQLCODE, 'SQLERRM', SQLERRM, 'SQLSTATE', SQLSTATE);
    END;
    IF (STATUS_OBJECT['SQLCODE'] /*** SSC-FDM-TD0013 - THE SNOWFLAKE ERROR CODE MISMATCH THE ORIGINAL TERADATA ERROR CODE ***/ != 0) THEN
      RETURN 1;
    END IF;
    RETURN 0;
  END
$$
Copy

Meilleures pratiques

SSC-FDM-TD0014

Incohérence d’exécution des fichiers

Description

Cet EWI apparaît lorsque le code migré est une phrase BTEQ exécutant un fichier d’environnement avec des instructions SQL, par exemple $(<$INPUT_SQL_FILE). La différence entre l’exécution BTEQ et le code généré par Python est que BTEQ continue avec les autres instructions du fichier lorsque l’une d’entre elles échoue, tandis que l’exécution de Python s’arrête chaque fois qu’une erreur se produit.

Exemple de code

Teradata BTEQ :
 .logmech LDAP;
.logon $LOGON_STR;
.SET DEFAULTS;


$(<$INPUT_SQL_FILE)

.export reset
.logoff
.quit
Copy
Python :
#*** Generated code is based on the SnowConvert AI Python Helpers version 2.0.6 ***

from snowconvert.helpers import exec_file
import os
import sys
import snowconvert.helpers
from snowconvert.helpers import Export
from snowconvert.helpers import exec
from snowconvert.helpers import BeginLoading
con = None
#** SSC-FDM-TD0022 - SHELL VARIABLES FOUND, RUNNING THIS CODE IN A SHELL SCRIPT IS REQUIRED **
def main():
  snowconvert.helpers.configure_log()
  con = snowconvert.helpers.log_on()
  #** SSC-FDM-0027 - REMOVED NEXT STATEMENT, NOT APPLICABLE IN SNOWFLAKE. LOGMECH **
  #.logmech LDAP;
   
  #** SSC-FDM-0027 - REMOVED NEXT STATEMENT, NOT APPLICABLE IN SNOWFLAKE. LOGON **
  #.logon $LOGON_STR
   
  #** SSC-EWI-TD0005 - THE STATEMENT WAS CONVERTED BUT ITS FUNCTIONALITY IS NOT IMPLEMENTED YET **
  Export.defaults()
  #** SSC-FDM-TD0014 - EXECUTION OF FILE WITH SQL STATEMENTS STOPS WHEN AN ERROR OCCURS **
  exec_file("$INPUT_SQL_FILE")
  #** SSC-EWI-TD0005 - THE STATEMENT WAS CONVERTED BUT ITS FUNCTIONALITY IS NOT IMPLEMENTED YET **
  Export.reset()
  #** SSC-FDM-0027 - REMOVED NEXT STATEMENT, NOT APPLICABLE IN SNOWFLAKE. LOGOFF **
  #.logoff
   
  snowconvert.helpers.quit_application()

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

Meilleures pratiques

SSC-FDM-TD0015

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

Note

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

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
--** SSC-FDM-TD0015 - 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-FDM-TD0016

La valeur « l » pour le paramètre “match_arg” n’est pas prise en charge dans Snowflake.

Description

Dans Teradata, les fonctions comme REGEX_SUBSTR, REGEX_REPLACE, ou REGEX_INSTR possèdent un paramètre appelé « match_arg », un argument de caractère avec les valeurs valides suivantes :

  • 'i' : correspondance non sensible à la casse.

  • 'c' : correspondance sensible à la casse.

  • 'n' : le caractère de point (correspondant à n’importe quel caractère) peut correspondre au caractère de nouvelle ligne.

  • 'm' : la chaîne source est traitée comme plusieurs lignes, et non comme une seule ligne.

  • 'l' : si source_string dépasse la taille source_string actuelle maximale autorisée (actuellement, 16 MB), NULL est renvoyé au lieu d’une erreur.

  • 'x' : ignore l’espace blanc (n’affecte que la chaîne de modèles).

L’argument peut contenir plus d’un caractère.

Dans Snowflake, l’argument équivalent pour ces fonctions est regexp_parameters.A string d’un ou plusieurs caractères, qui spécifie les paramètres d’expressions régulières utilisés pour rechercher des correspondances. Les valeurs prises en charge sont les suivantes :

  • c : sensible à la casse.

  • i : insensible à la casse.

  • m : mode multiligne.

  • e : extrait les sous-correspondances.

  • s : le caractère générique ‘.’ correspond également au caractère de nouvelle ligne.

Comme vous pouvez le voir, les valeurs 'i', 'c', 'm' sont les mêmes dans les deux langues, et la valeur 'n' dans Teradata est mappée sur 'n'. Toutefois, les valeurs 'l', 'x' ne possèdent pas d’homologue équivalent.

Pour la valeur 'x', la fonctionnalité est répliquée en générant un appel à la fonction REGEXP_REPLACE. Cependant, le paramètre 'l' ne peut pas être répliqué. Cet avertissement est donc généré pour ces cas.

Code d’entrée :

 SELECT REGEXP_SUBSTR('Chip Chop','ch(i|o)p', 1, 1, 'i'), 
       REGEXP_SUBSTR('Chip Chop','ch(i|o)p', 1, 1, 'c'),
       REGEXP_SUBSTR('Chip Chop','ch(i|o)p', 1, 1, 'm'),
       REGEXP_SUBSTR('Chip Chop','ch(i|o)p', 1, 1, 'n'),
       REGEXP_SUBSTR('Chip Chop','ch(i|o)p', 1, 1, 'l'),
       REGEXP_SUBSTR('Chip Chop','ch(i|o)p', 1, 1, 'x');
Copy
Code généré :
 SELECT
       REGEXP_SUBSTR('Chip Chop', 'ch(i|o)p', 1, 1, 'i'),
       REGEXP_SUBSTR('Chip Chop', 'ch(i|o)p', 1, 1, 'c'),
       REGEXP_SUBSTR('Chip Chop', 'ch(i|o)p', 1, 1, 'm'),
       REGEXP_SUBSTR('Chip Chop', 'ch(i|o)p', 1, 1, 's'),
       --** SSC-FDM-TD0016 - VALUE 'l' FOR PARAMETER 'match_arg' IS NOT SUPPORTED IN SNOWFLAKE **
       REGEXP_SUBSTR('Chip Chop', 'ch(i|o)p', 1, 1),
       REGEXP_SUBSTR('Chip Chop', 'ch(i|o)p', 1, 1);
Copy

Meilleures pratiques

SSC-FDM-TD0017

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

Note

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

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
--** SSC-FDM-TD0017 - 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 les données stockées dans les fichiers d’un data lake 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-FDM-TD0018

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

Note

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

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 attendu ou n’est pas prise en charge dans Snowflake.

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
    --** SSC-FDM-TD0018 - 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-FDM-TD0019

Les balises de requête au niveau des transactions et des profils ne sont pas prises en charge dans Snowflake et sont remplacées par des balises de requête de session.

Description

Teradata permet aux utilisateurs de définir des groupes de requêtes au niveau des transactions, des sessions et des profils, ainsi que de les consulter avec des fonctions comme GetQueryBandValue.

L’équivalent Snowflake pour les groupes de requêtes est le paramètre query_tag, qui peut être défini pour la session, l’utilisateur ou le compte. Par ailleurs, Snowflake n’a pas de profils.

En raison de ces différences, ce FMD est ajouté pour avertir l’utilisateur que les balises de requête au niveau des transactions ou des profils ne peuvent pas être définies ni consultées dans Snowflake et que des balises de requête au niveau des sessions seront utilisées à la place, ce qui peut entraîner des différences fonctionnelles dans certains cas.

Exemple de code

Code d’entrée :
 SELECT GETQUERYBANDVALUE(3, 'account');
Copy
Code généré
 SELECT
--** SSC-FDM-TD0019 - TRANSACTION AND PROFILE LEVEL QUERY TAGS NOT SUPPORTED IN SNOWFLAKE, REFERENCING SESSION QUERY TAG INSTEAD **
GETQUERYBANDVALUE_UDF('account');
Copy

Meilleures pratiques

  • Modifiez votre logique de code pour utiliser des groupes de requêtes au niveau des sessions.

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

SSC-FDM-TD0020

La valeur JSON n’a pas été reconnue en raison d’un format non valide.

Note

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

Description

Ce message s’affiche lorsque SnowConvert AI doit désérialiser les données JSON pour un contexte de transformation, mais que la valeur JSON n’avait pas le format attendu ou ne correspond pas à un JSON valide.

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('[ {"ordinal"  true},
                 {"jsonpath"  "$.time",
                  "type"" : "CHAR ( 12 )"},
                 {"jsonpath"  "$.city",
                  "type" : "VARCHAR ( 12 )"}]'))
AS JT(Id, Ordinal, Time, City);

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
 (
  SELECT
   id
  --** SSC-FDM-TD0020 - UNRECOGNIZED JSON LITERAL [ {"ordinal" true}, {"jsonpath" "$.time", "type"" : "CHAR ( 12 )"}, {"jsonpath" "$.city", "type" : "VARCHAR ( 12 )"}] **
  FROM
   demo.PUBLIC.Train T,
   TABLE(FLATTEN(INPUT =>
   trainSchedule:weekShedule.Monday)) rowexpr
 ) JT;

 SELECT
 *
 FROM
 (
  SELECT
   id
  --** SSC-FDM-TD0020 - UNRECOGNIZED JSON LITERAL {"jsonpath" "$.time", "type"" : "CHAR ( 12 )"} **
  FROM
   demo.PUBLIC.Train T,
   TABLE(FLATTEN(INPUT =>
   trainSchedule:weekShedule.Monday)) rowexpr
 ) JT;
Copy

Meilleures pratiques

  • Assurez-vous que JSON a le format attendu selon la grammaire de Teradata.

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

SSC-FDM-TD0021

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

Note

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

Description

Cette erreur apparaît lorsqu’une requête faisant référence à une table DBC.DATABASES est exécutée et que la colonne sélectionnée ne possède 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-FDM-TD0022

Variables shell trouvées. L’exécution de ce code dans un script shell est requise.

Description

Dans les scripts Teradata, les variables shell sont utilisées pour stocker des valeurs temporaires qui peuvent être accessibles et manipulées tout au long du script. Les variables shell sont définies à l’aide du signe dollar ($) suivi d’un nom (pouvant être entouré d’accolades), et leurs valeurs peuvent être définies à l’aide de l’opérateur d’attribution (=).

#!/bin/bash

## define a shell variable
tablename="mytable"

## use the variable in a Teradata SQL query
bteq <<EOF
    .LOGON myhost/myuser,mypassword
    SELECT * FROM ${tablename};
    .LOGOFF
EOF

Copy

Vous pouvez considérer les variables shell comme ayant une fonction identique ou similaire à l’interpolation de chaînes. Ainsi, il est important de conserver cette fonctionnalité lorsqu’elle est transformée.\ \ Lors de la conversion de scripts en Python, les variables shell conservent leur fonctionnalité en exécutant le code converti dans un script shell (fichier .sh). Pour cette raison, ces variables shell doivent conserver le même format que le code d’entrée.

Exemple de code

Code d’entrée :

 SELECT $column FROM ${tablename}
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
con = None
#** SSC-FDM-TD0022 - SHELL VARIABLES FOUND, RUNNING THIS CODE IN A SHELL SCRIPT IS REQUIRED **
def main():
  snowconvert.helpers.configure_log()
  con = snowconvert.helpers.log_on()
  exec("""
    SELECT
      $column
    FROM
      ${tablename}
    """)
  snowconvert.helpers.quit_application()

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

Meilleures pratiques

  • L’exécution du code converti dans un script shell est requise.

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

SSC-FDM-TD0023

String Similarity peut avoir un comportement différent.

Description

Ce FDM s’affiche lorsque SnowConvert AI transforme la fonction Similarity de Teradata dans Snowflake. Il indique que les résultats peuvent avoir un comportement différent.

Exemple de code

Prenons les données suivantes à titre d’exemple.

Id

a

b

1

2

Gute nacht

Ich weis nicht

3

Ich weiß nicht

Ich wei? nicht

4

Ich weiß nicht

Ich wei? nicht

5

Ich weiß nicht

Ich weiss nicht

6

Snowflake

Oracle

7

święta

swieta

8

NULL

9

NULL

NULL

Code d’entrée :
Requête
-- Additional Params: -q SnowScript
SELECT * FROM StringSimilarity (
  ON (
    SELECT id, CAST(a AS VARCHAR(200)) AS a, CAST(b AS VARCHAR(200)) AS b
    FROM table_1
  ) PARTITION BY ANY
  USING
  ComparisonColumnPairs ('jaro_winkler(a,b) AS sim_fn')
  Accumulate ('id')
) AS dt ORDER BY 1;
Copy
Résultat
Idsim_fn
10
20.565079365
31
40.959047619
50
60.611111111
70.7777777777777777
80
90
Code généré
Requête
 SELECT
* FROM
--** SSC-FDM-TD0023 - STRING SIMILARITY MIGHT HAVE A DIFFERENT BEHAVIOR. **
(
   SELECT
     id,
     JAROWINKLER_UDF(a, b) AS sim_fn
   FROM table_1
 ) dt ORDER BY 1;
Copy
Résultat

ID

SIM_FN

1

0,000000

2

0,560000

3

0,970000

4

0,950000

5

0,000000

6

0,610000

7

0,770000

8

0,000000

9

0,000000

Meilleures pratiques

SSC-FDM-TD0024

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

Description

Cet EWI s’affiche lorsque SnowConvert AI trouve Create Table avec l’option SET. Étant donné que SET TABLE n’est pas pris en charge dans Snowflake, il est supprimé.

Exemple de code

Teradata :
 CREATE SET TABLE TableExample
(
ColumnExample Number
)
Copy
 CREATE SET VOLATILE TABLE SOMETABLE, LOG AS 
(SELECT ColumnExample FROM TableExample);
Copy
Snowflake Scripting:
 --** SSC-FDM-TD0024 - SET TABLE FUNCTIONALITY NOT SUPPORTED. TABLE MIGHT HAVE DUPLICATE ROWS **
CREATE OR REPLACE TABLE TableExample
(
ColumnExample NUMBER(38, 18)
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"teradata"}}'
;
Copy
 --** SSC-FDM-TD0024 - SET TABLE FUNCTIONALITY NOT SUPPORTED. TABLE MIGHT HAVE DUPLICATE ROWS **
CREATE OR REPLACE TEMPORARY TABLE SOMETABLE
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"teradata"}}'
AS
(
SELECT
ColumnExample FROM
TableExample
);
Copy

Meilleures pratiques

SSC-FDM-TD0025

Teradata Database Temporal Table n’est pas pris en charge dans Snowflake.

Description

La prise en charge de Teradata Database Temporal implique la création de tables temporelles et d’objets DDL et DML temporels. La prise en charge des tables et des données temporelles (en fonction du temps) n’est pas prise en charge dans Snowflake, car il n’existe pas d’équivalent absolu.

Toutes ces instructions sont reconnues (analysées) par SnowConvert AI, mais pour exécuter les requêtes dans Snowflake, ces éléments sont supprimés dans le processus de traduction.

Il convient de noter que lorsqu’une instruction abort est rencontrée, elle sera transformée en une commande Delete afin de conserver la fonctionnalité d’équivalence qui permet d’annuler les opérations effectuées au cours d’une transaction et de restaurer la base de données à l’état dans lequel elle se trouvait au début.

Exemple de code

L’exemple suivant montre un Temporal-form Select traduit en un Select habituel.

Code d’entrée :
 SEQUENCED VALIDTIME  
   SELECT
   Policy_ID,
   Customer_ID
   FROM Policy
      WHERE Policy_Type = 'AU';
Copy
Code généré :
 ----** SSC-FDM-TD0025 - TEMPORAL FORMS ARE NOT SUPPORTED IN SNOWFLAKE **
--SEQUENCED VALIDTIME
SELECT
   Policy_ID,
   Customer_ID
   FROM
   Policy
      WHERE
   UPPER(RTRIM( Policy_Type)) = UPPER(RTRIM('AU'));
Copy

Cas où la commande Abort est utilisée dans le contexte d’une transaction.

Code d’entrée :
 CREATE OR REPLACE PROCEDURE TEST.ABORT_STATS()
BEGIN
    CURRENT VALIDTIME AND NONSEQUENCED TRANSACTIONTIME ABORT 
     FROM table_1 
     WHERE table_1.x1 = 1;
END;
Copy
Code généré :
 CREATE OR REPLACE PROCEDURE TEST.ABORT_STATS ()
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"teradata"}}'
EXECUTE AS CALLER
AS
$$
    BEGIN
        --    CURRENT VALIDTIME AND NONSEQUENCED TRANSACTIONTIME
        --** SSC-FDM-TD0025 - TEMPORAL FORMS ARE NOT SUPPORTED IN SNOWFLAKE **
        LET _ROW_COUNT FLOAT;
        SELECT
            COUNT(*)
        INTO
            _ROW_COUNT
            FROM
            table_1
                 WHERE table_1.x1 = 1;
            IF (_ROW_COUNT > 0) THEN
            ROLLBACK;
            END IF;
    END;
$$;
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-FDM-TD0026

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

Note

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

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

Code de sortie

 EXECUTE IMMEDIATE
$$
  DECLARE
    STATUS_OBJECT OBJECT := OBJECT_CONSTRUCT('SQLCODE', 0);
  BEGIN
    IF (NOT (STATUS_OBJECT['SQLROWCOUNT'] = 0)) THEN
      --** SSC-FDM-TD0026 - 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
Bonnes pratiques

SSC-FDM-TD0027

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

Note

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

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

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;

	SELECT
	* FROM
	--** SSC-FDM-TD0027 - 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-FDM-TD0028

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

Note

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

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.

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 TABLE demo.Train (
    firstCol INT,
    jsonCol VARIANT,
    thirdCol VARCHAR(30)
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"teradata"}}'
;

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
    --** SSC-FDM-TD0028 - JSON_TABLE NOT TRANSFORMED, COLUMN NAMES COULD NOT BE RETRIEVED FROM SEMANTIC INFORMATION **
    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
            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-FDM-TD0029

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

É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') /*** SSC-FDM-TD0029 - 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') /*** SSC-FDM-TD0029 - 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') /*** SSC-FDM-TD0029 - SNOWFLAKE SUPPORTED FORMATS FOR TO_CHAR DIFFER FROM TERADATA AND MAY FAIL OR HAVE DIFFERENT BEHAVIOR ***/;

SELECT
TO_CHAR(45620) /*** SSC-FDM-TD0029 - 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-FDM-TD0030

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

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
    -- Additional Params: --scriptsTargetLanguage SnowScript
    --.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;
    --** SSC-FDM-TD0030 - 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-FDM-TD0031

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

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

location1

location2

Distance_In_Km

POINT (-73.989308 40.741895)

POINT (40.741895 34.053691)

9351139,978062356

Code généré
 --The distance between New York and Los Angeles
SELECT
	TO_GEOGRAPHY('POINT(-73.989308 40.741895)') As location1,
	TO_GEOGRAPHY('POINT(40.741895 34.053691)') As location2,
	--** SSC-FDM-TD0031 - ST_DISTANCE RESULTS ARE SLIGHTLY DIFFERENT FROM ST_SPHERICALDISTANCE **
	ST_DISTANCE(
	location1, location2) As Distance_In_km;
Copy
Sortie Snowflake

LOCATION1

LOCATION2

DISTANCE_IN_KM

{ « coordinates »: [ -73.989308, 40.741895 ], « type »: « Point » }

{ « coordinates »: [ 40.741895, 34.053691 ], « type »: « Point » }

9351154,65572674

Meilleures pratiques

SSC-FDM-TD0032

La clause CASESPECIFIC a été supprimée de l’expression LIKE.

Note

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

Description

Cette erreur apparaît lorsque l’expression LIKE est accompagnée de la clause [NOT] CASESPECIFIC.

Exemple de code

Code d’entrée :
 SELECT * FROM MY_TABLE
WHERE Name Like 'Marco%' (NOT CASESPECIFIC);
Copy
Code généré
 SELECT
    * FROM
    MY_TABLE
WHERE Name ILIKE 'Marco%' /*** SSC-FDM-TD0032 - NOT CASESPECIFIC CLAUSE WAS REMOVED ***/;
Copy

Meilleures pratiques

  • Le comportement spécifique à la casse dans TERADATA dépend de la configuration système TMODE.

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

SSC-FDM-TD0033

La transformation de ACTIVITY_COUNT peut nécessiter des ajustements manuels.

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

Toutefois, celle-ci présente certaines limitations, listées ci-dessous.

Limitations�

Premier cas

Si ACTIVITY_COUNT est appelée deux fois ou plus avant d’exécuter une autre instruction DML, la transformation peut ne pas retourner les valeurs attendues.

Teradata
 REPLACE PROCEDURE InsertEmployeeSalaryAndLog_1 ()
BEGIN
    DECLARE row_count1 INT;

    INSERT INTO employees (employee_id, first_name, last_name, department_id, salary)
    VALUES (101, 'Alice', 'Smith', 10, 70000.00);

    -- Get the ACTIVITY_COUNT
    SET row_count1 = ACTIVITY_COUNT;
    SET row_count1 = ACTIVITY_COUNT;

    -- Insert the ACTIVITY_COUNT into the activity_log table
    INSERT INTO activity_log (operation, row_count)
    VALUES ('INSERT PROCEDURE', row_count1);
END;

REPLACE PROCEDURE InsertEmployeeSalaryAndLog_2 ()
BEGIN
    DECLARE row_count1 INT;
    DECLARE message VARCHAR(100);

    INSERT INTO employees (employee_id, first_name, last_name, department_id, salary)
    VALUES (101, 'Alice', 'Smith', 10, 70000.00);

    -- Get the ACTIVITY_COUNT
    SET row_count1 = ACTIVITY_COUNT + 1;
    SET row_count1 = ACTIVITY_COUNT;

    -- Insert the ACTIVITY_COUNT into the activity_log table
    INSERT INTO activity_log (operation, row_count)
    VALUES ('INSERT PROCEDURE', row_count1);
END;
Copy
Snowflake
 CREATE OR REPLACE PROCEDURE InsertEmployeeSalaryAndLog_1 ()
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
        row_count1 INT;
    BEGIN
         
        INSERT INTO employees (employee_id, first_name, last_name, department_id, salary)
        VALUES (101, 'Alice', 'Smith', 10, 70000.00);

           -- Get the ACTIVITY_COUNT
        row_count1 := (
            SELECT
                $1
            FROM
                TABLE(RESULT_SCAN(LAST_QUERY_ID()))
        ) /*** SSC-FDM-TD0033 - 'ACTIVITY_COUNT' TRANSFORMATION MIGHT REQUIRE MANUAL ADJUSTMENTS ***/;
        row_count1 := (
            SELECT
                $1
            FROM
                TABLE(RESULT_SCAN(LAST_QUERY_ID()))
        ) /*** SSC-FDM-TD0033 - 'ACTIVITY_COUNT' TRANSFORMATION MIGHT REQUIRE MANUAL ADJUSTMENTS ***/;

        -- Insert the ACTIVITY_COUNT into the activity_log table
        INSERT INTO activity_log (operation, row_count)
        VALUES ('INSERT PROCEDURE', :row_count1);
    END;
$$;

CREATE OR REPLACE PROCEDURE InsertEmployeeSalaryAndLog_2 ()
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
        row_count1 INT;
        message VARCHAR(100);
    BEGIN
         
         
        INSERT INTO employees (employee_id, first_name, last_name, department_id, salary)
        VALUES (101, 'Alice', 'Smith', 10, 70000.00);

           -- Get the ACTIVITY_COUNT
        row_count1 := (
            SELECT
                $1
            FROM
                TABLE(RESULT_SCAN(LAST_QUERY_ID()))
        ) /*** SSC-FDM-TD0033 - 'ACTIVITY_COUNT' TRANSFORMATION MIGHT REQUIRE MANUAL ADJUSTMENTS ***/ + 1;
        row_count1 := (
            SELECT
                $1
            FROM
                TABLE(RESULT_SCAN(LAST_QUERY_ID()))
        ) /*** SSC-FDM-TD0033 - 'ACTIVITY_COUNT' TRANSFORMATION MIGHT REQUIRE MANUAL ADJUSTMENTS ***/;

        -- Insert the ACTIVITY_COUNT into the activity_log table
        INSERT INTO activity_log (operation, row_count)
        VALUES ('INSERT PROCEDURE', :row_count1);
    END;
$$;
Copy

Dans les deux procédures, ACTIVITY_COUNT est appelée deux fois avant qu’une autre instruction DML soit appelée. Dans Teradata, ACTIVITY_COUNT renverra le nombre de lignes dans l’instruction INSERT qui les précède, même lorsqu’elle est appelée deux fois. Cependant, comme la transformation Snowflake utilise LAST_QUERY_ID(), le résultat dépend du jeu de résultats détenu par LAST_QUERY_ID().

InsertEmployeeSalaryAndLog_1() ne nécessite aucun ajustement manuel. Vérifiez l’historique des requêtes (de bas en haut) :

Query History when calling InsertEmployeeSalaryAndLog_1()

  1. L’instruction INSERT est exécutée. LAST_QUERY_ID() pointera vers cette instruction.

  2. SELECT (première ACTIVITY_COUNT) est exécuté, et $1 correspondra à 1. LAST_QUERY_ID() pointera vers cette instruction.

  3. SELECT (seconde ACTIVITY_COUNT) est exécuté. Étant donné que le résultat de la dernière instruction correspondait à 1, $1 correspondra également 1 pour ce SELECT.

  4. Enfin, row_count1 contient la valeur 1, qui est insérée dans activity_log.

De l’autre côté, InsertEmployeeSalaryAndLog_2() nécessite des ajustements manuels. Vérifiez l’historique des requêtes (de bas en haut) :

Query History when calling InsertEmployeeSalaryAndLog_2()

  1. L’instruction INSERT est exécutée. LAST_QUERY_ID() pointera vers cette instruction.

  2. SELECT (première ACTIVITY_COUNT) est exécuté, et $1 correspond à 1. Cependant, remarquez dans quelle mesure QUERY_TEXT correspond à +10. Cela affectera le résultat qui sera analysé. LAST_QUERY_ID() pointera vers cette instruction.

  3. SELECT (seconde ACTIVITY_COUNT) est exécuté. Le résultat de la dernière requête est 11. Ainsi, $1 contiendra 11 au lieu de la valeur 1 attendue.

  4. Enfin, row_count1 contient la valeur 11, qui est insérée dans activity_log.

Il s’agit des valeurs insérées dans activity_log :

LOG_ID

OPERATION

ROW_COUNT

LOG_TIMESTAMP

1

INSERT PROCEDURE

1

2024-07-15 09:22:21.725

101

INSERT PROCEDURE

11

2024-07-15 09:22:26.248

Ajustements pour le premier cas

Conformément à la documentation de Snowflake pour LAST_QUERY_ID, vous pouvez spécifier la requête à renvoyer, en fonction de la position de la requête. LAST_QUERY_ID(-1) renvoie la dernière requête, (-2) l’avant-dernière requête, et ainsi de suite.

La correction du problème dans InsertEmployeeSalaryAndLog_2() consistera simplement à spécifier LAST_QUERY_ID(-2) dans la deuxième utilisation de ACTIVITY_COUNT (seconde SELECT), afin qu’il obtienne les résultats de l’instruction INSERT à la place :

 ...
INSERT INTO employees (employee_id, first_name, last_name, department_id, salary)
        VALUES (101, 'Alice', 'Smith', 10, 70000.00);

           -- Get the ACTIVITY_COUNT
        row_count1 := (
            SELECT
                $1
            FROM
                TABLE(RESULT_SCAN(LAST_QUERY_ID()))
        ) /*** SSC-FDM-TD0033 - 'ACTIVITY_COUNT' TRANSFORMATION MIGHT REQUIRE MANUAL ADJUSTMENTS ***/ + 1;
        row_count1 := (
            SELECT
                $1
            FROM
                TABLE(RESULT_SCAN(LAST_QUERY_ID(-2)))
        ) /*** SSC-FDM-TD0033 - 'ACTIVITY_COUNT' TRANSFORMATION MIGHT REQUIRE MANUAL ADJUSTMENTS ***/;
...
Copy

Deuxième cas

Si ACTIVITY_COUNT est appelée après qu’une instruction DML a été exécutée, la transformation ne renverra pas les valeurs attendues.

Teradata
REPLACE PROCEDURE InsertEmployeeSalaryAndLog_3 ()
BEGIN
    DECLARE row_count1 INT;
    DECLARE emp_id 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 employee_id INTO emp_id FROM employees;
    -- Get the ACTIVITY_COUNT
    SET row_count1 = ACTIVITY_COUNT;
    SET message = 'EMPLOYEE INSERTED - ID: ' || emp_id;

    -- Insert the ACTIVITY_COUNT into the activity_log table
    INSERT INTO activity_log (operation, row_count)
    VALUES (message, row_count1);
END;
Copy
Snowflake
 CREATE OR REPLACE PROCEDURE InsertEmployeeSalaryAndLog_3 ()
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
        row_count1 INT;
        emp_id 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
            employee_id INTO
            :emp_id
        FROM
            employees;
               -- Get the ACTIVITY_COUNT
               row_count1 := (
            SELECT
                $1
            FROM
                TABLE(RESULT_SCAN(LAST_QUERY_ID()))
               ) /*** SSC-FDM-TD0033 - 'ACTIVITY_COUNT' TRANSFORMATION MIGHT REQUIRE MANUAL ADJUSTMENTS ***/;
               message := 'EMPLOYEE INSERTED - ID: ' || emp_id;

               -- Insert the ACTIVITY_COUNT into the activity_log table
               INSERT INTO activity_log (operation, row_count)
               VALUES (:message, :row_count1);
    END;
$$;
Copy

Comme dans le cas précédent, LAST_QUERY_ID ne pointe pas vers la bonne requête et renvoie donc une valeur incorrecte, qui est attribuée à row_count1. Vérifiez l’historique des requêtes (de bas en haut) :

Query History when calling InsertEmployeeSalaryAndLog_3()

  1. L’instruction INSERT est exécutée. LAST_QUERY_ID() pointera vers cette instruction.

  2. SELECT INTO est exécuté, et $1 correspondra à 101. LAST_QUERY_ID() pointera vers cette instruction.

  3. SELECT (ACTIVITY_COUNT) est exécuté. Le résultat de la dernière requête est 101. Ainsi, 1 $ contiendra 101 au lieu de la valeur 1 attendue.

  4. Enfin, row_count1 contient la valeur 101, qui est insérée dans activity_log.

Il s’agit des valeurs insérées dans activity_log :

LOG_ID

OPERATION

ROW_COUNT

LOG_TIMESTAMP

1

EMPLOYEE INSERTED - ID: 101

101

2024-07-15 11:00:38.000

Ajustements pour le second cas

  1. Une correction possible consiste à spécifier la requête correcte à renvoyer par LAST_QUERY_ID. Par exemple, ici, LAST_QUERY_ID(-2) correspondra à la bonne requête vers laquelle pointer.

 ...
row_count1 := (
            SELECT
                $1
            FROM
                TABLE(RESULT_SCAN(LAST_QUERY_ID(-2)))
               ) /*** SSC-FDM-TD0033 - 'ACTIVITY_COUNT' TRANSFORMATION MIGHT REQUIRE MANUAL ADJUSTMENTS ***/;
               ...
Copy
  1. Une autre solution possible consiste à utiliser ACTIVITY_COUNT (SELECT) immédiatement après l’exécution de l’instruction INSERT.

...
INSERT INTO employees (employee_id, first_name, last_name, department_id, salary)
VALUES (101, 'Alice', 'Smith', 10, 70000.00);
-- Get the ACTIVITY_COUNT
       row_count1 := (
    SELECT
        $1
    FROM
        TABLE(RESULT_SCAN(LAST_QUERY_ID()))
       ) /*** SSC-FDM-TD0033 - 'ACTIVITY_COUNT' TRANSFORMATION MIGHT REQUIRE MANUAL ADJUSTMENTS ***/;
SELECT
    employee_id INTO
    :emp_id
FROM
    employees;
       message := 'EMPLOYEE INSERTED - ID: ' || emp_id;
...
Copy

Meilleures pratiques

  • Assurez-vous de pointer vers la bonne requête lorsque vous utilisez LAST_QUERY_ID.

  • Assurez-vous que ACTIVITY_COUNT est utilisée immédiatement après l’instruction DML à évaluer.

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

SSC-FDM-TD0034

La période contient une fonction transformée en fonction définie par l’utilisateur.

Description

L’expression CONTAINS de Teradata effectue une validation indiquant si l’élément à droite est contenu dans l’élément à gauche, qui est censé être de type PERIOD. CONTAINS ne s’applique qu’à DATE, TIME, TIMESTAMP ou PERIOD. Étant donné que PERIOD n’est pas pris en charge dans Snowflake, une fonction définie par l’utilisateur émulera la logique du comportement CONTAINS natif.

Exemple de code

Code d’entrée :
  UPDATE TABLE1
  SET COL1 = CURRENT_TIMESTAMP
  WHERE COL3 CONTAINS CURRENT_TIMESTAMP;
Copy
Code généré
  UPDATE TABLE1
  SET
    COL1 = CURRENT_TIMESTAMP()
  WHERE
    PUBLIC.PERIOD_CONTAINS_UDF(COL3, CURRENT_TIMESTAMP()) /*** SSC-FDM-TD0034 - PERIOD CONTAINS EXPRESSION TRANSFORMED TO USER DEFINED FUNCTION. ***/
Copy

Meilleures pratiques

  • Le VARCHAR utilisé à la place de PERIOD suppose le format <PERIOD_BEGIN>*<PERIOD_END> dans toutes les valeurs. Si les valeurs sont divisées par un jeton différent de *, vous pouvez modifier la valeur renvoyée par l’UDF PUBLIC.GET_PERIOD_SEPARATOR fourni par SnowConvert AI. Notez que la structure doit posséder un jeton qui marque le début et la fin d’une PERIOD, de sorte que les dates, heures ou horodatages doivent toujours être séparés par le même jeton.

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

SSC-FDM-TD0035

La fonction de statistiques n’est pas nécessaire dans Snowflake.

Note

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

Description

Les statistiques DROP, COLLECT ou HELP ne sont pas nécessaires dans Snowflake. Snowflake collecte déjà des statistiques utilisées pour l’optimisation automatique des requêtes. C’est pourquoi ces instructions statistiques sont utilisées dans Teradata.

Exemple de code

Code d’entrée :
  HELP STATISTICS TestName;
Copy
Code généré
  ----** SSC-FDM-TD0035 - HELP STATISTICS NOT NEEDED. SNOWFLAKE AUTOMATICALLY COLLECTS STATISTICS. **
  --HELP STATISTICS TestName
Copy

Meilleures pratiques

SSC-FDM-TD0036

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

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') /*** 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.