SnowConvert AI – Teradata – DDL

In diesem Abschnitt finden Sie die Dokumentation für die Übersetzungsreferenz von Elementen der Datendefinitionssprache.

Index

Übersetzungsreferenz für die Konvertierung der INDEX-Anweisung in Snowflake

Warnung

Derzeit wird die Anweisung _ Create Index _ nicht konvertiert, aber geparst. Wenn Ihr Quellcode außerdem Anweisungen Create Index enthält, werden diese im _ Assessment Report _ berücksichtigt.

Beispiel für Index erstellen

Teradata-Eingabe

 CREATE INDEX (col1, col2, col3) ORDER BY VALUES (col2) ON table1;

CREATE INDEX my_index_name ON my_table (column1, column2);
Copy

Bemerkung

Aus architektonischen Gründen unterstützt Snowflake keine Indizes, sodass SnowConvert AI den gesamten Code entfernt, der mit der Erstellung von Indizes verbunden ist. Snowflake erstellt automatisch Mikropartitionen für jede Tabelle, um die Leistung von DML-Operationen zu beschleunigen. Benutzende müssen sich so nicht um die Erstellung oder Verwaltung dieser Mikropartitionen kümmern.

Normalerweise reicht dies aus, um eine sehr gute Abfrageleistung zu erzielen. Es gibt jedoch Möglichkeiten, diese zu verbessern, indem Sie Gruppierungsschlüssel für Daten erstellen. Auf der offiziellen Seite von Snowflake finden Sie weitere Informationen über Mikropartitionen und Data Clustering.

Join Index

Beschreibung

In SnowConvert AI werden Teradata-Join-Indizes in dynamische Snowflake-Tabellen umgewandelt. Um dynamische Tabellen ordnungsgemäß zu konfigurieren, müssen zwei wichtige Parameter definiert werden: TARGET_LAG und WAREHOUSE. Wenn diese Parameter in den Konfigurationsoptionen nicht spezifiziert sind, verwendet SnowConvert AI bei der Konvertierung standardmäßig die vorab zugewiesenen Werte, wie im folgenden Beispiel gezeigt.

Weitere Informationen zu Join Indexes finden Sie hier.

Einzelheiten zu den erforderlichen Parametern für dynamische Tabellen finden Sie hier.

Beispielhafte Quellcode-Muster

Teradata

Join-Index

CREATE JOIN INDEX Employee
AS   
SELECT 
  Employee_Id,
  First_Name,
  Last_Name,
  BirthDate,
  DepartmentNo   
FROM Employee   
PRIMARY INDEX (First_Name); 
Copy

Snowflake

Dynamische Tabelle

CREATE OR REPLACE DYNAMIC TABLE Employee
--** SSC-FDM-0031 - DYNAMIC TABLE REQUIRED PARAMETERS SET BY DEFAULT **
TARGET_LAG='1 day'
WAREHOUSE=UPDATE_DUMMY_WAREHOUSE
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"teradata"}}'
AS
SELECT
  Employee_Id,
  First_Name,
  Last_Name,
  BirthDate,
  DepartmentNo
FROM 
  Employee;
Copy

Bekannte Probleme

Zur Zeit sind keine Fehler bekannt.

Schema

Beschreibung

Die Übersetzung der Anweisung CREATE SCHEMA von Teradata nach Snowflake ist einfach, da die grundlegende Syntax dieselbe bleibt.

Beispielhafte Quellcode-Muster

Teradata

Join-Index

CREATE SCHEMA IF EXISTS schema_name;
Copy

Snowflake

Dynamische Tabelle

CREATE SCHEMA IF EXISTS schema_name
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "teradata",  "convertedOn": "07/23/2024" }}'
;
Copy

Bekannte Probleme

WITH-Eigenschaften von CREATE SCHEMA

Die WITH Eigenschaften, die in Teradata mit der Anweisung CREATE SCHEMA verbunden sind, werden in Snowflake nicht unterstützt, da es keine entsprechende Funktion gibt.

Teradata

Join-Index

CREATE SCHEMA IF EXISTS schema_name
WITH ( PROPERTY1 = PROPERTYNAME, PROPERTY2 = PROPERTTYNAME, PROPERTY3 = PROPERTTYNAME);
Copy

Snowflake

Dynamische Tabelle

CREATE SCHEMA IF EXISTS schema_name
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "teradata",  "convertedOn": "07/23/2024" }}'
!!!RESOLVE EWI!!! /*** SSC-EWI-0073 - PENDING FUNCTIONAL EQUIVALENCE REVIEW FOR 'SCHEMA WITH' NODE ***/!!!
WITH ( PROPERTY1 = PROPERTYNAME, PROPERTY2 = PROPERTTYNAME, PROPERTY3 = PROPERTTYNAME);
Copy

Zugehörige EWIs

  1. [SSC-EWI-0073](../../../general/technical-documentation/issues-and-troubleshooting/conversion-issues/generalEWI. md#ssc-ewi-0073): Überprüfung der Funktionsäquivalenz ausstehend.

Ansichten

Übersetzungsreferenz zur Konvertierung der VIEW-Anweisung von Teradata in Snowflake

Bemerkung

Einige Teile des Ausgabecodes wurden aus Gründen der Übersichtlichkeit weggelassen.

Beschreibung

Die VIEW-Anweisung von Teradata wird in die VIEW-Syntax von Snowflake übersetzt.

Weitere Informationen zu VIEW in Teradata finden Sie hier.

Beispielhafte Quellcode-Muster

Transformation Create View

Teradata

Ansicht
 CREATE VIEW view1 (someTable.col1, someTable.col2) AS locking row for access
    SELECT
    my_table.col1, my_table.col2
    FROM table1 AS my_table
    WHERE my_table.col1 = 'SpecificValue'
    UNION ALL
    SELECT other_table.col2
    FROM table2 AS other_table
    WHERE my_table.col2 = other_table.col2
Copy

Snowflake

Ansicht
 --** SSC-FDM-0007 - MISSING DEPENDENT OBJECTS "table1", "table2" **
CREATE OR REPLACE VIEW view1
(
    col1,
    col2)
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
    my_table.col1,
    my_table.col2
    FROM
    table1 AS my_table
    WHERE
    UPPER(RTRIM( my_table.col1)) = UPPER(RTRIM('SpecificValue'))
    UNION ALL
    SELECT
    other_table.col2
       FROM
    table2 AS other_table
       WHERE my_table.col2 = other_table.col2;
Copy

Benutzerdefiniertes Schema-Tag

Das benutzerdefinierte Schema wird im Kommentarbereich vor der Spezifikation der Ansicht angegeben, und zwar mit einem XML Tag namens „sc-view“, das nur den Wert des Schemas und den Namen der Ansicht, getrennt durch einen Punkt „ .“, enthält, wie unten gezeigt: <sc-view>SCHEMANAME.VIEWNAME</sc-view>

Das benutzerdefinierte Schema wird als Qualifizierer für die Ansicht verwendet. Der Name der Ansicht und alle Objekte, auf die in den Abfragen von FROM und den inneren Abfragen verwiesen wird, verwenden dann dieses benutzerdefinierte Schema. Es kann also mehrere Ansichten mit demselben Namen, aber mit unterschiedlichen benutzerdefinierten Tags geben. Beispiel: zwei Ansichten mit demselben Namen verwenden die benutzerdefinierten Schema-Tag-Informationen, um die Übersetzung durchzuführen.

Teradata
Ansicht
 /*<sc-view>RMSviews.EMPLOYEEB</sc-view>*/
REPLACE VIEW EMPLOYEEB AS
SELECT * FROM EMPLOYEE
WHERE AREA = "AREAB";

/*<sc-view>Views.EMPLOYEEB</sc-view>*/
REPLACE VIEW EMPLOYEEB AS
SELECT * FROM EMPLOYEE
WHERE AREA = "AREAB";
Copy
Snowflake

Die Transformation für Snowflake variiert je nach dem benutzerdefinierten Schemanamen MySchema, dem benutzerdefinierten Datenbanknamen MyDatabase oder der Nichtauswahl einer benutzerdefinierten Datenbank oder eines Schemas in den Konvertierungseinstellungen.

Kundenspezifisches Schema
 /*<sc-view>RMSviews.EMPLOYEEB</sc-view>*/
--** SSC-FDM-0007 - MISSING DEPENDENT OBJECT "EMPLOYEE" **
CREATE OR REPLACE VIEW RMSviews.EMPLOYEEB
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"teradata"}}'
AS
SELECT
* FROM
RMSviews.EMPLOYEE
WHERE AREA = "AREAB";

