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
);
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"}}'
;
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
)
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"}}'
;
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 :
La substitution de variables doit être activée.
Toutes les variables doivent être définies.
Exécutez le fichier en tant que script par lots.
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;
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
$$
Meilleures pratiques¶
Si vous avez besoin de plus d’assistance, vous pouvez nous envoyer un e-mail à snowconvert-support@snowflake.com.
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)
);
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"}}'
;
Meilleures pratiques¶
Si vous avez besoin de plus d’assistance, vous pouvez nous envoyer un e-mail à snowconvert-support@snowflake.com.
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';
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';
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;
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
;
Meilleures pratiques¶
Si vous avez besoin de plus d’assistance, vous pouvez nous envoyer un e-mail à snowconvert-support@snowflake.com.
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
)
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"}}'
;
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);
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 ***/;
Meilleures pratiques¶
Si vous avez besoin de plus d’assistance, vous pouvez nous envoyer un e-mail à snowconvert-support@snowflake.com.
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
)
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"}}'
;
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.
.png)
An example of the contents of DBC.COLUMNSV table in Teradata
.png)
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';
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'));
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 '#';
Code généré :¶
SELECT
--** SSC-FDM-TD0011 - UNICODE BMP IS NOT SUPPORTED IN SNOWFLAKE **
'hola \u+005132 mundo';
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
);
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"}}'
;
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
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
$$
Meilleures pratiques¶
Si vous avez besoin de plus d’assistance, vous pouvez nous envoyer un e-mail à snowconvert-support@snowflake.com.
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
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()
Meilleures pratiques¶
Si vous avez besoin de plus d’assistance, vous pouvez nous envoyer un e-mail à snowconvert-support@snowflake.com.
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);
Snowflake Scripting:¶
SELECT
--** SSC-FDM-TD0015 - REGEXP_SUBSTR FUNCTION ONLY SUPPORTS POSIX REGULAR EXPRESSIONS **
REGEXP_SUBSTR('qaqequ','q(?=u)', 1, 1);
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');
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);
Meilleures pratiques¶
Si vous avez besoin de plus d’assistance, vous pouvez nous envoyer un e-mail à snowconvert-support@snowflake.com.
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;
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;
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);
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);
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');
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');
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);
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;
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;
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;
Meilleures pratiques¶
Si vous avez besoin de plus d’assistance, vous pouvez nous envoyer un e-mail à snowconvert-support@snowflake.com.
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
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}
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()
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;
Résultat¶
| Id | sim_fn |
|---|---|
| 1 | 0 |
| 2 | 0.565079365 |
| 3 | 1 |
| 4 | 0.959047619 |
| 5 | 0 |
| 6 | 0.611111111 |
| 7 | 0.7777777777777777 |
| 8 | 0 |
| 9 | 0 |
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;
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¶
Si vous avez besoin de plus d’assistance, vous pouvez nous envoyer un e-mail à snowconvert-support@snowflake.com.
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
)
CREATE SET VOLATILE TABLE SOMETABLE, LOG AS
(SELECT ColumnExample FROM TableExample);
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"}}'
;
--** 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
);
Meilleures pratiques¶
Si vous avez besoin de plus d’assistance, vous pouvez nous envoyer un e-mail à snowconvert-support@snowflake.com.
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';
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'));
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;
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;
$$;
¶
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;
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
$$
Bonnes pratiques ¶
Si vous avez besoin de plus d’assistance, vous pouvez nous envoyer un e-mail à snowconvert-support@snowflake.com.
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;
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;
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;
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;
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 sessionWEEK_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 sessionWEEK_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);
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 ***/;
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_TZpour éviter un comportement différent. Gardez également à l’esprit que le typeTIMEne 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';
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
$$
Meilleures pratiques¶
Si vous avez besoin de plus d’assistance, vous pouvez nous envoyer un e-mail à snowconvert-support@snowflake.com.
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;
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;
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¶
Si vous avez besoin de plus d’assistance, vous pouvez nous envoyer un e-mail à snowconvert-support@snowflake.com.
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);
Code généré¶
SELECT
* FROM
MY_TABLE
WHERE Name ILIKE 'Marco%' /*** SSC-FDM-TD0032 - NOT CASESPECIFIC CLAUSE WAS REMOVED ***/;
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()));
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;
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;
$$;
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) :
.png)
Query History when calling InsertEmployeeSalaryAndLog_1()
L’instruction
INSERTest exécutée.LAST_QUERY_ID()pointera vers cette instruction.SELECT(premièreACTIVITY_COUNT) est exécuté, et$1correspondra à1.LAST_QUERY_ID()pointera vers cette instruction.SELECT(secondeACTIVITY_COUNT) est exécuté. Étant donné que le résultat de la dernière instruction correspondait à1,$1correspondra également1pour ceSELECT.Enfin,
row_count1contient la valeur1, qui est insérée dansactivity_log.
De l’autre côté, InsertEmployeeSalaryAndLog_2() nécessite des ajustements manuels. Vérifiez l’historique des requêtes (de bas en haut) :
.png)
Query History when calling InsertEmployeeSalaryAndLog_2()
L’instruction
INSERTest exécutée.LAST_QUERY_ID()pointera vers cette instruction.SELECT (première
ACTIVITY_COUNT) est exécuté, et$1correspond à1. Cependant, remarquez dans quelle mesureQUERY_TEXTcorrespond à+10. Cela affectera le résultat qui sera analysé.LAST_QUERY_ID()pointera vers cette instruction.SELECT(secondeACTIVITY_COUNT) est exécuté. Le résultat de la dernière requête est11. Ainsi,$1contiendra11au lieu de la valeur1attendue.Enfin,
row_count1contient la valeur11, qui est insérée dansactivity_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 ***/;
...
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;
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;
$$;
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) :
.png)
Query History when calling InsertEmployeeSalaryAndLog_3()
L’instruction
INSERTest exécutée.LAST_QUERY_ID()pointera vers cette instruction.SELECT INTOest exécuté, et $1 correspondra à 101.LAST_QUERY_ID()pointera vers cette instruction.SELECT(ACTIVITY_COUNT) est exécuté. Le résultat de la dernière requête est101. Ainsi,1 $contiendra101au lieu de la valeur 1 attendue.Enfin,
row_count1contient la valeur101, qui est insérée dansactivity_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¶
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 ***/;
...
Une autre solution possible consiste à utiliser
ACTIVITY_COUNT(SELECT) immédiatement après l’exécution de l’instructionINSERT.
...
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;
...
Meilleures pratiques¶
Assurez-vous de pointer vers la bonne requête lorsque vous utilisez
LAST_QUERY_ID.Assurez-vous que
ACTIVITY_COUNTest 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;
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. ***/
Meilleures pratiques¶
Le
VARCHARutilisé à la place dePERIODsuppose 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’UDFPUBLIC.GET_PERIOD_SEPARATORfourni 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;
Code généré¶
----** SSC-FDM-TD0035 - HELP STATISTICS NOT NEEDED. SNOWFLAKE AUTOMATICALLY COLLECTS STATISTICS. **
--HELP STATISTICS TestName
Meilleures pratiques¶
Si vous avez besoin de plus d’assistance, vous pouvez nous envoyer un e-mail à snowconvert-support@snowflake.com.
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 |
|---|---|
|
|
|
|
|
|
Modifiez les paramètres de session
TIMESTAMP_NTZ_OUTPUT_FORMATetTIME_OUTPUT_FORMAT: Les commandesALTER 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;
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;
Meilleures pratiques¶
Étant donné que le comportement de
PERIODet 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.