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

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

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:

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

Best Practices

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

Best Practices

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

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

Best Practices

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

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);
Copy
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 ***/;
Copy

Best Practices

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

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.

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

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

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 '#';
Copy
Generierter Code:
 SELECT
--** SSC-FDM-TD0011 - UNICODE BMP IS NOT SUPPORTED IN SNOWFLAKE **
'hola \u+005132 mundo';
Copy

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

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

Best Practices

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
Copy
Python:
#*** Generated code is based on the SnowConvert AI Python Helpers version 2.0.6 ***

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

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

Best Practices

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);
Copy
Snowflake Scripting:
 SELECT
--** SSC-FDM-TD0015 - REGEXP_SUBSTR FUNCTION ONLY SUPPORTS POSIX REGULAR EXPRESSIONS **
REGEXP_SUBSTR('qaqequ','q(?=u)', 1, 1);
Copy

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

Best Practices

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

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

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');
Copy
Generierter Code
 SELECT
--** SSC-FDM-TD0019 - TRANSACTION AND PROFILE LEVEL QUERY TAGS NOT SUPPORTED IN SNOWFLAKE, REFERENCING SESSION QUERY TAG INSTEAD **
GETQUERYBANDVALUE_UDF('account');
Copy

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

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

Best Practices

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

Copy

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}
Copy
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()
Copy

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;
Copy
Ergebnis
Idsim_fn
10
20.565079365
31
40.959047619
50
60.611111111
70.7777777777777777
80
90
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;
Copy
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

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

Best Practices

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

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

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

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
$$
Copy
Best Practices

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

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

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 vom WEEK_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 Sitzungsparameter WEEK_OF_YEAR_POLICY ab, 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);
Copy
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 ***/;
Copy

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 der TIME-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';
Copy
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
$$
Copy

Best Practices

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

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);
Copy
Generierter Code
 SELECT
    * FROM
    MY_TABLE
WHERE Name ILIKE 'Marco%' /*** SSC-FDM-TD0032 - NOT CASESPECIFIC CLAUSE WAS REMOVED ***/;
Copy

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

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;
Copy
Snowflake
 CREATE OR REPLACE PROCEDURE InsertEmployeeSalaryAndLog_1 ()
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "teradata",  "convertedOn": "07/15/2024" }}'
EXECUTE AS CALLER
AS
$$
    DECLARE
        row_count1 INT;
    BEGIN
         
        INSERT INTO employees (employee_id, first_name, last_name, department_id, salary)
        VALUES (101, 'Alice', 'Smith', 10, 70000.00);

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

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

CREATE OR REPLACE PROCEDURE InsertEmployeeSalaryAndLog_2 ()
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "teradata",  "convertedOn": "07/15/2024" }}'
EXECUTE AS CALLER
AS
$$
    DECLARE
        row_count1 INT;
        message VARCHAR(100);
    BEGIN
         
         
        INSERT INTO employees (employee_id, first_name, last_name, department_id, salary)
        VALUES (101, 'Alice', 'Smith', 10, 70000.00);

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

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

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):

Query History when calling InsertEmployeeSalaryAndLog_1()

  1. INSERT-Anweisung wird ausgeführt. LAST_QUERY_ID() verweist auf diese Anweisung.

  2. SELECT (zuerst wird ACTIVITY_COUNT) ausgeführt und $1 wird 1. LAST_QUERY_ID() verweist auf diese Anweisung.

  3. SELECT (als zweites wird ACTIVITY_COUNT) ausgeführt; da das letzte -Anweisungsergebnis 1 war, wird $1 zu 1 für diesen SELECT-Wert.

  4. row_count1 enthält diesen Wert 1, der in activity_log eingegeben wird.

InsertEmployeeSalaryAndLog_2() erfordert hingegen manuelle Anpassungen. Überprüfen des Abfrageverlaufs (von unten nach oben):