/*<sc-view>Views.EMPLOYEEB</sc-view>*/
--** SSC-FDM-0007 - MISSING DEPENDENT OBJECT "EMPLOYEE" **
--** SSC-FDM-0019 - SEMANTIC INFORMATION COULD NOT BE LOADED FOR Views.EMPLOYEEB. CHECK IF THE NAME IS INVALID OR DUPLICATED. **
CREATE OR REPLACE VIEW Views.EMPLOYEEB
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"teradata"}}'
AS
SELECT
* FROM
Views.EMPLOYEE
 WHERE AREA = "AREAB";
Copy
Kundenspezifische Datenbank
 /*<sc-view>RMSviews.EMPLOYEEB</sc-view>*/
CREATE OR REPLACE VIEW MyDatabase.RMSviews.EMPLOYEEB
AS
   SELECT * FROM MyDatabase.RMSviews.EMPLOYEE
   WHERE AREA = "AREAB";

/*<sc-view>Views.EMPLOYEEB</sc-view>*/
CREATE OR REPLACE VIEW MyDatabase.Views.EMPLOYEEB
AS
   SELECT * FROM MyDatabase.Views.EMPLOYEE
   WHERE AREA = "AREAB";
Copy
Nicht ausgewählt
 /*<sc-view>RMSviews.EMPLOYEEB</sc-view>*/
CREATE OR REPLACE VIEW RMSviews.PUBLIC.EMPLOYEEB
AS
   SELECT * FROM RMSviews.PUBLIC.EMPLOYEE
   WHERE AREA = "AREAB";

/*<sc-view>Views.EMPLOYEEB</sc-view>*/
CREATE OR REPLACE VIEW Views.PUBLIC.EMPLOYEEB
AS
   SELECT * FROM Views.PUBLIC.EMPLOYEE
   WHERE AREA = "AREAB";
Copy

Bekannte Probleme

1. Locking row for access logic difference

In Snowflake basiert der Zugriff auf Objekte und Elemente auf Benutzern und Berechtigungen.

Zugehörige EWIs

  1. SSC-FDM-0007: Element mit fehlenden Abhängigkeiten.

  2. SSC-FDM-0019: Semantische Informationen konnten nicht geladen werden.

Tabellen

Übersetzungsreferenz zur Konvertierung der TABLE-Anweisung von Teradata in Snowflake

Bemerkung

Einige Teile des Ausgabecodes wurden aus Gründen der Übersichtlichkeit weggelassen.

Beschreibung

Die TABLE-Anweisung von Teradata wird in die TABLE-Syntax von Snowflake übersetzt.

Weitere Informationen zu TABLEs in Teradata finden Sie hier.

Beispielhafte Quellcode-Muster

Einfaches Create Table

Teradata

Tabelle
 CREATE TABLE table1, no fallback,
no before journal,
no after journal (
  c1 INTEGER NOT NULL,
	f1 INTEGER NOT NULL,
	p1 INTEGER NOT NULL,
  DATE,
  TIME,
	FOREIGN KEY(f1) REFERENCES WITH CHECK OPTION table2 (d1)
)
UNIQUE PRIMARY INDEX(c1)
PARTITION BY COLUMN(p1);
Copy

Snowflake

Tabelle
CREATE OR REPLACE TABLE table1 (
	c1 INTEGER NOT NULL,
	f1 INTEGER NOT NULL,
	p1 INTEGER NOT NULL,
	DATE,
	TIME,
	FOREIGN KEY(f1) REFERENCES table2 (d1) ,
	UNIQUE (c1)
)
----** SSC-FDM-0038 - MICRO-PARTITIONING IS AUTOMATICALLY HANDLED ON ALL SNOWFLAKE TABLES **
--PARTITION BY COLUMN(p1)
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "teradata",  "convertedOn": "09/19/2025",  "domain": "no-domain-provided" }}'
;
Copy

Tabellentyp-Klausel - SET und MULTISET

Die Typklausel von Teradata bestimmt, ob doppelte Zeilen erlaubt sind (MULTISET) oder nicht (SET).

Teradata
Tabelle
 -- Set semantics
CREATE SET TABLE table1 (
    column1 INTEGER
);

--Multiset semantics
CREATE MULTISET TABLE table2(
    column1 INTEGER
);
Copy
Snowflake
Tabelle
 -- Set semantics
--** SSC-FDM-TD0024 - SET TABLE FUNCTIONALITY NOT SUPPORTED. TABLE MIGHT HAVE DUPLICATE ROWS **
CREATE OR REPLACE TABLE table1 (
    column1 INTEGER
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"teradata"}}'
;

--Multiset semantics
CREATE OR REPLACE TABLE table2 (
    column1 INTEGER
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"teradata"}}'
;
Copy

Flüchtige und globale temporäre Tabellen

Die Tabellen Volatile und Global Temporary von Teradata werden für die temporäre Speicherung von Daten verwendet. Der Unterschied besteht darin, dass die Tabellendefinition (DDL) von globalen temporären Tabellen im Data Dictionary gespeichert wird, während die Definition von flüchtigen Tabellen nicht gespeichert wird.

Teradata
Tabelle
 --Global Temporary Table
CREATE MULTISET GLOBAL TEMPORARY TABLE table1 (
    column1 INTEGER
);

--Volatile Table
CREATE MULTISET VOLATILE TABLE table3 (
    column1 INTEGER
);
Copy
Snowflake
Tabelle
 --Global Temporary Table
