SnowConvert AI – Funktionale Unterschiede bei Teradata¶
SSC-FDM-TD0001¶
Spalte, die von Blob-Datentyp konvertiert wurde.
Beschreibung¶
Diese Nachricht wird angezeigt, wenn SnowConvert AI einen BLOB-Datentyp findet. Da BLOB in Snowflake nicht unterstützt wird, wird der Typ in „Binary“ geändert.
Codebeispiel¶
Eingabecode:¶
CREATE TABLE TableExample
(
ColumnExample BLOB
);
Generierter Code:¶
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"}}'
;
Best Practices¶
Es sind keine weiteren Aktionen des Benutzers erforderlich.
Wenn Sie weitere Unterstützung benötigen, können Sie uns eine E-Mail an snowconvert-support@snowflake.com senden.
SSC-FDM-TD0002¶
Spalte, die von Clob-Datentyp konvertiert wurde.
Beschreibung¶
Diese Nachricht wird angezeigt, wenn SnowConvert AI einen CLOB-Datentyp findet. Da CLOB in SnowConvert AI nicht unterstützt wird, wird der Typ in VARCHAR geändert.
Codebeispiel¶
Eingabecode:¶
CREATE TABLE TableExample
(
ColumnExample CLOB
)
Generierter Code:¶
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"}}'
;
Best Practices¶
Es sind keine weiteren Aktionen des Benutzers erforderlich.
Wenn Sie weitere Unterstützung benötigen, können Sie uns eine E-Mail an snowconvert-support@snowflake.com senden.
SSC-FDM-TD0003¶
Bash-Variablen gefunden; zum Ausführen dieses Skripts ist die Verwendung von SnowSQL mit aktivierter Variablenersetzung erforderlich.
Beschreibung¶
Wenn der Quellcode einer Skriptdatei, die nach Snowflake Scripting migriert wird, Bash-Variablenplatzhalter ($variable oder ${variable}) enthält, wandelt SnowConvert AI diese in SnowSQL-Variablen (&variable oder &{variable}) um.
Diese Warnung wird generiert, um darauf hinzuweisen, dass die Ausführung des migrierten Skripts nun von SnowSQL abhängt, um zu funktionieren. Bitte beachten Sie Folgendes, wenn Sie das Skript in SnowSQL ausführen:
Variablenersatz muss aktiviert sein.
Alle Variablen müssen definiert sein.
Führen Sie die Datei als [Batchskript] (https://docs.snowflake.com/en/user-guide/snowsql-use.html#running-batch-scripts) aus.
Beispielcode¶
Eingabecode:¶
.LOGON dbc, dbc;
select '$variable', '${variable}', '${variable}_concatenated';
select $colname from $tablename where info = $id;
select ${colname} from ${tablename} where info = ${id};
.LOGOFF;
Generierter Code:¶
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
$$
Best Practices¶
Wenn Sie weitere Unterstützung benötigen, können Sie uns eine E-Mail an snowconvert-support@snowflake.com senden.
SSC-FDM-TD0004¶
Zeitraumtypen werden als zwei Datenfelder behandelt
Beschreibung¶
Teradata verfügt über einen Period-Datentyp, der zur Darstellung eines Zeitintervalls verwendet wird. Instanzen dieses Typs besitzen einen Anfangs- und einen Endpunkt desselben Typs (Zeit, Datum oder Zeitstempel) sowie eine Reihe von Funktionen, mit denen Period-Daten wie PERIOD, BEGIN, END, OVERLAPS usw. initialisiert und manipuliert werden.
Da der Period-Typ von Snowflake nicht unterstützt wird, transformiert SnowConvert AI diesen Typ und die dazugehörigen Funktionen nach den folgenden Regeln:
Jede Zeittypdeklaration in Spaltentabellen wird als zwei Spalten desselben Typs migriert.
Der [periodische Wertkonstruktor-Funktion] (https://docs.teradata.com/r/Enterprise_IntelliFlex_VMware/SQL-Date-and-Time-Functions-and-Expressions/Period-Functions-and-Operators) wird in zwei verschiedene Konstruktoren des Period-Untertyps migriert – einen mit dem Anfangswert und einen mit dem Endwert.
Unterstützte Funktionen, die Parameter des Period-Typs erwarten, werden ebenfalls nach UDFs migriert. Diese UDFs erwarten in der Regel zwei Parameter: den Anfangswert und den Endwert.
Beispielcode¶
Eingabecode:¶
-- Additional Params: --SplitPeriodDatatype
CREATE TABLE DateTable
(
COL1 PERIOD(DATE) DEFAULT PERIOD (DATE '2005-02-03', UNTIL_CHANGED)
);
Generierter Code:¶
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"}}'
;
Best Practices¶
Wenn Sie weitere Unterstützung benötigen, können Sie uns eine E-Mail an snowconvert-support@snowflake.com senden.
SSC-FDM-TD0005¶
Nicht standardmäßige Zeitzonenoffsets werden in Snowflake nicht unterstützt; sie werden auf die nächste gültige Zeitzone gerundet.
Beschreibung¶
Während Teradata die Flexibilität bietet, mithilfe der SET TIME ZONE-Abfrage einen beliebigen Zeitzonenoffset zwischen -12:59 und +14:00 festzulegen, unterstützt Snowflake ausschließlich Zeitzonen, die in der [IANA-Time Zone Database] (https://www.iana.org/time-zones) aufgeführt sind.
Wenn der in der SET TIME ZONE-Abfrage angegebene Offset nicht einer IANA-Standardzeitzone entspricht, rundet Snowflake ihn automatisch auf die nächstgelegene Standardzeitzone mit dem ähnlichsten Offset. In einem solchen Fall wird eine Warnmeldung generiert.
Beispielcode¶
Eingabecode:¶
-- Will be rounded to Asia/Colombo (+05:30)
SET TIME ZONE '05:26';
Generierter Code:¶
-- 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';
Best Practices¶
Es sind keine weiteren Aktionen des Benutzers erforderlich.
Wenn Sie weitere Unterstützung benötigen, können Sie uns eine E-Mail an snowconvert-support@snowflake.com senden.
SSC-FDM-TD0006¶
Ansicht mit -Prüfoption wird nicht unterstützt.
Beschreibung¶
Diese Meldung wird angezeigt, wenn SnowConvert AI eine Ansicht mit der Klausel WITH CHECK OPTION findet. Diese wird in Snowflake nicht unterstützt, daher wird sie aus dem Code auskommentiert.
Diese Klausel funktioniert mit aktualisierbaren Ansichten, über die INSERT- und UPDATE-Befehle ausgeführt werden können und die intern die Tabelle aktualisieren, die mit der Ansicht verknüpft ist.
Die Klausel wird verwendet, um die Zeilen, die von dem Befehl betroffen sind, mit der WHERE-Klausel in der Ansicht zu beschränken.
Weitere Informationen über die Klauselfunktion finden Sie in der Dokumentation.
Beispielcode¶
Eingabecode:¶
REPLACE VIEW VIEWWITHOPTIONTEST AS
LOCKING ROW FOR ACCESS
SELECT
*
FROM SOMETABLE
WHERE app_id = 'SUPPLIER'
WITH CHECK OPTION;
Generierter Code:¶
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
;
Best Practices¶
Wenn Sie weitere Unterstützung benötigen, können Sie uns eine E-Mail an snowconvert-support@snowflake.com senden.
SSC-FDM-TD0007¶
Variant-Spalte unterstützt keine Sortierung.
Beschreibung¶
Diese Nachricht wird angezeigt, wenn SnowConvert AI einen Variant-Datentyp in der Transformation eines Codes eine COLLATE-Klausel enthält. COLLATE wird mit dem Datentyp VARIANT nicht unterstützt. Deshalb wird es entfernt und eine Nachricht wird hinzugefügt.
Beispielcode¶
Eingabecode:¶
-- Additional Params: --useCollateForCaseSpecification
CREATE TABLE TableExample
(
ColumnExample JSON(2500) NOT CASESPECIFIC
)
Generierter Code:¶
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"}}'
;
Der Datentyp JSON wird in VARIANT konvertiert, während NOT CASESPECIFIC in eine COLLATE-Klausel konvertiert wird.
Best Practices¶
Es sind keine weiteren Aktionen des Benutzers erforderlich.
Wenn Sie weitere Unterstützung benötigen, können Sie uns eine E-Mail an snowconvert-support@snowflake.com senden.
SSC-FDM-TD0008¶
Wenn der vierte Parameter NVP_UDF nicht literaler Text ist und einen Backslash enthält, muss dieser Backslash maskiert werden.
Beschreibung¶
Bei Trennzeichen, die keine literalen Trennzeichen enthalten, muss der Backslash in Snowflake maskiert werden.
Beispielcode¶
Eingabecode¶
SELECT NVP('store = whole foods&&store: ?Bristol farms','store', '&&', valueDelimiter, 2);
Generierter Code¶
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 ***/;
Best Practices¶
Wenn Sie weitere Unterstützung benötigen, können Sie uns eine E-Mail an snowconvert-support@snowflake.com senden.
SSC-FDM-TD0009¶
Konvertiert von Ganzzahl in Varchar für den aktuellen Sitzungsstandard.
Beschreibung¶
Diese Nachricht wird angezeigt, wenn SnowConvert AI eine DEFAULT SESSION findet und der Datentyp NOT VARCHAR ist. Wenn dies der Fall ist, wird der Datentyp in VARCHAR geändert und es wird eine Nachricht hinzugefügt.
Codebeispiel¶
Eingabecode:¶
CREATE TABLE TableExample
(
ColumnExample INTEGER DEFAULT SESSION,
ColumnExample2 VARCHAR DEFAULT SESSION
)
Generierter Code:¶
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"}}'
;
Beispiel: Beachten Sie, dass ColumnExample einen Datentyp-INTEGER mit DEFAULT SESSION hat. Da der Datentyp nicht VARCHARist, wird er in der Ausgabe in VARCHAR umgewandelt.
Der Datentyp von ColumnExample2 hat sich nicht geändert, da er bereits VARCHAR ist.
Best Practices¶
Es sind keine weiteren Aktionen des Benutzers erforderlich.
Wenn Sie weitere Unterstützung benötigen, können Sie uns eine E-Mail an snowconvert-support@snowflake.com senden.
SSC-FDM-TD0010¶
Tabellenspalten zwischen Tabellen (Teradata) DBC.COLUMNSV and INFORMATION_SCHEMA.COLUMNS (SnowFlake). Aber einige Spalten stimmen in Snowflake möglicherweise nicht genau überein.
Beschreibung¶
Verwendungen der Tabelle DBC.COLUMNSV in Teradata werden in INFORMATION_SCHEMA.COLUMNS konvertiert, aber einige Spalten haben möglicherweise keine exakte Entsprechung in SnowFlake. Das bedeutet, dass es einige Spalten in Teradata gibt, für die es kein Äquivalent in SnowFlake gibt. Es gibt andere, die zwar eine übereinstimmende Spalte haben, aber der Inhalt nicht genau derselbe ist.
.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
Beachten Sie zum Beispiel, dass es in SnowFlake keine entsprechende Spalte für „ColumnFormat“ gibt, und beachten Sie auch, dass „DATA_TYPE“ offenbar der Entsprechung der Spalte „ColumnType“ in Teradata entspricht, sich deren Inhalte jedoch deutlich unterscheiden.
Codebeispiel¶
Eingabecode:¶
SELECT columnname FROM dbc.columnsV WHERE tablename = 'TableN';
Generierter Code:¶
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'));
Best Practices¶
Überprüfen Sie, welche Spalten in Teradata verwendet wurden und prüfen Sie, ob der in SnowFlake verfügbare Inhalt Ihren Anforderungen entspricht.
Wenn Sie weitere Unterstützung benötigen, können Sie uns eine E-Mail an snowconvert-support@snowflake.com senden.
SSC-FDM-TD0011¶
Unicode BMP-Escape wird nicht unterstützt.
Beschreibung¶
Snowflake unterstützt kein Unicode-BMP, daher wird diese Nachricht angezeigt, wenn SnowConvert AI einen Teradata-Unicode Delimited Character Literal mit Unicode-BMP-Escape nach Snowflake transformiert.
Beispielcode¶
Eingabecode:¶
SELECT U&'hola #+005132 mundo' UESCAPE '#';
Generierter Code:¶
SELECT
--** SSC-FDM-TD0011 - UNICODE BMP IS NOT SUPPORTED IN SNOWFLAKE **
'hola \u+005132 mundo';
Best Practices¶
Prüfen Sie, ob ein Unicode-Äquivalent vorhanden ist.
Wenn Sie weitere Unterstützung benötigen, können Sie uns eine E-Mail an snowconvert-support@snowflake.com senden.
SSC-FDM-TD0012¶
Ungültiger Standardwert.
Bemerkung
Diese FDM ist veraltet. Weitere Informationen finden Sie unter [SSC-EWI-TD0006.
Beschreibung¶
Die Spaltenspezifikationen DEFAULT TIME / DEFAULT DATE / DEFAULT CURREN_DATE / DEFAULT DEFAULT CURRENT_TIME / DEFAULT CURRENT_TIMESTAMP werden für den Datentyp FLOAT nicht unterstützt.
Beispielcode¶
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"}}'
;
Best Practices¶
Es sind keine weiteren Aktionen des Benutzers erforderlich.
Wenn Sie weitere Unterstützung benötigen, können Sie uns eine E-Mail an snowconvert-support@snowflake.com senden.
SSC-FDM-TD0013¶
Der Snowflake-Fehlercode stimmt nicht mit dem ursprünglichen Teradata-Fehlercode überein.
Beschreibung¶
Diese Nachricht wird angezeigt, weil der in der integrierten Variable BTEQ ERRORCODE gespeicherte Fehlercode in Snowflake Scripting möglicherweise nicht derselbe ist.
Beispielcode¶
Eingabecode:¶
SELECT * FROM table1;
.IF ERRORCODE<>0 THEN .EXIT 1
.QUIT 0
Generierter Code:¶
-- 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
$$
Best Practices¶
Wenn Sie weitere Unterstützung benötigen, können Sie uns eine E-Mail an snowconvert-support@snowflake.com senden.
SSC-FDM-TD0014¶
Inkonsistenz bei der Dateiausführung
Beschreibung¶
Diese EWI wird angezeigt, wenn der migrierte Code ein BTEQ-Satz ist, der eine Umgebungsdatei mit SQL-Anweisungen ausführt, z. B. $(<$INPUT_SQL_FILE). Der Unterschied zwischen der BTEQ-Ausführung und dem durch Python generierten Code besteht darin, dass BTEQ mit den anderen Anweisungen in der Datei weitermacht, wenn eine davon fehlschlägt, während die Python-Ausführung stoppt, sobald ein Fehler auftritt.
Beispielcode¶
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()
Best Practices¶
Wenn Sie weitere Unterstützung benötigen, können Sie uns eine E-Mail an snowconvert-support@snowflake.com senden.
SSC-FDM-TD0015¶
Die Funktion Regexp_Substr unterstützt nur reguläre POSIX-Ausdrücke.
Bemerkung
Diese FDM ist veraltet. Weitere Informationen finden Sie unter SSC-EWI-0009.
Beschreibung¶
Derzeit gibt es in Snowflake keine Unterstützung für erweiterte reguläre Ausdrücke über die POSIX-Basic-Regular-Expression-Syntax hinaus.
Diese EWI wird jedes Mal hinzugefügt, wenn ein Funktionsaufruf zu REGEX_SUBSTR, REGEX_REPLACE, oder REGEX_INSTR in SnowFlake transformiert wird, um den Benutzer vor möglicherweise nicht unterstützten regulären Ausdrücken zu warnen. Einige der nicht unterstützten Funktionen sind Lookahead, Lookbehind und nicht erfassende Gruppen.
Beispielcode¶
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);
Best Practices¶
Überprüfen Sie den jeweils verwendeten regulären Ausdruck, um festzustellen, ob er ein manuelles Eingreifen erforderlich ist. Weitere Informationen über erweiterten Regex-Support und Alternativen in SnowFlake finden Sie hier.
Wenn Sie weitere Unterstützung benötigen, können Sie uns eine E-Mail an snowconvert-support@snowflake.com senden.
SSC-FDM-TD0016¶
Der Wert „l“ für den Parameter „match_arg“ wird in Snowflake nicht unterstützt.
Beschreibung¶
In Teradata haben Funktionen wie REGEX_SUBSTR, REGEX_REPLACE oder REGEX_INSTR einen Parameter namens match_arg – ein Zeichenargument mit den folgenden gültigen Werten:
'i': Abgleich ohne Berücksichtigung der Groß-/Kleinschreibung'c': Abgleich, bei dem zwischen Groß-/Kleinschreibung unterschieden wird'n': Das Punktzeichen (entspricht einem beliebigen Zeichen) kann mit dem Zeilenumbruchzeichen übereinstimmen.'m': Die Quellzeichenfolge wird als mehrere Zeilen behandelt, anstatt als eine einzelne Zeile.'l': Wenn source_string die derzeit maximal zulässige source_string-Größe (derzeit 16 MB) überschreitet, wird statt eines Fehlers NULL zurückgegeben.'x': ignoriert Leerzeichen (beeinflusst nur die Musterzeichenfolge).
Das Argument kann mehr als ein Zeichen enthalten.
In Snowflake ist das entsprechende Argument für diese Funktionen regexp_parameters.A st eine Zeichenfolge aus einem oder mehreren Zeichen, die die für die Mustersuche verwendeten regulären Ausdrucksparameter angibt. Folgende Werte werden unterstützt:
c: Groß-/Kleinschreibung wird berücksichtigt.i: Groß-/Kleinschreibung wird nicht berücksichtigt.m: Mehrzeiliger Modus.e: Teilübereinstimmungen werden extrahiert.s: der Platzhalter stimmt auch mit dem Zeilenumbruchzeichen überein.
Wie zu sehen ist, sind die Werte 'i', 'c', 'm' in beiden Sprachen gleich und der 'n'-Wert in Teradata ist 's' zugeordnet. Allerdings haben die Werte 'l', 'x' kein gleichwertiges Gegenstück.
Für den Wert 'x' wird die Funktionalität repliziert, indem ein Aufruf der REGEXP_REPLACE-Funktion erzeugt wird. Die'l'-Parameter kann nicht repliziert werden, daher wird diese Warnung für diese Fälle generiert.
Eingabecode:¶
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');
Generierter Code:¶
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);
Best Practices¶
Wenn Sie weitere Unterstützung benötigen, können Sie uns eine E-Mail an snowconvert-support@snowflake.com senden.
SSC-FDM-TD0017¶
Die Verwendung von Fremdtabellen wird in Snowflake nicht unterstützt.
Bemerkung
Diese FDM ist veraltet. Weitere Informationen finden Sie unter SSC-EWI-TD0076.
Beschreibung¶
[Fremdtabellen] (https://docs.teradata.com/r/Teradata-VantageTM-SQL-Data-Definition-Language-Syntax-and-Examples/September-2020/Table-Statements/CREATE-FOREIGN-TABLE) ermöglichen den Zugriff auf Daten in externem Objektspeicher, wie zum Beispiel semi-strukturierte und unstrukturierte Daten in Amazon S3, Azure Blob Storage und Google Cloud Storage. Diese Syntax wird von Snowflake nicht unterstützt. Es gibt in Snowflake jedoch auch andere Alternativen, die stattdessen verwendet werden können, wie z. B. externe Tabellen, Iceberg-Tabellen und Standardtabellen.
Beispielcode¶
Eingabecode:¶
SELECT cust_id, income, age FROM
FOREIGN TABLE (SELECT cust_id, income, age FROM twm_customer)@hadoop1 T1;
Generierter Code:¶
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;
Best Practices¶
Anstelle von Fremdtabellen in Teradata können Sie Externe Snowflake-Tabellen verwenden. Externe Tabellen verweisen auf Datendateien in einem Data Lake-Cloudspeicher (Amazon S3, Google Cloud Storage oder Microsoft Azure). Dies ermöglicht das Abfragen von Daten, die in Dateien in einem Data Lake gespeichert sind, als befänden sie sich in einer Datenbank. Externe Tabellen können auf Daten zugreifen, die in einem beliebigen von [COPY INTO <table>]- Anweisungen (https://docs.snowflake.com/en/sql-reference/sql/copy-in-table.html) unterstützten Format gespeichert sind.
Eine weitere Alternative sind Iceberg-Tabellen von Snowflake. Sie können sich also Iceberg-Tabellen als Tabellen vorstellen, die offene Formate und vom Kunden bereitgestellte Cloud-Speicher verwenden. Diese Daten werden in Parquet-Dateien gespeichert.
Schließlich gibt es noch die Snowflake-Standardtabellen, die eine Option sein können, um die Funktionalität von Fremdtabellen in Teradata abzudecken
Wenn Sie weitere Unterstützung benötigen, können Sie uns eine E-Mail an snowconvert-support@snowflake.com senden.
SSC-FDM-TD0018¶
JSON-Pfad wurde nicht erkannt
Bemerkung
Diese FDM ist veraltet. Weitere Informationen finden Sie unter SSC-EWI-TD0063.
Beschreibung¶
Diese Meldung wird angezeigt, wenn SnowConvert AI einen JSON-Pfad nicht deserialisieren kann, da die Zeichenfolge nicht das erwartete Format hat oder in Snowflake nicht unterstützt wird.
Beispielcode¶
Eingabecode:¶
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);
Generierter Code:¶
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);
Best Practices¶
Prüfen Sie, ob der JSON-Pfad ein unerwartetes Zeichen enthält oder nicht das richtige Format hat.
Wenn Sie weitere Unterstützung benötigen, können Sie uns eine E-Mail an snowconvert-support@snowflake.com senden.
SSC-FDM-TD0019¶
Transaktions- und Profilebene-Query-Tags werden in Snowflake nicht unterstützt; stattdessen wird auf den Session-Query-Tag verwiesen.
Beschreibung¶
Teradata ermöglicht es Benutzern, Query Bands auf Transaktions-, Sitzungs- und Profilebene zu definieren sowie sie mit Funktionen wie GetQueryBandValue abzufragen.
Snowflake-Äquivalent für Abfrage-Bänder ist der Parameter query_tag, der für Sitzung, Benutzer oder Konto festgelegt werden kann. Außerdem hat Snowflake keine Profile.
Aufgrund dieser Unterschiede wurde diese FMD hinzugefügt, um den Benutzer darüber zu informieren, dass Abfrage-Tags auf Transaktions- oder Profilebene weder definiert noch in Snowflake konsultiert werden können und dass Abfrage-Tags auf Sitzungsebene als Ersatz verwendet werden, was in einigen Fällen zu Funktionsunterschieden führen kann.
Beispielcode¶
Eingabecode:¶
SELECT GETQUERYBANDVALUE(3, 'account');
Generierter Code¶
SELECT
--** SSC-FDM-TD0019 - TRANSACTION AND PROFILE LEVEL QUERY TAGS NOT SUPPORTED IN SNOWFLAKE, REFERENCING SESSION QUERY TAG INSTEAD **
GETQUERYBANDVALUE_UDF('account');
Best Practices¶
Ändern Sie Ihre Codelogik, um Abfragebereiche auf Sitzungsebene zu verwenden.
Wenn Sie weitere Unterstützung benötigen, können Sie uns eine E-Mail an snowconvert-support@snowflake.com senden.
SSC-FDM-TD0020¶
JSON-Wert wurde aufgrund eines ungültigen Formats nicht erkannt
Bemerkung
Einige Teile des Ausgabecodes wurden aus Gründen der Übersichtlichkeit weggelassen.
Beschreibung¶
Diese Meldung wird angezeigt, wenn SnowConvert AI JSON-Daten für einen Transformationskontext deserialisieren muss, der JSON-Wert jedoch nicht das erwartete Format hatte oder kein gültiger JSON-Wert ist.
Beispielcode¶
Eingabecode:¶
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);
Generierter Code:¶
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;
Best Practices¶
Stellen Sie sicher, dass der JSON-Wert das erwartete Format gemäß der Teradata-Grammatik hat.
Wenn Sie weitere Unterstützung benötigen, können Sie uns eine E-Mail an snowconvert-support@snowflake.com senden.
SSC-FDM-TD0021¶
Der integrierte Verweis auf {0} wird in Snowflake nicht unterstützt.
Bemerkung
Diese EWI ist veraltet. Weitere Informationen finden Sie unter SSC-EWI-TD0046.
Beschreibung¶
Dieser Fehler tritt auf, wenn eine Abfrage ausgeführt wird, die auf die Tabelle DBC.DATABASES verweist und die ausgewählte Spalte in Snowflake keine Entsprechung hat.
Beispielcode¶
Eingabe:¶
CREATE VIEW SAMPLE_VIEW
AS
SELECT PROTECTIONTYPE FROM DBC.DATABASES;
Ausgabe:¶
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;
Best Practices¶
Wenn Sie weitere Unterstützung benötigen, können Sie uns eine E-Mail an snowconvert-support@snowflake.com senden.
SSC-FDM-TD0022¶
Shell-Variablen gefunden; die Ausführung dieses Codes muss in einem Shell-Skript erfolgen.
Beschreibung¶
In Teradata-Skripten werden Shell-Variablen verwendet, um temporäre Werte zu speichern, die im gesamten Skript abgerufen und verändert werden können. Shell-Variablen werden mit dem Dollarzeichen ($) gefolgt von einem Namen (der in geschweifte Klammern gesetzt werden kann) definiert, und ihre Werte können mit dem Zuweisungsoperator (=) gesetzt werden.
#!/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
Sie können sich Shell-Variablen vorstellen, die die gleiche oder eine ähnliche Funktion wie die Zeichenfolgen-Interpolation haben. Daher ist es wichtig, diese Funktionalität bei der Transformation beizubehalten.\ \ Bei der Konvertierung von Skripten in Python behalten Shell-Variablen ihre Funktionalität bei, indem sie den konvertierten Code in einem Shell-Skript (.sh-Datei) ausführen. Aus diesem Grund müssen diese Shell-Variablen das gleiche Format haben wie der Eingabecode.
Beispielcode¶
Eingabecode:¶
SELECT $column FROM ${tablename}
Generierter Code¶
#*** 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()
Best Practices¶
Die Ausführung des konvertierten Codes in einem Shell-Skript ist erforderlich.
Wenn Sie weitere Unterstützung benötigen, können Sie uns eine E-Mail an snowconvert-support@snowflake.com senden.
SSC-FDM-TD0023¶
Zeichenfolgenähnlichkeit kann ein anderes Verhalten aufweisen.
Beschreibung¶
Diese FDM wird angezeigt, wenn SnowConvert AI die Similarity Function von Teradata in Snowflake transformiert. Dies deutet darauf hin, dass die Ergebnisse ein anderes Verhalten aufweisen könnten.
Beispielcode¶
Die folgenden Daten dienen als Beispiel:
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 |
Eingabecode:¶
Abfrage¶
-- 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;
Ergebnis¶
| 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 |
Generierter Code¶
Abfrage¶
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;
Ergebnis¶
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 |
Best Practices¶
Wenn Sie weitere Unterstützung benötigen, können Sie uns eine E-Mail an snowconvert-support@snowflake.com senden.
SSC-FDM-TD0024¶
Die Set Table-Funktion wird nicht unterstützt.
Beschreibung¶
Diese EWI wird angezeigt, wenn SnowConvert AI Create Table mit der SET-Option findet. Da SET TABLE in Snowflake nicht unterstützt wird, wird es entfernt.
Beispielcode¶
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
);
Best Practices¶
Wenn Sie weitere Unterstützung benötigen, können Sie uns eine E-Mail an snowconvert-support@snowflake.com senden.
SSC-FDM-TD0025¶
Teradata Database Temporal Table wird von Snowflake nicht unterstützt.
Beschreibung¶
[Teradata Database Temporal Support] (https://docs.teradata.com/r/0TSAVrLIwk23SLHbA4nUvQ/root) umfasst die Erstellung von temporalen Tabellen sowie temporalen DDL- und DML-Objekten. Die Unterstützung von temporären (zeitbezogenen) Tabellen und Daten wird in Snowflake nicht unterstützt, da es kein absolutes Äquivalent gibt.
Alle diese Anweisungen werden von SnowConvert AI erkannt (geparst), aber um die Abfragen in Snowflake auszuführen, werden diese Elemente im Übersetzungsprozess entfernt.
Es ist erwähnenswert, dass in Fällen, in denen eine abort-Anweisung vorkommt, diese in einen Delete-Befehl umgewandelt wird, um die funktionale Äquivalenz beizubehalten. Dies ermöglicht es, während einer Transaktion durchgeführte Operationen rückgängig zu machen und die Datenbank in den Zustand zurückzuversetzen, den sie zu Beginn hatte.
Beispielcode¶
Das folgende Beispiel zeigt, wie ein temporärer Select-Typ in einen üblichen Select-Typ übersetzt wird.
Eingabecode:¶
SEQUENCED VALIDTIME
SELECT
Policy_ID,
Customer_ID
FROM Policy
WHERE Policy_Type = 'AU';
Generierter Code:¶
----** 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'));
Fall, in dem der Abort-Befehl im Kontext einer Transaktion verwendet wird.
Eingabecode:¶
CREATE OR REPLACE PROCEDURE TEST.ABORT_STATS()
BEGIN
CURRENT VALIDTIME AND NONSEQUENCED TRANSACTIONTIME ABORT
FROM table_1
WHERE table_1.x1 = 1;
END;
Generierter Code:¶
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;
$$;
¶
Best Practices¶
Es sind keine weiteren Aktionen des Benutzers erforderlich.
Wenn Sie weitere Unterstützung benötigen, können Sie uns eine E-Mail an snowconvert-support@snowflake.com senden.
SSC-FDM-TD0026¶
GOTO-Anweisung wurde aufgrund von Anweisungsinversion entfernt.
Bemerkung
Einige Teile des Ausgabecodes wurden aus Gründen der Übersichtlichkeit weggelassen.
Beschreibung ¶
Es ist üblich, den GOTO-Befehl zusammen mit IF- und LABEL-Befehlen zu verwenden, um die Funktionalität einer SQL-If-Anweisung nachzubilden. Bei dieser Verwendung ist es möglich, sie direkt in eine if-, if-else- oder sogar eine if-elseif-else-Anweisung umzuwandeln. In diesen Fällen sind jedoch die GOTO-Befehle unnötig und sollten entfernt werden, um zu verhindern, dass sie durch einen LABEL-Abschnitt ersetzt werden.
Beispielcode ¶
Eingabecode:
-- Additional Params: --scriptsTargetLanguage SnowScript
.If ActivityCount = 0 THEN .GOTO endIf
DROP TABLE TABLE1;
.Label endIf
SELECT A FROM TABLE1;
Ausgabecode
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
$$
Best Practices ¶
Wenn Sie weitere Unterstützung benötigen, können Sie uns eine E-Mail an snowconvert-support@snowflake.com senden.
SSC-FDM-TD0027¶
TD_UNPIVOT-Transformation erfordert Spalteninformationen, die nicht gefunden werden konnten, da Spalten im Ergebnis fehlen.
Bemerkung
Diese FDM ist veraltet. Weitere Informationen finden Sie unter SSC-EWI-TD0061.
Beschreibung¶
SnowConvert AI unterstützt und transformiert die TD_UNPIVOT-Funktion, die verwendet werden kann, um Spalten einer Tabelle als Zeilen darzustellen.
Diese Transformation erfordert jedoch Informationen zu den funktionierenden Tabellenspalten, insbesondere die Namen der Spalten. Wenn diese Informationen nicht vorhanden sind, kann die Transformation in einem unvollständigen Zustand verbleiben, in dem Spalten im Ergebnis fehlen, diese EWI wird in diesen Fällen erzeugt.
Beispielcode¶
Eingabecode:¶
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;
Generierter Code:¶
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;
Best Practices¶
Es gibt zwei Möglichkeiten, dem Konvertierungstool die Informationen über Spalten bereitzustellen: Speichern Sie die Tabellenspezifikation in derselben -Datei wie den TD_UNPIVOT-Aufruf, oder geben Sie eine Spaltenliste in der SELECTAbfrage des ON-Ausdrucks an – anstelle von SELECT * oder dem Tabellennamen.
Dieses Problem kann ignoriert werden, wenn ALL Spalten aus der Eingabetabelle(n) nicht pivotiert werden, da im Ergebnis sonst Spalten fehlen.
Wenn Sie weitere Unterstützung benötigen, können Sie uns eine E-Mail an snowconvert-support@snowflake.com senden.
SSC-FDM-TD0028¶
JSON_TABLE nicht transformiert; Spaltennamen konnten nicht aus den semantischen Informationen abgerufen werden
Bemerkung
Diese FDM ist veraltet. Weitere Informationen finden Sie unter SSC-EWI-TD0060.
Beschreibung¶
Die JSON_TABLE-Funktion kann von SnowConvert AI transformiert werden, jedoch erfordert diese Transformation, dass die Namen der Spalten bekannt sind, die in der JSON_TABLE ON-Unterabfrage ausgewählt werden.
Diese Nachricht wird erzeugt, um den Benutzer darauf hinzuweisen, dass die Spaltennamen nicht explizit in der Unterabfrage angegeben wurden (zum Beispiel wurde SELECT * verwendet) und die semantischen Informationen der referenzierten Tabellen nicht gefunden wurden, sodass die Spaltennamen nicht extrahiert werden konnten.
Beispielcode¶
Eingabecode:¶
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;
Generierter Code:¶
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;
Best Practices¶
Bitte überprüfen Sie, ob der an SnowConvert AI übergebene Code vollständig ist. Falls Sie die Tabellendefinition nicht angegeben haben, führen Sie den Code bitte erneut aus, diesmal mit vorhandener Tabellendefinition.
Wenn Sie weitere Unterstützung benötigen, können Sie uns eine E-Mail an snowconvert-support@snowflake.com senden.
SSC-FDM-TD0029¶
Von Snowflake unterstützte Formate für TO_CHAR unterscheiden sich von Teradata und können fehlschlagen oder ein anderes Verhalten aufweisen.
Formatierungselemente, die von Sitzungsparametern abhängen¶
Einige Elemente des Teradata-Formats werden Snowflake-Funktionen zugeordnet, die vom Wert der Sitzungsparameter abhängen. Um funktionale Unterschiede in den Ergebnissen zu vermeiden, sollten Sie diese Sitzungsparameter auf dieselben Werte setzen, die sie auch in Teradata haben. Identifizierte Formatelemente, die dieser Art von Funktionen zugeordnet sind:
D: Abgebildet auf die
DAYOFWEEK-Funktion hängen die Ergebnisse dieser Funktion vomWEEK_START-Sitzungsparameter ab. Standardmäßig betrachtet Teradata den Sonntag als ersten Wochentag, während es in Snowflake der Montag ist.WW: Abgebildet auf die
WEEK-Funktion hängt diese Funktion vom SitzungsparameterWEEK_OF_YEAR_POLICYab, der standardmäßig so eingestellt ist, dass er den ISO-Standard verwendet (die erste Woche des Jahres ist diejenige, die mindestens vier Tage des Januars enthält). In Teradata hingegen gilt der 1. Januar als Beginn der ersten Woche.
Um Sitzungsparameter zu ändern, verwenden Sie ALTER SESSION SET parameter_name = value. Weitere Informationen zu Sitzungsparametern finden Sie auf [dieser Seite] (https://docs.snowflake.com/en/sql-reference/parameters.html).
Ein-Parameter-Version von TO_CHAR¶
Die einparametrige Version von TO_CHAR(Datetime) verwendet die in den Sitzungsparametern angegebenen Standardformate TIMESTAMP_LTZ_OUTPUT_FORMAT, TIMESTAMP_NTZ_OUTPUT_FORMAT, TIMESTAMP_TZ_OUTPUT_FORMAT und TIME_OUTPUT_FORMAT. Um Unterschiede in der Verhaltensweise zu vermeiden, stellen Sie diese auf dieselben Werte ein, die auch in Teradata verwendet werden.
Für TO_CHAR(Numeric) erzeugt Snowflake die VARCHAR-Darstellung entweder mit dem TM9- oder TME-Format, um eine kompakte Repräsentation der Zahl zu erhalten. Teradata erzeugt ebenfalls kompakte Darstellungen der Zahlen, daher ist keine weitere Aktion erforderlich.
Beispielcode¶
Eingabecode:¶
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);
Generierter Code:¶
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 ***/;
Best Practices¶
Wenn Sie FF verwenden, versuchen Sie entweder, DateTime-Typen mit derselben Genauigkeit zu verwenden wie in Teradata, oder fügen Sie dem Formatelement eine Genauigkeitsangabe hinzu, um unterschiedliches Verhalten zu vermeiden.
Verwenden Sie bei der Nutzung von Zeitzonen-bezogenen Formatelementen den ersten Parameter vom Typ
TIMESTAMP_TZ, um unterschiedliches Verhalten zu vermeiden. Denken Sie auch daran, dass derTIME-Typ in Snowflake keine Zeitzoneninformationen enthalten kann.Legen Sie die erforderlichen Sitzungsparameter mit den Standardwerten aus Teradata fest, um unterschiedliches Verhalten zu vermeiden.
Wenn Sie weitere Unterstützung benötigen, können Sie uns eine E-Mail an snowconvert-support@snowflake.com senden.
SSC-FDM-TD0030¶
Am Ende des Label-Abschnitts wurde eine Rückgabeanweisung hinzugefügt, um den gleichen Ausführungsablauf sicherzustellen.
Beschreibung¶
Wenn eine Goto-Anweisung durch einen Label-Abschnitt ersetzt wird und dieser keinen Return-Befehl enthält, wird am Ende des Abschnitts einer hinzugefügt, um denselben Ausführungsfluss sicherzustellen.
BTEQ nachdem ein Goto-Befehl ausgeführt wurde, werden die Anweisungen zwischen dem Goto-Befehl und dem Label-Befehl mit demselben Namen ignoriert. Um die Ausführung dieser Anweisungen zu vermeiden, sollte der Beschriftungsabschnitt also eine Rückgabeanweisung enthalten.
Darüber hinaus ist es Wert, dass der Goto-Befehl alle anderen Anweisungen überspringt, mit Ausnahme des Labels mit demselben Namen, das den Zeitpunkt angibt, an dem die Ausführung fortgesetzt wird. Daher wird die Ausführung niemals in einem Label-Abschnitt fortgesetzt, der vor dem Goto-Befehl definiert ist.
Beispielcode¶
Eingabecode:¶
-- Additional Params: --scriptsTargetLanguage SnowScript
.LOGON dbc,dbc;
select 'STATEMENTS';
.GOTO LABEL_B
select 'IGNORED STATEMENTS';
.label LABEL_B
select 'LABEL_B STATEMENTS';
Generierter Code¶
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
$$
Best Practices¶
Wenn Sie weitere Unterstützung benötigen, können Sie uns eine E-Mail an snowconvert-support@snowflake.com senden.
SSC-FDM-TD0031¶
ST_DISTANCE-Ergebnisse unterscheiden sich leicht von ST_SPHERICALDISTANCE
Beschreibung¶
Die Teradata-Funktion ST_SPHERICALDISTANCE berechnet die Entfernung zwischen zwei sphärischen Koordinaten auf dem Planeten mithilfe der Haversine-Formel. Die Snowflake-ST_DISTANCE-Funktion verwendet hingegen nicht die Haversine-Formel, um die Mindestentfernung zwischen zwei geografischen Punkten zu berechnen.
Beispielcode¶
Eingabecode:¶
--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;
Teradata-Ausgabe¶
location1 |
location2 |
Distance_In_Km |
|---|---|---|
POINT (-73.989308 40.741895) |
POINT (40.741895 34.053691) |
9351139,978062356 |
Generierter Code¶
--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;
Snowflake-Ausgabe¶
LOCATION1 |
LOCATION2 |
DISTANCE_IN_KM |
|---|---|---|
{ „coordinates“: [ -73.989308, 40.741895 ], „type“: „Point“ } |
{ „coordinates“: [ 40.741895, 34.053691 ], „type“: „Point“ } |
9351154,65572674 |
Best Practices¶
Wenn Sie weitere Unterstützung benötigen, können Sie uns eine E-Mail an snowconvert-support@snowflake.com senden.
SSC-FDM-TD0032¶
CASESPECIFIC-Klausel wurde aus dem LIKE-Ausdruck entfernt.
Bemerkung
Einige Teile des Ausgabecodes wurden aus Gründen der Übersichtlichkeit weggelassen.
Beschreibung¶
Dieser Fehler tritt auf, wenn der LIKE-Ausdruck von der Klausel [NOT] CASESPECIFIC unterstützt wird.
Beispielcode¶
Eingabecode:¶
SELECT * FROM MY_TABLE
WHERE Name Like 'Marco%' (NOT CASESPECIFIC);
Generierter Code¶
SELECT
* FROM
MY_TABLE
WHERE Name ILIKE 'Marco%' /*** SSC-FDM-TD0032 - NOT CASESPECIFIC CLAUSE WAS REMOVED ***/;
Best Practices¶
Groß-/Kleinschreibung in TERADATA hängt von der TMODE-Systemkonfiguration ab.
Wenn Sie weitere Unterstützung benötigen, können Sie uns eine E-Mail an snowconvert-support@snowflake.com senden.
SSC-FDM-TD0033¶
ACTIVITY_COUNT-Transformation kann manuelle Anpassungen erfordern
Beschreibung¶
Die ACTIVITY_COUNT-Statusvariable gibt die Anzahl der Zeilen zurück, die von einer SQL DML-Anweisung in einer eingebetteten SQL- oder Stored-Procedure-Anwendung betroffen sind. Weitere Informationen erhalten Sie hier.
Wie in der Übersetzungsspezifikation erläutert, gibt es eine Problemumgehung, um das Verhalten von ACTIVITY_COUNT zu emulieren.
SELECT $1 FROM TABLE(RESULT_SCAN(LAST_QUERY_ID()));
Dies ist jedoch mit einigen Einschränkungen verbunden, die unten aufgeführt sind.
Einschränkungen ¶
Erster Fall¶
Wenn ACTIVITY_COUNT zwei- oder mehrmals aufgerufen wird, bevor eine andere DML-Anweisung ausgeführt wird, gibt die Transformation möglicherweise nicht die erwarteten Werte zurück.
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;
$$;
In beiden Prozeduren wird ACTIVITY_COUNT zweimal aufgerufen, bevor eine weitere DML-Anweisung ausgeführt wird. In Teradata gibt ACTIVITY_COUNT die Anzahl der Zeilen in der darüberstehenden INSERT-Anweisung zurück, selbst wenn es zweimal aufgerufen wird. Da die Snowflake-Transformation LAST_QUERY_ID() verwendet, hängt das Ergebnis vom Resultset ab, das von LAST_QUERY_ID() gehalten wird.
InsertEmployeeSalaryAndLog_1() erfordert keine manuellen Anpassungen.. Überprüfen des Abfrageverlaufs (von unten nach oben):
.png)
Query History when calling InsertEmployeeSalaryAndLog_1()
INSERT-Anweisung wird ausgeführt.LAST_QUERY_ID()verweist auf diese Anweisung.SELECT(zuerst wirdACTIVITY_COUNT) ausgeführt und$1wird1.LAST_QUERY_ID()verweist auf diese Anweisung.SELECT(als zweites wirdACTIVITY_COUNT) ausgeführt; da das letzte -Anweisungsergebnis1war, wird$1zu1für diesenSELECT-Wert.row_count1enthält diesen Wert1, der inactivity_logeingegeben wird.
InsertEmployeeSalaryAndLog_2() erfordert hingegen manuelle Anpassungen. Überprüfen des Abfrageverlaufs (von unten nach oben):
.png)
Query History when calling InsertEmployeeSalaryAndLog_2()
INSERT-Anweisung wird ausgeführt.LAST_QUERY_ID()verweist auf diese Anweisung.SELECT (zuerst wird
ACTIVITY_COUNT) ausgeführt und$1wird zu1. Beachten Sie jedoch, dassQUERY_TEXT+ 10enthält; dies wirkt sich auf das Ergebnis aus, das gescannt wird.LAST_QUERY_ID()wird auf diese Anweisung verweisen.SELECT(zweitens wirdACTIVITY_COUNT) ausgeführt. Das Ergebnis der letzten Abfrage ist11;$1enthält11statt der erwarteten1.row_count1enthält diesen Wert11, der inactivity_logeingegeben wird.
Dies sind die Werte, die in activity_log eingefügt werden:
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 |
Anpassungen für den ersten Fall¶
Gemäß der Snowflake-Dokumentation für [LAST_QUERY_ID] (https://docs.snowflake.com/en/sql-reference/functions/last_query_id) können Sie die zurückzugebende Abfrage anhand ihrer Position angeben. LAST_QUERY_ID(-1) gibt die letzte Abfrage zurück, (-2) die vorletzte Abfrage und so weiter.
Die Lösung für das Problem in InsertEmployeeSalaryAndLog_2() besteht einfach darin, LAST_QUERY_ID(-2) beim zweiten Aufruf von ACTIVITY_COUNT (zweiter SELECT) anzugeben, sodass die Ergebnisse stattdessen aus der INSERT-Anweisung abgerufen werden:
...
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 ***/;
...
Zweiter Fall¶
Wenn ACTIVITY_COUNT nach einer Non-DML-Anweisung ausgeführt wurde, gibt die Transformation nicht die erwarteten Werte zurück.
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;
$$;
Ähnlich wie zuvor verweist LAST_QUERY_ID nicht auf die richtige Abfrage und gibt daher einen falschen Wert zurück, der row_count1 zugewiesen wird. Überprüfen des Abfrageverlaufs (von unten nach oben):
.png)
Query History when calling InsertEmployeeSalaryAndLog_3()
INSERT-Anweisung wird ausgeführt.LAST_QUERY_ID()verweist auf diese Anweisung.SELECT INTOwird ausgeführt, und $1 wird zu 101.LAST_QUERY_ID()zeigt auf diese Anweisung.SELECT(ACTIVITY_COUNT) wird ausgeführt. Das Ergebnis der letzten Abfrage ist101;$1enthält101statt der erwarteten 1.row_count1enthält diesen Wert101, der inactivity_logeingegeben wird.
Dies sind die Werte, die in activity_log eingefügt werden:
LOG_ID |
OPERATION |
ROW_COUNT |
LOG_TIMESTAMP |
|---|---|---|---|
1 |
EMPLOYEE INSERTED - ID: 101 |
101 |
2024-07-15 11:00:38.000 |
Anpassungen für den zweiten Fall¶
Eine mögliche Korrektur besteht darin, die korrekte Abfrage anzugeben, die von
LAST_QUERY_IDzurückgegeben werden soll. Zum Beispiel wirdLAST_QUERY_ID(-2)hier die korrekte Abfrage sein, auf die verwiesen wird.
...
row_count1 := (
SELECT
$1
FROM
TABLE(RESULT_SCAN(LAST_QUERY_ID(-2)))
) /*** SSC-FDM-TD0033 - 'ACTIVITY_COUNT' TRANSFORMATION MIGHT REQUIRE MANUAL ADJUSTMENTS ***/;
...
Eine weitere mögliche Lösung ist die Verwendung von
ACTIVITY_COUNT(SELECT) unmittelbar nach der Ausführung derINSERT-Anweisung.
...
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;
...
Best Practices¶
Stellen Sie sicher, dass Sie bei Verwendung von
LAST_QUERY_IDauf die korrekte Abfrage verweisen.Stellen Sie sicher, dass
ACTIVITY_COUNTunmittelbar nach der auszuwertenden DML-Anweisung verwendet wird.Wenn Sie weitere Unterstützung benötigen, können Sie uns eine E-Mail an snowconvert-support@snowflake.com senden.
SSC-FDM-TD0034¶
„Period contains“ wird in eine benutzerdefinierte Funktion umgewandelt.
Beschreibung¶
Der Teradata-Ausdruck CONTAINS führt eine Validierung durch, die angibt, ob das Element auf der rechten Seite im Element auf der linken Seite enthalten ist, wobei Letzteres vom Typ PERIOD sein muss. CONTAINS gilt nur für DATE, TIME, TIMESTAMP oder PERIOD. Da PERIOD von Snowflake nicht unterstützt wird, emuliert eine benutzerdefinierte Funktion die Logik des nativen CONTAINS-Verhaltens.
Beispielcode¶
Eingabecode:¶
UPDATE TABLE1
SET COL1 = CURRENT_TIMESTAMP
WHERE COL3 CONTAINS CURRENT_TIMESTAMP;
Generierter Code¶
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. ***/
Best Practices¶
Die anstelle von
PERIODverwendeteVARCHARsetzt bei allen Werten das Format<PERIOD_BEGIN>*<PERIOD_END>voraus. Wenn die Werte durch ein anderes Trennzeichen als*getrennt sind, können Sie den von derPUBLIC.GET_PERIOD_SEPARATORUDF zurückgegebenen Wert ändern, der von SnowConvert AI bereitgestellt wird. Beachten Sie, dass die Struktur ein Trennzeichen enthalten muss, das den Anfang und das Ende einer PERIOD markiert, sodass die beiden Daten, Zeiten oder Zeitstempel immer durch dasselbe Trennzeichen getrennt sein sollten.Wenn Sie weitere Unterstützung benötigen, können Sie uns eine E-Mail an snowconvert-support@snowflake.com senden.
SSC-FDM-TD0035¶
Statistikfunktion wird in Snowflake nicht benötigt.
Bemerkung
Diese FDM ist veraltet. Weitere Informationen finden Sie unter SSC-EWI-0037.
Beschreibung¶
DROP, COLLECT oder HELP-Statistiken werden in Snowflake nicht benötigt. Snowflake sammelt bereits Statistiken, die zur automatischen Optimierung von Abfragen verwendet werden. Daher werden diese Statistikanweisungen in Teradata verwendet.
Beispielcode¶
Eingabecode:¶
HELP STATISTICS TestName;
Generierter Code¶
----** SSC-FDM-TD0035 - HELP STATISTICS NOT NEEDED. SNOWFLAKE AUTOMATICALLY COLLECTS STATISTICS. **
--HELP STATISTICS TestName
Best Practices¶
Wenn Sie weitere Unterstützung benötigen, können Sie uns eine E-Mail an snowconvert-support@snowflake.com senden.
SSC-FDM-TD0036¶
Snowflake unterstützt nicht den Zeittyp, da alle Zeiträume stattdessen als varchar behandelt werden.
Bemerkung
Einige Teile des Ausgabecodes wurden aus Gründen der Übersichtlichkeit weggelassen.
Genauigkeit der generierten varchar-Darstellungen¶
PERIOD_UDF generiert die varchar-Darstellung eines Zeitraums unter Verwendung der in Snowflake angegebenen Standardformate für Zeitstempel und Zeiten. Dies bedeutet, dass Zeitstempel drei Genauigkeitsstellen haben und Zeitvariablen null haben. Daher können Sie feststellen, dass die Ergebnisse eine höhere/niedrigere Genauigkeit haben als erwartet. Es gibt zwei Optionen, um zu ändern, wie viele Genauigkeitsstellen in der resultierenden Zeichenfolge enthalten sind:
Verwenden Sie die Drei-Parameter-Version von PERIOD_UDF: Diese Überladung der Funktion nimmt den
PRECISIONDIGITS-Parameter entgegen, eine ganze Zahl zwischen 0 und 9, um zu steuern, wie viele Stellen des Bruchteils der Zeit im Ergebnis enthalten sein sollen. Beachten Sie, dass das Maximum in Teradata sechs beträgt, selbst wenn Snowflake bis zu neun Dezimalstellen der Genauigkeit unterstützt. Beispiel:
Aufrufe |
Ergebnis |
|---|---|
|
|
|
|
|
|
Ändern des Sitzungsparameters
TIMESTAMP_NTZ_OUTPUT_FORMATundTIME_OUTPUT_FORMAT: Die BefehleALTER SESSION SET TIMESTAMP_NTZ_OUTPUT_FORMAT = <format>undALTER SESSION SET TIME_OUTPUT_FORMAT = <format>kann verwendet werden, um die Formate zu ändern, die Snowflake standardmäßig für die aktuelle Sitzung verwendet. Wenn Sie diese Formate so ändern, dass sie die gewünschte Anzahl von Genauigkeitsziffern enthalten, ändert sich das Ergebnis zukünftiger Ausführungen von PERIOD_UDF für die aktuelle Sitzung.
Beispielcode¶
Eingabecode:¶
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;
Generierter Code:¶
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;
Best Practices¶
Da das Verhalten von
PERIODund den zugehörigen Funktionen mithilfe von VARCHAR emuliert wird, empfehlen wir, die erhaltenen Ergebnisse zu überprüfen, um ihre Korrektheit sicherzustellen.Wenn Sie weitere Unterstützung benötigen, können Sie uns eine E-Mail an snowconvert-support@snowflake.com senden.