Query History when calling InsertEmployeeSalaryAndLog_2()

  1. INSERT-Anweisung wird ausgeführt. LAST_QUERY_ID() verweist auf diese Anweisung.

  2. SELECT (zuerst wird ACTIVITY_COUNT) ausgeführt und $1 wird zu 1. Beachten Sie jedoch, dass QUERY_TEXT + 10 enthält; dies wirkt sich auf das Ergebnis aus, das gescannt wird. LAST_QUERY_ID() wird auf diese Anweisung verweisen.

  3. SELECT (zweitens wird ACTIVITY_COUNT) ausgeführt. Das Ergebnis der letzten Abfrage ist 11; $1 enthält 11 statt der erwarteten 1.

  4. row_count1 enthält diesen Wert 11, der in activity_log eingegeben 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 ***/;
...
Copy

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;
Copy
Snowflake
 CREATE OR REPLACE PROCEDURE InsertEmployeeSalaryAndLog_3 ()
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "teradata",  "convertedOn": "07/15/2024" }}'
EXECUTE AS CALLER
AS
$$
    DECLARE
        row_count1 INT;
        emp_id INT;
        message VARCHAR(100);
    BEGIN
         
         
         
        INSERT INTO employees (employee_id, first_name, last_name, department_id, salary)
        VALUES (101, 'Alice', 'Smith', 10, 70000.00);
        SELECT
            employee_id INTO
            :emp_id
        FROM
            employees;
               -- Get the ACTIVITY_COUNT
               row_count1 := (
            SELECT
                $1
            FROM
                TABLE(RESULT_SCAN(LAST_QUERY_ID()))
               ) /*** SSC-FDM-TD0033 - 'ACTIVITY_COUNT' TRANSFORMATION MIGHT REQUIRE MANUAL ADJUSTMENTS ***/;
               message := 'EMPLOYEE INSERTED - ID: ' || emp_id;

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

Ä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):

Query History when calling InsertEmployeeSalaryAndLog_3()

  1. INSERT-Anweisung wird ausgeführt. LAST_QUERY_ID() verweist auf diese Anweisung.

  2. SELECT INTO wird ausgeführt, und $1 wird zu 101. LAST_QUERY_ID() zeigt auf diese Anweisung.

  3. SELECT (ACTIVITY_COUNT) wird ausgeführt. Das Ergebnis der letzten Abfrage ist 101; $1 enthält 101 statt der erwarteten 1.

  4. row_count1 enthält diesen Wert 101, der in activity_log eingegeben 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

  1. Eine mögliche Korrektur besteht darin, die korrekte Abfrage anzugeben, die von LAST_QUERY_ID zurückgegeben werden soll. Zum Beispiel wird LAST_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 ***/;
               ...
Copy
  1. Eine weitere mögliche Lösung ist die Verwendung von ACTIVITY_COUNT (SELECT) unmittelbar nach der Ausführung der INSERT-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;
...
Copy

Best Practices

  • Stellen Sie sicher, dass Sie bei Verwendung von LAST_QUERY_ID auf die korrekte Abfrage verweisen.

  • Stellen Sie sicher, dass ACTIVITY_COUNT unmittelbar 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;
Copy
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. ***/
Copy

Best Practices

  • Die anstelle von PERIOD verwendete VARCHAR setzt 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 der PUBLIC.GET_PERIOD_SEPARATOR UDF 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;
Copy
Generierter Code
  ----** SSC-FDM-TD0035 - HELP STATISTICS NOT NEEDED. SNOWFLAKE AUTOMATICALLY COLLECTS STATISTICS. **
  --HELP STATISTICS TestName
Copy

Best Practices

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

PUBLIC.PERIOD_UDF(time '13:30:45.870556', time '15:35:20.344891', 0)

'13:30:45*15:35:20'

PUBLIC.PERIOD_UDF(time '13:30:45.870556', time '15:35:20.344891', 2)

'13:30:45.87*15:35:20.34'

PUBLIC.PERIOD_UDF(time '13:30:45.870556', time '15:35:20.344891', 5)

'13:30:45.87055*15:35:20.34489'

  • Ändern des Sitzungsparameters TIMESTAMP_NTZ_OUTPUT_FORMAT und TIME_OUTPUT_FORMAT: Die Befehle ALTER 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;
Copy
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;
Copy

Best Practices

  • Da das Verhalten von PERIOD und 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.