--** SSC-FDM-0009 - GLOBAL TEMPORARY TABLE FUNCTIONALITY NOT SUPPORTED. **
CREATE OR REPLACE TABLE table1 (
    column1 INTEGER
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"teradata"}}'
;

--Volatile Table
CREATE OR REPLACE TEMPORARY TABLE table3 (
    column1 INTEGER
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"teradata"}}'
;
Copy

Mit Daten und ohne Datenoption

Teradata

Tabelle
 -- With data
CREATE TABLE table1 AS table2 WITH DATA

-- With no data
CREATE TABLE table1 AS table2 WITH NO DATA 
Copy

Snowflake

Tabelle
 -- With data
CREATE OR REPLACE TABLE table1 CLONE table2
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"teradata"}}'
;

-- With no data
--** SSC-FDM-0019 - SEMANTIC INFORMATION COULD NOT BE LOADED FOR table1. CHECK IF THE NAME IS INVALID OR DUPLICATED. **
CREATE OR REPLACE TABLE table1 LIKE table2
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"teradata"}}'
;
Copy

Snowflake’s reservierte & eingeschränkte Schlüsselwörter

SnowConvert AI ermöglicht nahtlose SQL-Migrationen zu Snowflake, indem Probleme im Zusammenhang mit reservierten Schlüsselwörtern behoben werden. Gemäß der Dokumentation zu reservierten und beschränkten Schlüsselwörtern von Snowflake können bestimmte Schlüsselwörter ohne spezielle Behandlung nicht als Spaltennamen, Tabellennamen oder Aliasse verwendet werden. SnowConvert AI umfasst Funktionen, um die SQL-Code-Kompatibilität in solchen Fällen sicherzustellen.

Reservierte ANSI Schlüsselwörter als Spaltennamen

Bei Spaltennamen, die mit ANSI oder reservierten Snowflake-Schlüsselwörtern** übereinstimmen, setzt SnowConvert AI den Spaltennamen automatisch in doppelte Anführungszeichen ("), um den Syntaxregeln von Snowflake zu entsprechen. Diese Anpassung stellt sicher, dass Abfragen mit diesen Spaltennamen in Snowflake korrekt kompiliert werden, ohne dass ein manuelles Eingreifen erforderlich ist.

Beispiel:

Tabelle
 CREATE TABLE ReservedKeywords (
  "CREATE" VARCHAR(50),
  FOLLOWING VARCHAR(50),
  "ILIKE" VARCHAR(50),
  RLIKE VARCHAR(50)
);
Copy

Snowflake

Tabelle
 CREATE OR REPLACE TABLE ReservedKeywords (
    "CREATE" VARCHAR(50),
    "FOLLOWING" VARCHAR(50),
    "ILIKE" VARCHAR(50),
    "RLIKE" VARCHAR(50)
)
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "transact",  "convertedOn": "11/28/2024",  "domain": "test" }}'
;
Copy

Snowflake-spezifische reservierte Schlüsselwörter

Spalten, die Snowflake-spezifischen reservierten Schlüsselwörtern entsprechen (z. B. CONSTRAINT, CURRENT_DATE, CURRENT_TIME) können immer noch Kompilierungsprobleme verursachen, auch wenn sie in Anführungszeichen eingeschlossen sind. SnowConvert AI erkennt diese Instanzen und erzeugt eine Warnung mit Code SSC-EWI-0045 und fordert Benutzende auf, diese Spalten zu überprüfen und möglicherweise aus Gründen der Kompatibilität umzubenennen.

Beispiel:

Tabelle
 CREATE TABLE ColumnReservedNames (
  "CONSTRAINT" VARCHAR(50),
  "CURRENT_DATE" VARCHAR(50),
  "CURRENT_TIME" VARCHAR(50)
);
Copy

Snowflake

Tabelle
 CREATE OR REPLACE TABLE ColumnReservedNames (
    !!!RESOLVE EWI!!! /*** SSC-EWI-0045 - COLUMN NAME 'CONSTRAINT' IS A SNOWFLAKE RESERVED KEYWORD ***/!!!
    "CONSTRAINT" VARCHAR(50),
    !!!RESOLVE EWI!!! /*** SSC-EWI-0045 - COLUMN NAME 'CURRENT_DATE' IS A SNOWFLAKE RESERVED KEYWORD ***/!!!
    "CURRENT_DATE" VARCHAR(50),
    !!!RESOLVE EWI!!! /*** SSC-EWI-0045 - COLUMN NAME 'CURRENT_TIME' IS A SNOWFLAKE RESERVED KEYWORD ***/!!!
    "CURRENT_TIME" VARCHAR(50)
)
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "transact",  "convertedOn": "11/28/2024",  "domain": "test" }}'
;
Copy

Bekannte Probleme

1. Create table options not supported

Wie im Beispiel „Einfaches Create Table“ gezeigt, unterstützt Snowflake die Optionen zum Erstellen von Teradata-Tabellen nicht. Sie werden entfernt.

2. Partition by performance issues

Im Beispiel „Einfaches Create Table“ wird die Anweisung partition by aufgrund von Leistungserwägungen entfernt.

3. Primary Index moved

In Teradata wird die Primärindexeinschränkung außerhalb der Anweisung create table deklariert, in Snowflake muss sie jedoch darin enthalten sein, wie im Beispiel „Einfaches Create Table“ gezeigt.

4. SET semantics not supported

Wie im Beispiel „Tabellentyp-Klausel - SET und MULTISET“ gezeigt, unterstützt Snowflake die Semantik von Teradata SET nicht. Sie werden entfernt.

5. Global Temporary table option not supported

Wie im Beispiel „Flüchtige und globale temporäre Tabelle“ gezeigt, unterstützt Snowflake die Option „Globale temporäre Tabelle“ von Teradata nicht. Sie wird entfernt.

6. Compress unsupported

COMPRESS (vaue1, value, value3) wird entfernt, da es nicht unterstützt wird.

7. On commit unsupported

On Commit wird entfernt, da es nicht unterstützt wird.

8. Block compression unsupported

Die Blockkomprimierung wird entfernt, da sie nicht unterstützt wird.

9. Normalize unsupported

Normalisieren wird entfernt, da es nicht unterstützt wird.

Zugehörige EWIs

  1. SSC-FDM-0009: Die GLOBAL TEMPORARY TABLE-Funktion wird nicht unterstützt.

  2. SSC-FDM-0019: Semantische Informationen konnten nicht geladen werden.

  3. SSC-FDM-TD0024: Die Set Table-Funktion wird nicht unterstützt.

  4. SSC-PRF-0007: Überprüfung der CLUSTER BY-Leistung.

  5. SSC-EWI-0045: Spaltenname ist ein von Snowflake reserviertes Schlüsselwort.

WITH DEFAULT

Übersetzungsreferenz zur Konvertierung der WITH DEFAULT-Klausel von Teradata in Spaltendefinitionen in Snowflake

Bemerkung

Einige Teile des Ausgabecodes wurden aus Gründen der Übersichtlichkeit weggelassen.

Beschreibung

Die WITH DEFAULT-Klausel von Teradata setzt einen Systemstandardwert für Spalten, die ohne Werte eingefügt werden. Dieser Wert ist in der Regel gleich Null oder leer.

Syntax:

 WITH DEFAULT
Copy

Die folgende Tabelle zeigt die Datentypen von Teradata, ihren entsprechenden Typ in Snowflake und den Standardwert, der eingestellt werden muss, wenn er unterstützt wird.

TeradataSnowflakeDefault Value
BLOB[(n)]BYTENOT SUPPORTED
BYTE[(n)]BYTENOT SUPPORTED
VARBYTE[(n)]BYTENOT SUPPORTED
BIGINTBIGINT0
BYTEINTBYTEINT0
DECIMAL [(n[,m])]DECIMAL0
DOUBLE PRECISIONDOUBLE PRECISION0
FLOATFLOAT0
INTEGERINTEGER0
NUMBER(n[,m])NUMBER0
NUMBER[(*[,m])]NUMBER0
NUMERIC [(n[,m])]NUMERIC0
REALREAL0
SMALLINTSMALLINT0
DATEDATECURRENT_DATE
TIME [(n)]TIMECURRENT_TIME
TIMESTAMP [(n)]TIMESTAMPCURRENT_TIMESTAMP
TIMESTAMP WITH TIME ZONETIMESTAMP_TZLOCALTIMESTAMP
INTERVAL DAY [(n)]VARCHAR(21)'0DAY'
INTERVAL DAY [(n)] TO HOURVARCHAR(21)'0DAY'
INTERVAL DAY [(n)] TO MINUTEVARCHAR(21)'0DAY'
INTERVAL DAY [(n)] TO SECONDVARCHAR(21)'0DAY'
INTERVAL HOUR [(n)]VARCHAR(21)'0HOUR'
INTERVAL HOUR [(n)] TO MINUTEVARCHAR(21)'0HOUR'
INTERVAL HOUR [(n)] TO SECONDVARCHAR(21)'0HOUR'
INTERVAL MINUTE [(n)]VARCHAR(21)'0MINUTE'
INTERVAL MINUTE [(n)] TO SECOND [(m)]VARCHAR(21)'0MINUTE'
INTERVAL MONTHVARCHAR(21)'0MONTH'
INTERVAL SECOND [(n,[m])]VARCHAR(21)'0SECOND'
INTERVAL YEAR [(n)]VARCHAR(21)'0YEAR'
INTERVAL YEAR [(n)] TO MONTHVARCHAR(21)'0YEAR'
CHAR[(n)]CHAR''
CHARACTER(n) CHARACTER SET GRAPHIC-NOT SUPPORTED
CLOB-NOT SUPPORTED
CHAR VARYING(n)VARCHAR''
LONG VARCHAR-NOT SUPPORTED
LONG VARCHAR CHARACTER SET GRAPHIC-NOT SUPPORTED
VARCHAR(n)VARCHAR''
VARCHAR(n) CHARACTER SET GRAPHIC-NOT SUPPORTED
PERIOD(DATE)VARCHAR(24)NOT SUPPORTED
PERIOD(TIME [(n)])VARCHAR(24)NOT SUPPORTED
PERIOD(TIMESTAMP [(n)])VARCHAR(24)NOT SUPPORTED

Beispielhafte Quellcode-Muster

Teradata

Abfrage
 CREATE TABLE SAMPLE_TABLE
(
    ID INT,

    -- Numeric Types
    big_integer_col BIGINT WITH DEFAULT,
    byteint_col BYTEINT WITH DEFAULT,
    decimal_col DECIMAL(10,2) WITH DEFAULT,
    double_precision_col DOUBLE PRECISION WITH DEFAULT,
    float_col FLOAT WITH DEFAULT,
    integer_col INTEGER WITH DEFAULT,
    number_col NUMBER WITH DEFAULT,
    numeric_col NUMERIC(10,2) WITH DEFAULT,
    real_col REAL WITH DEFAULT,
    smallint_col SMALLINT WITH DEFAULT,

    -- Character Types
    char_col CHAR(50) WITH DEFAULT,
    character_col CHARACTER(50) WITH DEFAULT,
    --clob_col CLOB,
    char_varying_col CHAR VARYING(100) WITH DEFAULT,
    --long_varchar_col LONG VARCHAR WITH DEFAULT,
    --long_varchar_graphic_col LONG VARCHAR CHARACTER SET GRAPHIC WITH DEFAULT,
    varchar_col VARCHAR(255) WITH DEFAULT,
    --varchar_graphic_col VARCHAR(255) CHARACTER SET GRAPHIC WITH DEFAULT,

    -- Date and Time Types
    date_col DATE WITH DEFAULT,
    time_col TIME WITH DEFAULT,
    time_precision_col TIME(6) WITH DEFAULT,
    timestamp_col TIMESTAMP WITH DEFAULT,
    timestamp_precision_col TIMESTAMP(6) WITH DEFAULT,
    tz_timestamp_col TIMESTAMP WITH TIME ZONE WITH DEFAULT,
    tz_timestamp_precision_col TIMESTAMP(6) WITH TIME ZONE WITH DEFAULT,    
    interval_col INTERVAL DAY(4) WITH DEFAULT,
    interval_day_to_hour_col INTERVAL DAY(4) TO HOUR WITH DEFAULT,
    interval_hour_col INTERVAL HOUR(2) WITH DEFAULT,
    interval_minute_col INTERVAL MINUTE(2) WITH DEFAULT,
    interval_month_col INTERVAL MONTH WITH DEFAULT,
    interval_second_col INTERVAL SECOND(2) WITH DEFAULT,
    interval_year_col INTERVAL YEAR(4) WITH DEFAULT,

    -- Binary Types
    -- blob_col BLOB(1000),
    byte_col BYTE(1000) WITH DEFAULT,
    varbyte_col VARBYTE(1000) WITH DEFAULT
);
Copy
Snowflake
Abfrage
 CREATE OR REPLACE TABLE SAMPLE_TABLE
(
    ID INT,
    -- Numeric Types
    big_integer_col BIGINT DEFAULT 0,
    byteint_col BYTEINT DEFAULT 0,
    decimal_col DECIMAL(10,2) DEFAULT 0,
    double_precision_col DOUBLE PRECISION DEFAULT 0,
    float_col FLOAT DEFAULT 0,
    integer_col INTEGER DEFAULT 0,
    number_col NUMBER(38, 18) DEFAULT 0,
    numeric_col NUMERIC(10,2) DEFAULT 0,
    real_col REAL DEFAULT 0,
    smallint_col SMALLINT DEFAULT 0,
    -- Character Types
    char_col CHAR(50) DEFAULT '',
    character_col CHARACTER(50) DEFAULT '',
    --clob_col CLOB,
    char_varying_col CHAR VARYING(100) DEFAULT '',
    --long_varchar_col LONG VARCHAR WITH DEFAULT,
    --long_varchar_graphic_col LONG VARCHAR CHARACTER SET GRAPHIC WITH DEFAULT,
    varchar_col VARCHAR(255) DEFAULT '',
    --varchar_graphic_col VARCHAR(255) CHARACTER SET GRAPHIC WITH DEFAULT,

    -- Date and Time Types
    date_col DATE DEFAULT CURRENT_DATE,
    time_col TIME DEFAULT CURRENT_TIME,
    time_precision_col TIME(6) DEFAULT CURRENT_TIME(6),
    timestamp_col TIMESTAMP
--                            !!!RESOLVE EWI!!! /*** SSC-EWI-0013 - EXCEPTION THROWN WHILE CONVERTING ITEM: Mobilize.T12Data.Sql.Ast.TdWithDefaultAttribute. LINE: 31 OF FILE: /Users/hbadillabonilla/Documents/Workspace/migrations-snowconvert/Tools/DocVerifier/out/temp/CUebOYutwG1Dca8jb0Fo/8921d487/SOURCE/Teradata_01.sql ***/!!!
--                            WITH DEFAULT
                                        ,
    timestamp_precision_col TIMESTAMP(6)
--                                         !!!RESOLVE EWI!!! /*** SSC-EWI-0013 - EXCEPTION THROWN WHILE CONVERTING ITEM: Mobilize.T12Data.Sql.Ast.TdWithDefaultAttribute. LINE: 32 OF FILE: /Users/hbadillabonilla/Documents/Workspace/migrations-snowconvert/Tools/DocVerifier/out/temp/CUebOYutwG1Dca8jb0Fo/8921d487/SOURCE/Teradata_01.sql ***/!!!
-- WITH DEFAULT
             ,
    tz_timestamp_col TIMESTAMP_TZ
--                                  WITH DEFAULT
--    !!!RESOLVE EWI!!! /*** SSC-EWI-0021 - WITH DEFAULT FOR 'TIMESTAMP WITH TIME ZONE' NOT SUPPORTED IN SNOWFLAKE ***/!!!
                                                                                                                        ,
    tz_timestamp_precision_col TIMESTAMP_TZ(6)
--                                               WITH DEFAULT
--    !!!RESOLVE EWI!!! /*** SSC-EWI-0021 - WITH DEFAULT FOR 'TIMESTAMP(6) WITH TIME ZONE' NOT SUPPORTED IN SNOWFLAKE ***/!!!
                                                                                                                           ,
    interval_col VARCHAR(21) !!!RESOLVE EWI!!! /*** SSC-EWI-0036 - INTERVAL DAY(4) DATA TYPE CONVERTED TO VARCHAR ***/!!! DEFAULT '0DAY',
    interval_day_to_hour_col VARCHAR(21) !!!RESOLVE EWI!!! /*** SSC-EWI-0036 - INTERVAL DAY(4) TO HOUR DATA TYPE CONVERTED TO VARCHAR ***/!!! DEFAULT '0DAY',
    interval_hour_col VARCHAR(21) !!!RESOLVE EWI!!! /*** SSC-EWI-0036 - INTERVAL HOUR(2) DATA TYPE CONVERTED TO VARCHAR ***/!!! DEFAULT '0HOUR',
    interval_minute_col VARCHAR(21) !!!RESOLVE EWI!!! /*** SSC-EWI-0036 - INTERVAL MINUTE(2) DATA TYPE CONVERTED TO VARCHAR ***/!!! DEFAULT '0MINUTE',
    interval_month_col VARCHAR(21) !!!RESOLVE EWI!!! /*** SSC-EWI-0036 - INTERVAL MONTH DATA TYPE CONVERTED TO VARCHAR ***/!!! DEFAULT '0MONTH',
    interval_second_col VARCHAR(21) !!!RESOLVE EWI!!! /*** SSC-EWI-0036 - INTERVAL SECOND(2) DATA TYPE CONVERTED TO VARCHAR ***/!!! DEFAULT '0SECOND',
    interval_year_col VARCHAR(21) !!!RESOLVE EWI!!! /*** SSC-EWI-0036 - INTERVAL YEAR(4) DATA TYPE CONVERTED TO VARCHAR ***/!!! DEFAULT '0YEAR',
    -- Binary Types
    -- blob_col BLOB(1000),
    byte_col BINARY
--                    WITH DEFAULT
--    !!!RESOLVE EWI!!! /*** SSC-EWI-0021 - WITH DEFAULT FOR 'BYTE(1000)' NOT SUPPORTED IN SNOWFLAKE ***/!!!
                                                                                                          ,
    varbyte_col BINARY(1000)
--                             WITH DEFAULT
--    !!!RESOLVE EWI!!! /*** SSC-EWI-0021 - WITH DEFAULT FOR 'VARBYTE(1000)' NOT SUPPORTED IN SNOWFLAKE ***/!!!
)
Copy

Bekannte Probleme

1. Unsupported types

Wie aus der Tabelle in der Beschreibungstabelle hervorgeht, werden einige Typen nicht unterstützt und bei der Umwandlung der Klausel WITH DEFAULT wird kein Standardwert gesetzt.

Zugehörige EWIs

  1. SSC-EWI-0021: Nicht in Snowflake unterstützt.

  2. [SSC-EWI-0036](../../../general/technical-documentation/issues-and-troubleshooting/conversion-issues/generalEWI. md#ssc-ewi-0036): Datentyp in einen anderen Datentyp konvertiert.

CREATE MACRO

Übersetzungsreferenz zur Konvertierung der CREATE MACRO-Klausel von Teradata in Snowflake Scripting

Beschreibung

Teradata CREATE MACRO definiert eine oder mehrere Anweisungen, die häufig verwendet werden oder einen komplexen Vorgang ausführen, wodurch vermieden wird, dass dieselbe Anweisungssequenz mehrmals geschrieben wird. Das Makro wird ausgeführt, wenn es von der EXECUTE-Anweisung aufgerufen wird.

Für weitere Informationen über CREATE MACRO klicken Sie hier.

 CREATE MACRO <macroname> [(parameter1, parameter2,...)] ( 
   <sql_statements> 
);

[ EXECUTE | EXEC ] <macroname>;
Copy

Beispielhafte Quellcode-Muster

Datenkonfiguration

Der folgende Code ist erforderlich, um die Beispielmuster in diesem Abschnitt auszuführen.

Teradata
 CREATE TABLE DEPOSIT
(
    ACCOUNTNO NUMBER,
    ACCOUNTNAME VARCHAR(100)
);

INSERT INTO DEPOSIT VALUES (1, 'Account 1');
INSERT INTO DEPOSIT VALUES (2, 'Account 2');
INSERT INTO DEPOSIT VALUES (3, 'Account 3');
INSERT INTO DEPOSIT VALUES (4, 'Account 4');
Copy
Snowflake
 CREATE OR REPLACE TABLE DEPOSIT
(
    ACCOUNTNO NUMBER(38, 18),
    ACCOUNTNAME VARCHAR(100)
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"teradata"}}'
;

INSERT INTO DEPOSIT
VALUES (1, 'Account 1');

INSERT INTO DEPOSIT
VALUES (2, 'Account 2');

INSERT INTO DEPOSIT
VALUES (3, 'Account 3');

INSERT INTO DEPOSIT
VALUES (4, 'Account 4');
Copy

Grundlegendes Makro

Da es in Snowflake kein Makroobjekt gibt, wandelt das Konvertierungstool Teradata-Makros in gespeicherte Prozeduren von Snowflake Scripting um. Um die Funktionalität des zurückgegebenen Resultset zu replizieren, wird in Snowflake Scripting die Abfrage, die ein Resultset von einem Makro zurückgeben soll, einer RESULTSET-Variablen zugewiesen, die dann zurückgegeben wird.

Teradata
Abfrage
 REPLACE MACRO DEPOSITID (ID INT)
AS
(
  SELECT * FROM DEPOSIT WHERE ACCOUNTNO=:ID;
);

EXECUTE DEPOSITID(2);
Copy
Ergebnis
+--------------+--------------+
| ACCOUNTNO    | ACCOUNTNAME  |
|--------------+--------------|
| 2            | Account 2    |
+--------------+--------------+

Copy
Snowflake Scripting
Abfrage
 CREATE OR REPLACE PROCEDURE DEPOSITID (ID FLOAT)
RETURNS TABLE ()
LANGUAGE SQL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"teradata"}}'
EXECUTE AS CALLER
AS
$$
    BEGIN
        LET res RESULTSET := (SELECT * FROM DEPOSIT WHERE ACCOUNTNO=:ID);
        RETURN TABLE(res);
    END;
$$;

CALL DEPOSITID(2);
Copy
Ergebnis
+--------------+--------------+
| ACCOUNTNO    | ACCOUNTNAME  |
|--------------+--------------|
| 2            | Account 2    |
+--------------+--------------+

Copy

Makro ruft ein anderes Makro auf

SnowConvert AI unterstützt das Szenario, bei dem ein Makro ein anderes Makro aufruft und durch Transientität ein Resultset zurückgegeben wird, indem die Ergebnisse von RESULT_SCAN(LAST_QUERY_ID()) von Snowflake abgerufen werden.

Teradata
Abfrage
 REPLACE MACRO MacroCallOtherMacro (ID INT)
AS
(
    EXECUTE DEPOSITID(:ID);
);

EXECUTE MacroCallOtherMacro(2);
Copy
Ergebnis
+--------------+--------------+
| ACCOUNTNO    | ACCOUNTNAME  |
|--------------+--------------|
| 2            | Account 2    |
+--------------+--------------+

Copy
Snowflake Scripting
Abfrage
 CREATE OR REPLACE PROCEDURE MacroCallOtherMacro (ID FLOAT)
RETURNS TABLE (
)
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "teradata",  "convertedOn": "09/09/2024" }}'
EXECUTE AS CALLER
AS
$$
    BEGIN
        CALL DEPOSITID(:ID);
        LET res RESULTSET :=
        (
            SELECT
                *
            FROM
                TABLE(RESULT_SCAN(LAST_QUERY_ID()))
        );
        RETURN TABLE(res);
    END;
$$;

CALL MacroCallOtherMacro(2);
Copy
Ergebnis
+--------------+--------------+
| ACCOUNTNO    | ACCOUNTNAME  |
|--------------+--------------|
| 2            | Account 2    |
+--------------+--------------+

Copy

Makro ohne Resultset

Nicht alle Makros sind dazu gedacht, ein Resultset zurückzugeben. Das erwähnte Szenario wird ebenfalls unterstützt.

Teradata
Abfrage
 REPLACE MACRO MacroWithoutSelect (ACCOUNTNO NUMBER, ACCOUNTNAME VARCHAR(100))
AS
(
  INSERT INTO DEPOSIT VALUES (:ACCOUNTNO, :ACCOUNTNAME);
);

EXECUTE MacroWithoutSelect(5, 'Account 5');
SELECT * FROM DEPOSIT;
Copy
Ergebnis
+--------------+--------------+
| ACCOUNTNO    | ACCOUNTNAME  |
|--------------+--------------|
| 1            | Account 1    |
+--------------+--------------+
| 2            | Account 2    |
+--------------+--------------+
| 3            | Account 3    |
+--------------+--------------+
| 4            | Account 4    |
+--------------+--------------+
| 5            | Account 5    |
+--------------+--------------+

Copy
Snowflake Scripting
Abfrage
 CREATE OR REPLACE PROCEDURE MacroWithoutSelect (ACCOUNTNO FLOAT, ACCOUNTNAME VARCHAR(100))
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"teradata"}}'
EXECUTE AS CALLER
AS
$$
    BEGIN
        INSERT INTO DEPOSIT
        VALUES (:ACCOUNTNO, :ACCOUNTNAME);
    END;
$$;

CALL MacroWithoutSelect(5, 'Account 5');
SELECT * FROM DEPOSIT;
Copy
Ergebnis
+--------------+--------------+
| ACCOUNTNO    | ACCOUNTNAME  |
|--------------+--------------|
| 1            | Account 1    |
+--------------+--------------+
| 2            | Account 2    |
+--------------+--------------+
| 3            | Account 3    |
+--------------+--------------+
| 4            | Account 4    |
+--------------+--------------+
| 5            | Account 5    |
+--------------+--------------+

Copy

Makro gibt mehrere Resultsets zurück

In Teradata können Makros mehr als ein Resultset aus einem einzigen Makro zurückgeben.

Bei Snowflake Scripting-Prozeduren kann nur ein Resultset pro Prozedur zurückgegeben werden. Um die Verhaltensweise von Teradata zu replizieren, werden zwei oder mehr Resultsets, die zurückgegeben werden sollen, in temporären Tabellen gespeichert. Die Snowflake Scripting-Prozedur gibt ein Array mit den Namen der temporären Tabellen zurück.

Teradata
Abfrage
 REPLACE MACRO DEPOSITID (ID INT)
AS
(
  SELECT * FROM DEPOSIT WHERE ACCOUNTNO=4;
  SELECT * FROM DEPOSIT WHERE ACCOUNTNO=:ID;
  EXECUTE DEPOSITID(:ID);
);

EXECUTE DEPOSITID(2);
Copy
Resultset 1
+--------------+--------------+
| ACCOUNTNO    | ACCOUNTNAME  |
|--------------+--------------|
| 4            | Account 4    |
+--------------+--------------+

Copy
Resultset 2
+--------------+--------------+
| ACCOUNTNO    | ACCOUNTNAME  |
|--------------+--------------|
| 2            | Account 2    |
+--------------+--------------+

Copy
Snowflake Scripting
Abfrage
 CREATE OR REPLACE PROCEDURE DEPOSITID (ID FLOAT)
RETURNS ARRAY
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "teradata",  "convertedOn": "09/09/2024" }}'
EXECUTE AS CALLER
AS
$$
  DECLARE
    return_arr ARRAY := array_construct();
    tbl_nm VARCHAR;
  BEGIN
    tbl_nm := 'RESULTSET_' || REPLACE(UPPER(UUID_STRING()), '-', '_');
    CREATE OR REPLACE TEMPORARY TABLE IDENTIFIER(:tbl_nm) AS
      SELECT
        * FROM
        DEPOSIT
      WHERE ACCOUNTNO=4;
    return_arr := array_append(return_arr, :tbl_nm);
    tbl_nm := 'RESULTSET_' || REPLACE(UPPER(UUID_STRING()), '-', '_');
    CREATE OR REPLACE TEMPORARY TABLE IDENTIFIER(:tbl_nm) AS
      SELECT
        * FROM
        DEPOSIT
      WHERE ACCOUNTNO=:ID;
    return_arr := array_append(return_arr, :tbl_nm);
    CALL DEPOSITID(:ID);
    tbl_nm := 'RESULTSET_' || REPLACE(UPPER(UUID_STRING()), '-', '_');
    CREATE OR REPLACE TEMPORARY TABLE IDENTIFIER(:tbl_nm) AS
      SELECT
        *
      FROM
        TABLE(RESULT_SCAN(LAST_QUERY_ID()));
    return_arr := array_append(return_arr, :tbl_nm);
    --** SSC-FDM-0020 - MULTIPLE RESULT SETS ARE RETURNED IN TEMPORARY TABLES **
    RETURN return_arr;
  END;
$$;

CALL DEPOSITID(2);
Copy
Resultset 1
+-----------------------------------------------------+
| DEPOSIDID                                           |
|-----------------------------------------------------|
| [                                                   |
|  "RESULTSET_93D50CBB_F22C_418A_A88C_4E1DE101B500",  |
|  "RESULTSET_6BDE39D7_0554_406E_B52F_D9E863A3F15C"   |
| ]                                                   |
+-----------------------------------------------------+

Copy
Ergebnislisten visualisieren

Wenn Sie die obige Prozedur auf Snowflake ausführen, erhalten Sie ein Array mit temporären Tabellennamen zurück:

[ „RESULTSET_93D50CBB_F22C_418A_A88C_4E1DE101B500“, „RESULTSET_6BDE39D7_0554_406E_B52F_D9E863A3F15C“]

Sie müssen die folgenden Abfragen ausführen, um die Resultsets genau wie in Teradata anzuzeigen.

Abfrage
 SELECT * FROM table('RESULTSET_93D50CBB_F22C_418A_A88C_4E1DE101B500');
SELECT * FROM table('RESULTSET_6BDE39D7_0554_406E_B52F_D9E863A3F15C');
Copy
Resultset 1
+--------------+--------------+
| ACCOUNTNO    | ACCOUNTNAME  |
|--------------+--------------|
| 4            | Account 4    |
+--------------+--------------+

Copy
Resultset 2
+--------------+--------------+
| ACCOUNTNO    | ACCOUNTNAME  |
|--------------+--------------|
| 2            | Account 2    |
+--------------+--------------+

Copy

Bekannte Probleme

Es wurden keine Probleme gefunden.

Zugehörige EWIs

CREATE PROCEDURE

Übersetzungsreferenz zur Konvertierung der CREATE PROCEDURE-Klausel von Teradata in Snowflake Scripting

Beschreibung

Die CREATE PROCEDURE- und REPLACE PROCEDURE-Anweisungen in Teradata erzeugen oder ersetzen die Implementierung einer gespeicherten Prozedur und kompilieren sie.

Für weitere Informationen über CREATE PROCEDURE oder REPLACE PROCEDURE klicken Sie hier.

 -- Create/replace procedure syntax
{CREATE | REPLACE} PROCEDURE [database_name. | user_name.] procedure_name
    ([<parameter_definition>[, ...n]])
[<SQL_data_access>]
[DYNAMIC RESULT SETS number_of_sets]
[SQL SECURITY <privilege_option>]
statement;


<parameter_definition> := [IN | OUT | INOUT] parameter_name data_type 

<SQL_data_access> := {CONTAINS SQL | MODIFIES SQL DATA | READS SQL DATA}

<privilege_option> := {CREATOR | DEFINER | INVOKER | OWNER}
Copy

Beispielhafte Quellcode-Muster

Datenkonfiguration

Der folgende Code ist erforderlich, um die Beispielmuster in diesem Abschnitt auszuführen.

Teradata
 CREATE TABLE inventory (
    product_name VARCHAR(50),
    price INTEGER
);

INSERT INTO inventory VALUES ('Bread', 50);
INSERT INTO inventory VALUES ('Tuna', 150);
INSERT INTO inventory VALUES ('Gum', 20);
INSERT INTO inventory VALUES ('Milk', 80);
Copy
Snowflake
 CREATE OR REPLACE TABLE inventory (
    product_name VARCHAR(50),
    price INTEGER
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"teradata"}}'
;

INSERT INTO inventory
VALUES ('Bread', 50);

INSERT INTO inventory
VALUES ('Tuna', 150);

INSERT INTO inventory
VALUES ('Gum', 20);

INSERT INTO inventory
VALUES ('Milk', 80);
Copy

Grundlegende Prozedur

Teradata
Abfrage
 REPLACE PROCEDURE BasicProcedure(IN counterValue INTEGER)
BEGIN
    DECLARE productName VARCHAR(50);
    DECLARE productPrice INTEGER DEFAULT 0;
    DECLARE whileCounter INTEGER DEFAULT 0;
    SET productName = 'Salt';
    WHILE (whileCounter < counterValue) DO
        SET productPrice = 10 + productPrice;
        SET whileCounter = whileCounter + 1;
    END WHILE;
    INSERT INTO inventory VALUES (productName, productPrice);
END;

CALL BasicProcedure(5);
SELECT product_name, price FROM inventory WHERE product_name = 'Salt';
Copy
Ergebnis
+--------------+--------------+
| product_name |    price     |
|--------------+--------------|
| Salt         | 50           |
+--------------+--------------+

Copy
Snowflake Scripting
Abfrage
 CREATE OR REPLACE PROCEDURE BasicProcedure (COUNTERVALUE INTEGER)
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "teradata",  "convertedOn": "07/10/2025",  "domain": "no-domain-provided" }}'
EXECUTE AS CALLER
AS
$$
    DECLARE
        productName VARCHAR(50);
        productPrice INTEGER DEFAULT 0;
        whileCounter INTEGER DEFAULT 0;
    BEGIN
         
         
         
        productName := 'Salt';
            WHILE (:whileCounter < :counterValue) LOOP
            productPrice := 10 + productPrice;
            whileCounter := whileCounter + 1;
        END LOOP;
        INSERT INTO inventory
        VALUES (:productName, :productPrice);
    END;
$$;

CALL BasicProcedure(5);

SELECT
    product_name,
    price FROM
    inventory
WHERE
    UPPER(RTRIM( product_name)) = UPPER(RTRIM('Salt'));
Copy
Ergebnis
+--------------+--------------+
| product_name |    price     |
|--------------+--------------|
| Salt         | 50           |
+--------------+--------------+

Copy

Einzelner Out-Parameter

Teradata
Abfrage
 REPLACE PROCEDURE procedureLabelSingle(OUT Message VARCHAR(100))
BEGIN
    set Message = 'Assignment value. Thanks';
END;

CALL procedureLabelSingle(?);
Copy
Ergebnis
Message                 |
------------------------+
Assignment value. Thanks|

Copy
Snowflake Scripting
Abfrage
 CREATE OR REPLACE PROCEDURE procedureLabelSingle (MESSAGE OUT VARCHAR(100))
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "teradata",  "convertedOn": "07/23/2024" }}'
EXECUTE AS CALLER
AS
$$
    BEGIN
        Message := 'Assignment value. Thanks';
    END;
$$;

CALL procedureLabelSingle(?);
Copy
Ergebnis
+───────────────────────────────+
| PROCEDURELABELSINGLE          |
+───────────────────────────────+
| ""Assignment value. Thanks""  |
+───────────────────────────────+

Copy

Mehrere Out-Parameter

Teradata
Abfrage
 REPLACE PROCEDURE procedureLabelMultiple(OUT Message VARCHAR(100), OUT Message2 VARCHAR(100))
BEGIN
    set Message = 'Assignment value. Thanks';
    set Message2 = 'Assignment value2. Thanks';
END;

CALL procedureLabelSingle(?, ?);
Copy
Ergebnis
1                       |2                        |
------------------------+-------------------------+
Assignment value. Thanks|Assignment value2. Thanks|

Copy
Snowflake Scripting
Abfrage
 CREATE OR REPLACE PROCEDURE procedureLabelMultiple (MESSAGE OUT VARCHAR(100), MESSAGE2 OUT VARCHAR(100))
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "teradata",  "convertedOn": "07/16/2025",  "domain": "no-domain-provided" }}'
EXECUTE AS CALLER
AS
$$
    BEGIN
        Message := 'Assignment value. Thanks';
        Message2 := 'Assignment value2. Thanks';
    END;
$$;

--** SSC-FDM-0007 - MISSING DEPENDENT OBJECT "procedureLabelSingle" **
CALL procedureLabelSingle(?, ?);
Copy
Ergebnis
+─────────────────────────+────────────────────────────────+
| PROCEDURELABELMULTIPLE  |                                |
+─────────────────────────+────────────────────────────────+
| "{                      |                                |
| ""Message""             | ""Assignment value. Thanks"",  |
| ""Message2""            | ""Assignment value2. Thanks""  |
| }"                      |                                |
+─────────────────────────+────────────────────────────────+


Copy

Mehrere Out-Parameter mit dynamischen Resultsets

Teradata
Abfrage
 REPLACE PROCEDURE Procedure1(out product_name VARCHAR(50), out price integer)
DYNAMIC RESULT SETS 2
BEGIN
	DECLARE result_set CURSOR WITH RETURN ONLY FOR
	SELECT * FROM inventory;
    DECLARE result_set2 CURSOR WITH RETURN ONLY FOR
	SELECT * FROM inventory;
    SET price = 100;
    SET product_name = 'another2';
	OPEN result_set2;
	OPEN result_set;
END;

REPLACE PROCEDURE Procedure2()
BEGIN
 DECLARE price INTEGER;
 DECLARE productName varchar(10);
 CALL Procedure1(productName, price);
 INSERT INTO inventory VALUES(:productName, :price);
END;

CALL Procedure2();
Copy
Ergebnis
Snowflake Scripting
Abfrage
 --** SSC-FDM-0007 - MISSING DEPENDENT OBJECT "inventory" **
CREATE OR REPLACE PROCEDURE Procedure1 (PRODUCT_NAME OUT VARCHAR(50), PRICE OUT integer)
RETURNS ARRAY
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "teradata",  "convertedOn": "07/16/2025",  "domain": "no-domain-provided" }}'
EXECUTE AS CALLER
AS
$$
	DECLARE
		tbl_result_set VARCHAR;
		tbl_result_set2 VARCHAR;
		return_arr ARRAY := array_construct();
	BEGIN
		tbl_result_set := 'RESULTSET_' || REPLACE(UPPER(UUID_STRING()), '-', '_');
		CREATE OR REPLACE TEMPORARY TABLE IDENTIFIER(:tbl_result_set) AS
			SELECT
				* FROM
				inventory;
		LET result_set CURSOR
		FOR
			SELECT
				*
			FROM
				IDENTIFIER(?);
		tbl_result_set2 := 'RESULTSET_' || REPLACE(UPPER(UUID_STRING()), '-', '_');
		CREATE OR REPLACE TEMPORARY TABLE IDENTIFIER(:tbl_result_set2) AS
			SELECT
				* FROM
				inventory;
		LET result_set2 CURSOR
		FOR
			SELECT
				*
			FROM
				IDENTIFIER(?);
				price := 100;
				product_name := 'another2';
				OPEN result_set2 USING (tbl_result_set2);
				return_arr := array_append(return_arr, :tbl_result_set2);
				OPEN result_set USING (tbl_result_set);
				return_arr := array_append(return_arr, :tbl_result_set);
				--** SSC-FDM-0020 - MULTIPLE RESULT SETS ARE RETURNED IN TEMPORARY TABLES **
				RETURN return_arr;
	END;
$$;

--** SSC-FDM-0007 - MISSING DEPENDENT OBJECT "inventory" **
CREATE OR REPLACE PROCEDURE Procedure2 ()
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "teradata",  "convertedOn": "07/16/2025",  "domain": "no-domain-provided" }}'
EXECUTE AS CALLER
AS
$$
	DECLARE
				price INTEGER;
				productName varchar(10);
	BEGIN
				 
				 
				CALL Procedure1(:productName, :price);
				INSERT INTO inventory
				VALUES (:productName, :price);
	END;
$$;

CALL Procedure2();
Copy

Bekannte Probleme

1. SQL-Datenzugriff

Standardmäßig unterstützen Snowflake-Prozeduren die Ausführung aller Arten von SQL-Anweisungen, einschließlich Anweisungen zum Lesen oder Ändern von Daten, so dass die SQL-Klausel für den Datenzugriff nicht relevant ist. Diese Klausel wird bei der Konvertierung der Prozedur ignoriert.

2. Objekte der obersten Ebene im Assessment-Bericht

Elemente (temporäre Tabellen oder Ansichten) innerhalb von gespeicherten Prozeduren werden im Assessment-Bericht als Objekte der obersten Ebene gezählt. Das SnowConvert AI-Team arbeitet derzeit an einer Lösung für dieses Szenario.

Zugehörige EWIs

  1. [SSC-EWI-0073](../../../general/technical-documentation/issues-and-troubleshooting/conversion-issues/generalEWI. md#ssc-ewi-0073): Überprüfung der Funktionsäquivalenz ausstehend.

  2. SSC-FDM-0020: In temporären Tabellen werden mehrere Resultsets zurückgegeben.