SnowConvert: Teradataの問題

SSC-EWI-TD0069

この早期警告問題(EWI)はサポートされなくなりました。最新の情報については、 SSC-FDM-TD0031 ドキュメントをご参照ください。

重大性

説明

Teradataの関数 ST_SPHERICALDISTANCE とSnowflakeの関数 ST_DISTANCE は、地理的なポイント間の距離の計算が異なります。Teradataは(地球のような)球面上の2点間の距離を測定するためにHaversine式を使用しますが、Snowflakeの ST_DISTANCE は、2つの地理座標間の最小距離を決定するために別の方法を使用します。

コード例

入力コード:

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

出力コード

--The distance between New York and Los Angeles
SELECT
	Cast('POINT(-73.989308 40.741895)' As GEOGRAPHY) As location1,
	Cast('POINT(40.741895 34.053691)' As GEOGRAPHY) As location2,
	!!!RESOLVE EWI!!! /*** SSC-EWI-TD0069 - ST_DISTANCE RESULTS ARE SLIGHTLY DIFFERENT FROM ST_SPHERICALDISTANCE ***/!!!
	ST_DISTANCE(
	location1, location2) As Distance_In_km;
Copy

推奨事項

SSC-EWI-TD0079

例を明解で分かりやすくするため、出力コードの一部を削除しています

重大性

説明

この警告が表示されるのは、Normalize句の機能を再現するために必要な「期間」列が見つからないためです。

コード例

入力コード:

SELECT NORMALIZE emp_id, duration2 FROM project;
Copy

出力コード

!!!RESOLVE EWI!!! /*** SSC-EWI-TD0079 - THE REQUIRED PERIOD TYPE COLUMN WAS NOT FOUND ***/!!!
// SnowConvert Helpers Code section is omitted.
WITH NormalizeCTE AS
(
SELECT
T1.*,
SUM(GroupStartFlag)
OVER (
PARTITION BY
emp_id, duration2
ORDER BY
PeriodColumn_begin
ROWS UNBOUNDED PRECEDING) GroupID
FROM
(
SELECT 
emp_id,
duration2,
PUBLIC.PERIOD_BEGIN_UDF(PeriodColumn) PeriodColumn_begin,
PUBLIC.PERIOD_END_UDF(PeriodColumn) PeriodColumn_end,
(CASE
WHEN PeriodColumn_begin <= LAG(PeriodColumn_end)
OVER (
PARTITION BY
emp_id, duration2
ORDER BY
PeriodColumn_begin,
PeriodColumn_end)
THEN 0
ELSE 1
END) GroupStartFlag FROM 
project
) T1
)
SELECT
emp_id,
duration2,
PUBLIC.PERIOD_UDF(MIN(PeriodColumn_begin), MAX(PeriodColumn_end))
FROM
NormalizeCTE
GROUP BY
emp_id,
duration2,
GroupID;
Copy

推奨事項

  • この警告を解決するには、コード内の最初の期間列を探し、最初に定義されている場所以外の期間列への参照をすべて削除します。次に、「PeriodColumn」を見つけた列の名前に置き換えます。

  • その他のサポートについては、 snowconvert-support@snowflake.com にお問い合わせください

SSC-EWI-TD0008

重大性

説明

現在のところ、Snowflakeには、一部の文字列比較関数に直接相当するものはありません。

この EWI は、次の文字列比較メソッドのいずれかを使用する場合に表示されます。 jaron_gramLD (レーベンシュタイン距離)、 LDWS (代入ありのレーベンシュタイン距離)、 OSA (文字列配列最適化)、 DL (ダメラウ・レーベンシュタイン)、 hammingLCS (最長共通部分列)、 jaccardcosine または soundexcode

コード例

Teradataは、大規模データウェアハウスと分析に特化したリレーショナルデータベース管理システムです。

SELECT * FROM StringSimilarity (
  ON (
    SELECT CAST(a AS VARCHAR(200)) AS a, CAST(b AS VARCHAR(200)) AS b
    FROM table_1
  ) PARTITION BY ANY
  USING
  ComparisonColumnPairs ('ld(a,b) AS sim_fn')
) AS dt ORDER BY 1;
Copy

Snowflake Scripting:

SELECT
  * FROM
  !!!RESOLVE EWI!!! /*** SSC-EWI-TD0008 - FUNCTION FOR COMPARING STRINGS IS NOT SUPPORTED ***/!!! StringSimilarity (
   ON (
     SELECT CAST(a AS VARCHAR(200)) AS a, CAST(b AS VARCHAR(200)) AS b
     FROM table_1
   ) PARTITION BY ANY
   USING
   ComparisonColumnPairs ('ld(a,b) AS sim_fn')
 ) AS dt ORDER BY 1;
Copy

推奨事項

SSC-EWI-TD0059

重大性

説明

Teradataと同様に、ユーザーにデフォルトのタイムゾーンを設定すると、セッションに別のタイムゾーンが指定されるまで、すべてのセッションでそのタイムゾーンが使用されます。

この警告は、以前にTeradataユーザーに定義したタイムゾーンと同じタイムゾーンをSnowflakeに設定することを思い出させます。Snowflakeでタイムゾーンを設定するには、以下のクエリを実行します。

ALTER SESSION SET TIMEZONE = 「等価タイムゾーン」

注意: Snowflakeは、 IANA タイムゾーンデータベース からのタイムゾーンのみを受け入れます。

コード例

入力コード:

SET TIME ZONE USER;
Copy

出力コード:

!!!RESOLVE EWI!!! /*** SSC-EWI-TD0059 - SNOWFLAKE USER DEFAULT TIME ZONE MAY REQUIRE CONFIGURATION TO MATCH TERADATA VALUE ***/!!!
ALTER SESSION UNSET TIMEZONE;
Copy

推奨事項

  • ユーザーのデフォルトのタイムゾーンは、元のTeradataユーザーのタイムゾーン設定と一致するように構成してください。

  • その他のサポートについては、 snowconvert-support@snowflake.com にお問い合わせください

SSC-EWI-TD0049

重大性

説明

ツールは、 TPT の DML ステートメントを処理して変換することができませんでした。これは通常、次のような場合に起こります。

  • スクリプト変数はステートメント内で連結されている

  • ステートメントにエスケープされた引用符が含まれている

コード例

入力コード:

-- Script1.tpt
DEFINE JOB load_job
DESCRIPTION 'LOAD TABLE FROM A FILE'
  (
     DEFINE SCHEMA schema_name
     DESCRIPTION 'define SCHEMA'
   (
       var1 VARCHAR (50)
   );

   STEP setup_tables
   (
      APPLY
       ('RELEASE MLOAD database_name.table_name;')
     TO OPERATOR (DDL_OPERATOR() );

   );
);
Copy

出力コード:

#*** Generated code is based on the SnowConvert 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
import argparse
args = None
# Script1.tpt
class load_job:
    #'LOAD TABLE FROM A FILE'

  jobname = "load_job"
    #'define SCHEMA'

  schema_name = """(
var1 VARCHAR(50)
);"""
  def setup_tables(self):
    self.DDL_OPERATOR()
    !!!RESOLVE EWI!!! /*** SSC-EWI-TD0049 - THE FOLLOWING STATEMENT COULD NOT BE PROCESSED ***/!!!
      #'RELEASE MLOAD database_name.table_name;'


con = None
def main():
  snowconvert.helpers.configure_log()
  con = snowconvert.helpers.log_on()
  _load_job = load_job()
  _load_job.setup_tables()
  snowconvert.helpers.quit_application()

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

推奨事項

  • この問題を解決するには、 INSERT ステートメントを手動で記述するか、 SnowConvert チームに連絡し、現在サポートされていないこの特定の DML ステートメントのサポートをリクエストします。

  • その他のサポートについては、 snowconvert-support@snowflake.com にメールでご連絡ください

SSC-EWI-TD0009

重大性

説明

Teradataのテンポラルテーブルは、派生期間列を使用して、列レベルで時間ベースのデータを追跡します。この機能は現在Snowflakeでは利用できません。

コード例

Teradata:

CREATE MULTISET TABLE Policy(
      Policy_ID INTEGER,
      Customer_ID INTEGER,
      Policy_Type CHAR(2) NOT NULL,
      Policy_Details CHAR(40),
      Policy_Start DATE NOT NULL,
      Policy_End DATE NOT NULL,
      PERIOD FOR Validity(Policy_Start,Policy_End) AS VALIDTIME
      )
   PRIMARY INDEX(Policy_ID);
Copy

Snowflake Scripting:

CREATE OR REPLACE TABLE Policy (
   Policy_ID INTEGER,
   Customer_ID INTEGER,
   Policy_Type CHAR(2) NOT NULL,
   Policy_Details CHAR(40),
   Policy_Start DATE NOT NULL,
   Policy_End DATE NOT NULL,
   !!!RESOLVE EWI!!! /*** SSC-EWI-TD0009 - TEMPORAL COLUMN NOT SUPPORTED ***/!!!
         PERIOD FOR Validity(Policy_Start,Policy_End) AS VALIDTIME
         )
         COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"teradata"}}'
         ;
Copy

推奨事項

SSC-EWI-TD0039

重大性

説明

使用しようとしているファイル形式はSnowflakeと互換性がありません。

コード例

入力:

SELECT
    CAST('01-12-2020' AS DATE FORMAT 'dd-mm-yyyy'),
    CAST('01-12-2020' AS DATE FORMAT 'DDDBEEEE');
Copy

出力:

SELECT
    TO_DATE('01-12-2020', 'DD-MM-YYYY') !!!RESOLVE EWI!!! /*** SSC-EWI-TD0025 - OUTPUT FORMAT 'dd-mm-yyyy' NOT SUPPORTED. ***/!!!,
    TO_DATE('01-12-2020', 'DDD EEEE') !!!RESOLVE EWI!!! /*** SSC-EWI-TD0025 - OUTPUT FORMAT 'DDDBEEEE' NOT SUPPORTED. ***/!!!!!!RESOLVE EWI!!! /*** SSC-EWI-TD0039 - INPUT FORMAT 'DDD EEEE' NOT SUPPORTED ***/!!!;
Copy

推奨事項

SSC-EWI-TD0068

重大性

説明

Teradataプロファイルを使用すると、ストレージスペースを管理し、パスワード制限を管理する複数の共有パラメーターを設定できます。

Snowflakeはクラウドアーキテクチャを通じてストレージを管理し、すべての最適化を自動的に処理する ため、ユーザー側のストレージ構成は不要です。さらに、すべてのユーザーに普遍的に適用され、カスタマイズできない 標準パスワードポリシーをSnowflakeは強制 します。

このエラーは、Teradataプロファイル参照が検出され、Snowflakeロール参照に変換されたときに発生します。SnowflakeのロールはTeradataプロファイルに最も近いものですが、Teradataのプロファイル名がSnowflakeのロール名と一致しないと、クエリ結果が異なる場合があります。

コード例

入力コード:

SELECT PROFILE;
Copy

出力コード:

SELECT
CURRENT_ROLE() !!!RESOLVE EWI!!! /*** SSC-EWI-TD0068 - SNOWFLAKE DOES NOT SUPPORT PROFILES, REFERENCING ROLE INSTEAD ***/!!!;
Copy

推奨事項

  • ユーザープロファイルはサポートされていないため、クエリでは使用しないでください。ユーザーのプロファイル名とロール名が異なる場合は、クエリ結果が異なることがあります。

  • その他のサポートについては、 snowconvert-support@snowflake.com にお問い合わせください

SSC-EWI-TD0029

重大性

説明

この警告は、 TABLEQUEUE 属性を使用している場合に表示されます。Snowflakeは QUEUE キーワードをサポートしていないため、移行時に削除されます。

コード例

入力:

CREATE MULTISET TABLE SAMPLE_TABLE,
QUEUE,
NO FALLBACK
(
    COL1 INTEGER
);
Copy

出力:

!!!RESOLVE EWI!!! /*** SSC-EWI-TD0029 - QUEUE TABLE FUNCTIONALITY NOT SUPPORTED ***/!!!
CREATE OR REPLACE TABLE SAMPLE_TABLE
(
    COL1 INTEGER
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"teradata"}}'
;
Copy

推奨事項

SSC-EWI-TD0063

例を明解で分かりやすくするため、出力コードの一部を削除しています

重大性

説明

このエラーは、 SnowConvert が JSON のパス文字列に遭遇したときに発生します。このパス文字列は、必要な JSON 形式に従っておらず、適切に逆シリアル化できません。

コード例

入力コード:

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

出力コード:

SELECT
    *
FROM
    !!!RESOLVE EWI!!! /*** SSC-EWI-TD0063 - 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

推奨事項

  • JSON のパスの形式が正しく、無効な文字が含まれていないことを検証します。

  • その他のサポートについては、 snowconvert-support@snowflake.com にお問い合わせください

SSC-EWI-TD0057

重大性

説明

NEW JSON 関数は、文字列またはバイナリ形式の JSON データを受け付けます。データがバイナリ形式の場合、Snowflakeは JSON オブジェクトに関するバイナリ形式のメタデータを解釈できないため、関数は変更されません。詳細は、Teradata NEW JSON ドキュメント をご参照ください。

コード例

入力コード

SELECT NEW JSON ('160000000268656C6C6F0006000000776F726C640000'xb, BSON);
Copy

出力コード

SELECT
!!!RESOLVE EWI!!! /*** SSC-EWI-TD0057 - NEW JSON FUNCTION WITH BINARY DATA IS NOT SUPPORTED ***/!!!!!!RESOLVE EWI!!! /*** SSC-EWI-TD0039 - INPUT FORMAT 'BSON' NOT SUPPORTED ***/!!!
NEW JSON (TO_BINARY('160000000268656C6C6F0006000000776F726C640000'), BSON);
Copy

推奨事項

SSC-EWI-TD0006

重大性

説明

FLOAT データ型は、 DEFAULT TIMEDEFAULT DATEDEFAULT CURRENT_DATEDEFAULT CURRENT_TIMEDEFAULT CURRENT_TIMESTAMP 仕様を使用したデフォルト値をサポートしていません。

コード例

Teradata:

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

推奨事項

  • ユーザー側からのアクションは必要ありません。

  • その他のサポートについては、 snowconvert-support@snowflake.com にお問い合わせください

SSC-EWI-TD0002

この EWI は SnowConvert 28.1.100リリース以降、廃止されました。

重大性

説明

SQL ステートメントに INTERVAL タイプの列セレクターが含まれる場合、 SnowConvert は EWI (エラー、警告、情報)メッセージを追加し、スタブ関数を作成します。Snowflakeは INTERVAL データ型をサポートしていないため、変換処理完了後に手動での操作が必要になります。

コード例

Teradata:

SELECT
     CAST('07:00' AS INTERVAL HOUR(2) TO MINUTE),
     CAST('08:00' AS INTERVAL HOUR(2) TO MINUTE) As Test_Interval;
Copy

Snowflake Scripting:

SELECT
     !!!RESOLVE EWI!!! /*** SSC-EWI-TD0002 - INTERVAL TYPE NOT SUPPORTED IN SNOWFLAKE ***/!!!
     INTERVAL '07 hour, 00 min',
     !!!RESOLVE EWI!!! /*** SSC-EWI-TD0002 - INTERVAL TYPE NOT SUPPORTED IN SNOWFLAKE ***/!!!
     INTERVAL '08 hour, 00 min' As Test_Interval;
Copy

推奨事項

SSC-EWI-TD0053

例を明確で分かりやすくするため、コードの一部を削除しています。

生成されるvarchar表現の精度

PERIOD_UDF 関数は、Snowflakeのデフォルトのタイムスタンプと時間形式を使用して期間の文字列表現を作成します。デフォルトでは、タイムスタンプには精度のために小数点以下3桁が含まれますが、時刻変数には小数点以下はありません。出力文字列の精度を調整する必要がある場合は、2つのオプションが利用可能です。

PRECISIONDIGITS パラメーターには、 PERIOD_UDF の3パラメーターバージョンを使用します。このパラメーターは、0から9までの整数を指定し、結果の小数部分の10進数を制御します。Snowflakeは小数点以下9桁までサポートしていますが、Teradataは6桁までしかサポートしていません。例:

呼び出し

結果

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'

  • セッション出力の時間形式を設定する: ALTER SESSION SET TIMESTAMP_NTZ_OUTPUT_FORMAT = <format>ALTER SESSION SET TIME_OUTPUT_FORMAT = <format> のコマンドを使って、セッションでのタイムスタンプと時刻の表示方法を変更します。

現在のセッションのSnowflakeのデフォルト形式を変更して、希望する精度桁数を指定することができます。これらの変更は、セッション中、 PERIOD_UDF の以降の実行すべてに影響します。

コード例

入力コード:

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

出力コード:

CREATE OR REPLACE TABLE vacations (
    employeeName varchar(50),
    duration VARCHAR(24) !!!RESOLVE EWI!!! /*** SSC-EWI-TD0053 - 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') !!!RESOLVE EWI!!! /*** SSC-EWI-TD0053 - SNOWFLAKE DOES NOT SUPPORT THE PERIOD DATATYPE, ALL PERIODS ARE HANDLED AS VARCHAR INSTEAD ***/!!!);

SELECT
    PUBLIC.PERIOD_END_UDF(duration) !!!RESOLVE EWI!!! /*** SSC-EWI-TD0053 - SNOWFLAKE DOES NOT SUPPORT THE PERIOD DATATYPE, ALL PERIODS ARE HANDLED AS VARCHAR INSTEAD ***/!!! from
    vacations;
Copy

推奨事項

  • PERIOD およびその関連関数は、varcharデータ型を使用してシミュレートされているため、結果の正確性を検証することをお勧めします。

  • その他のサポートについては、 snowconvert-support@snowflake.com にお問い合わせください

SSC-EWI-TD0077

例を明解で分かりやすくするため、出力コードの一部を削除しています

重大性

中程度

説明

SnowConvert (SC)は、バイナリ比較演算子(<=、>=または=)を使用する RESET WHEN 句のみをサポートしています。IS NOT NULL などの他の条件を使用した場合、Snowflakeはこれらの条件をサポートしていないため、 SC は RESET WHEN 句を削除し、エラーメッセージを表示します。

このエラーメッセージは、 RESET WHEN 条件が、移行ツールが検索できない式を参照している場合に表示されます。現在のところ、このツールは同じクエリ内で定義された列エイリアスのみをサポートしています。

コード例

Condition is not binary

入力コード:

SELECT
    account_id,
    month_id,
    balance,
    ROW_NUMBER() OVER (
        PARTITION BY account_id
        ORDER BY month_id
        RESET WHEN balance IS NOT NULL
        ROWS UNBOUNDED PRECEDING
    ) as balance_increase
FROM account_balance
ORDER BY 1,2;
Copy

出力コード

// SnowConvert Helpers Code section is omitted.
SELECT
    account_id,
    month_id,
    balance,
    ROW_NUMBER() OVER (
        PARTITION BY account_id
    !!!RESOLVE EWI!!! /*** SSC-EWI-TD0077 - RESET WHEN CLAUSE IS NOT SUPPORTED IN THIS SCENARIO DUE TO ITS CONDITION ***/!!!
        ORDER BY month_id
        ROWS UNBOUNDED PRECEDING
    ) as balance_increase
FROM
    account_balance
ORDER BY 1,2;
Copy

Condition expression was not found

入力コード:

SELECT
    account_id,
    month_id,
    balance,
    ROW_NUMBER() OVER (
        PARTITION BY account_id
        ORDER BY month_id
        RESET WHEN balance <= not_found_expresion
    ) as balance_increase
FROM account_balance
ORDER BY 1,2;
Copy

出力コード

// SnowConvert Helpers Code section is omitted.
SELECT
    account_id,
    month_id,
    balance,
    ROW_NUMBER() OVER (
        PARTITION BY account_id
    !!!RESOLVE EWI!!! /*** SSC-EWI-TD0077 - RESET WHEN CLAUSE IS NOT SUPPORTED IN THIS SCENARIO DUE TO ITS CONDITION ***/!!!
        ORDER BY month_id
    ) as balance_increase
FROM
    account_balance
ORDER BY 1,2;
Copy

推奨事項

SSC-EWI-TD0012

重大性

説明

この警告は、 SnowConvert が DEFAULT 値を持つ BINARY データ型の列を検出した場合に表示されます。Snowflakeは BINARY 列のデフォルト値をサポートしていないため、 SnowConvert は DEFAULT 値指定を削除します。

コード例

Teradata:

CREATE TABLE TableExample
(
ColumnExample BINARY DEFAULT '00000000'XB NOT NULL
)
Copy

Snowflake Scripting:

CREATE OR REPLACE TABLE TableExample (
ColumnExample BINARY DEFAULT NOT TO_BINARY('00000000') !!!RESOLVE EWI!!! /*** SSC-EWI-TD0012 - BINARY DOES NOT SUPPORT DEFAULT NOT TO_BINARY('00000000') ***/!!! NULL
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"teradata"}}'
;
Copy

推奨事項

SSC-EWI-TD0003

重大性

説明

Snowflakeでは、トリム関数(LTRIM、 RTRIM、 または TRIM)は、空白文字や空白文字を削除する場合にのみ照合順序をサポートします。他の文字タイプの照合順序はサポートしていません。

SnowConvert が照合列で LTRIMRTRIM、または TRIMLEADING または TRAILING オプションあり)関数に遭遇すると、自動的に COLLATE 関数を追加します。この関数は、トリム処理を適用する前に入力列の非照合コピーを作成します。早期警告インジケーター(EWI)は、トリム関数が適用される前に列の照合順序が削除されたことを警告します。その結果、トリミングされた出力には照合順序の設定がないため、この結果を使用した後の文字列比較に影響を与える可能性があります。

コード例

Teradata:

CREATE TABLE collateTable (
	col1 VARCHAR(50) CHARACTER SET LATIN NOT CASESPECIFIC
);

SELECT
    TRIM(BOTH '0' FROM col1),
    TRIM(LEADING '  ' FROM col1),
    TRIM(TRAILING '0' FROM col1),
    LTRIM(col1, '0'),
    RTRIM(col1)
FROM
    collateTable;
Copy

Snowflake Scripting:

CREATE OR REPLACE TABLE collateTable (
	col1 VARCHAR(50) COLLATE 'en-cs'
)
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "teradata",  "convertedOn": "06/17/2024" }}'
;

SELECT
	TRIM(COLLATE(col1, ''), '0') !!!RESOLVE EWI!!! /*** SSC-EWI-TD0003 - COLLATION NOT SUPPORTED IN TRIM FUNCTIONS, ADD ORIGINAL COLLATION TO FUNCTION RESULT TO PRESERVE IT ***/!!!,
	LTRIM(col1, '  '),
	RTRIM(COLLATE(col1, ''), '0') !!!RESOLVE EWI!!! /*** SSC-EWI-TD0003 - COLLATION NOT SUPPORTED IN TRIM FUNCTIONS, ADD ORIGINAL COLLATION TO FUNCTION RESULT TO PRESERVE IT ***/!!!,
	LTRIM(COLLATE(col1, ''), '0') !!!RESOLVE EWI!!! /*** SSC-EWI-TD0003 - COLLATION NOT SUPPORTED IN TRIM FUNCTIONS, ADD ORIGINAL COLLATION TO FUNCTION RESULT TO PRESERVE IT ***/!!!,
	RTRIM(col1)
	FROM
	collateTable;
Copy

推奨事項

  • 一貫した比較動作を維持するために、 COLLATE 関数を使用して、 TRIM 関数の結果に元の列の照合順序を追加します。第2引数にリテラル文字列として元の照合順序値を指定します。

  • その他のサポートについては、 snowconvert-support@snowflake.com にお問い合わせください

SSC-EWI-TD0052

重大性

説明

TeradataもSnowflakeも、文字列値を数値パラメーターを期待する関数に渡すと、自動的に数値に変換します。文字列値は解析され、等価な数値に変換されます。

Teradataとターゲット言語では、数値文字列の扱いが異なります。Teradataはより柔軟で、様々な文字列形式を数値として解析することができます。

  • 空文字列または空白のみの文字列

  • ダッシュを埋め込んだ文字列

  • 仮数または指数に桁のない数値

  • 通貨記号

  • 桁区切りのある数字

  • 数字の後に符号が付く数字

  • '1-2-3-4-5' -> 12345

  • '$50' -> 50

  • '5000-' -> -5000

  • '1,569,284.55' -> 1569284.55

Snowflakeは 自動的にオプティミスティック文字列変換 を使用し、文字列が TM9 または TME 形式のいずれかに一致することを期待します。文字列がこれらの形式に一致しない場合、変換は失敗します。これに対処するため、 SnowConvert は、 TM9 または TME の形式に一致する文字列を生成して、数値への変換が必要な文字列リテラルを処理します。これにより、Snowflakeはそれらを正しく解析できるようになります。この変換はリテラル文字列値に対してのみ機能することに注意してください。リテラルでない値はSnowflakeによって正常に解析されない可能性があります。

コード例

入力コード:

create table myTable(
    stringCol varchar(30)
);

insert into myTable values ('   1,236,857.45-');

select cos('   1,236,857.45-');

select cos(stringCol) from myTable;
Copy

出力コード:

CREATE OR REPLACE TABLE myTable (
    stringCol varchar(30)
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"teradata"}}'
;

INSERT INTO myTable
VALUES ('   1,236,857.45-');

SELECT
    cos('-1236857.45');

SELECT
    cos(stringCol !!!RESOLVE EWI!!! /*** SSC-EWI-TD0052 - SNOWFLAKE IMPLICIT CONVERSION TO NUMERIC DIFFERS FROM TERADATA AND MAY FAIL FOR NON-LITERAL STRING VALUES ***/!!!)
from
    myTable;
Copy

推奨事項

  • ユーザー側からのアクションは必要ありません。

  • その他のサポートについては、 snowconvert-support@snowflake.com にお問い合わせください

SSC-EWI-TD0066

例を明解で分かりやすくするため、出力コードの一部を削除しています

重大性

説明

このメッセージは、 SnowConvert でTeradata Unicode区切り識別子にSnowflakeでサポートされていない文字が含まれている場合に表示されます。詳細情報については、 Teradata Unicode区切り識別子 をご参照ください。

コード例

入力コード:

SELECT * FROM U&"#000f#ffff" UESCAPE '#';
Copy

出力コード:

// SnowConvert Helpers Code section is omitted.
SELECT
* FROM
!!!RESOLVE EWI!!! /*** SSC-EWI-TD0066 - THE FOLLOWING IDENTIFIER HAS ONE OR MORE UNICODE ESCAPE CHARACTERS THAT ARE INVALID IN SNOWFLAKE ***/!!!
"\u000f\uffff";
Copy

推奨事項

  • Snowflakeで識別子を作成する際には、有効なUnicode文字のみを使用します。

  • その他のサポートについては、 snowconvert-support@snowflake.com にお問い合わせください

SSC-EWI-TD0027

重大性

説明

Snowflakeは、 VALIDTIME や TRANSACTIONTIME などのTeradata組み込みのテンポラル時間属性をサポートしていないため、 EWI (エラー、警告、情報)メッセージが表示されます。

コード例

Teradataの入力:

CREATE MULTISET TABLE SAMPLE_TABLE
(
    COL1 PERIOD(TIMESTAMP(6) WITH TIME ZONE) NOT NULL AS TRANSACTIONTIME
);
Copy

Snowflakeの出力:

CREATE OR REPLACE TABLE SAMPLE_TABLE (
       COL1 VARCHAR(68) NOT NULL !!!RESOLVE EWI!!! /*** SSC-EWI-TD0027 - SNOWFLAKE DOES NOT SUPPORT 'TRANSACTIONTIME' COLUMN OPTION ***/!!!!!!RESOLVE EWI!!! /*** SSC-EWI-TD0053 - 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"}}'
;
Copy

推奨事項

  • TIMESTAMP 列を手動で作成し、そのデフォルト値を CURRENT_TIMESTAMP に設定します。

  • テーブルストリームを使用してデータの変更を追跡し、変更ごとにメタデータを取得します。(ガイド)

  • その他のサポートについては、 snowconvert-support@snowflake.com にお問い合わせください

SSC-EWI-TD0076

重大性

中程度

説明

Teradataの 外部テーブル を使用すると、Amazon S3、Azure Blobストレージ、Google Cloud Storageなどの外部の場所に格納されたデータにアクセスできます。Snowflakeはこの構文をサポートしていませんが、似たような関数を使用することができます。

  • 外部テーブル

  • Icebergテーブル

  • 標準テーブル

コード例

入力コード:

SELECT cust_id, income, age FROM
FOREIGN TABLE (SELECT cust_id, income, age FROM twm_customer)@hadoop1 T1;
Copy

出力コード:

SELECT
cust_id,
income,
age FROM
!!!RESOLVE EWI!!! /*** SSC-EWI-TD0076 - THE USE OF FOREIGN TABLES IS NOT SUPPORTED IN SNOWFLAKE. ***/!!!
 FOREIGN TABLE (SELECT cust_id, income, age FROM twm_customer)@hadoop1 T1;
Copy

推奨事項

  • Teradataの外部テーブルを置き換えるには、 Snowflakeの外部テーブル を使用します。これらのテーブルは、クラウドストレージプラットフォーム(Amazon S3、Google Cloud Storage、Microsoft Azure)から直接データを読み込みます。これにより、データレイクファイルをデータベーステーブルのようにクエリできます。外部テーブルは、 COPY INTO <テーブル> コマンドで動作するすべてのファイル形式をサポートしています。

  • SnowflakeのIcebergテーブル は、もう一つの選択肢を提供します。これらのテーブルはオープン形式を使用し、データをParquetファイルとして独自のクラウドストレージに格納します。

  • 標準のSnowflakeテーブル は、Teradataの外部テーブル機能を置き換えることもできます。

  • その他のヘルプについては、 snowconvert-support@snowflake.com にお問い合わせください

SSC-EWI-TD0091

分かりやすくするため、出力コードのセクションの一部を削除しています。

重大性

説明

Teradataスクリプトでは、 CAST 式を使用して、次の構文でデータ型を変換できます。

<expression> ( <DataType> )
Copy

DATE または TIME のある CAST を使ってデータ型を変換する場合、これらのキーワードはそれぞれ CURRENT_DATECURRENT_TIME 関数としても機能するため、曖昧さが生じる可能性があります。

そのため、 CAST 操作を必要とする式に関する追加のコンテキストなしでコードを調べる場合、本物の CAST 操作と、単に DATE または TIME パラメーターを入力として受け取る関数を区別することが難しくなります。

<expression> が列なのかユーザー定義関数(UDF)なのかを判断するには、コードを変換する際に対応する CREATE TABLE または CREATE FUNCTION ステートメントを含める必要があります。これにより、式の定義に関する必要なコンテキストが提供されます。

たとえば、次の SELECT ステートメントを見てみましょう。AMBIGUOUS_EXPR に遭遇したとき、追加的な文脈がなければ、それが関数呼び出しを表しているのか、 DATE へのタイプ変換を表しているのかを判断することはできません。しかし、 COL1 (DATE) はタイプ変換(CAST)の操作であることは確かです。なぜなら、 COL1 はテーブル TAB の列だからです。

CREATE TABLE TAB (
    COL1 VARCHAR(23)
)

SELECT
    COL1 (DATE),
    AMBIGUOUS_EXPR (DATE)
FROM TAB;
Copy

コード例

入力コード:

CREATE TABLE TAB (
    COL1 VARCHAR(23)
)

SELECT
    COL1 (DATE),
    AMBIGUOUS_EXPR (DATE)
FROM TAB;
Copy

出力コード

CREATE OR REPLACE TABLE TAB (
    COL1 VARCHAR(23)
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"teradata"}}'
;

SELECT
    TO_DATE(
    COL1, 'YYYY/MM/DD') AS COL1,
    !!!RESOLVE EWI!!! /*** SSC-EWI-TD0091 - EXPRESSION CONVERTED AS CAST BY DEFAULT. CONVERSION MIGHT PRESENT ERRORS DUE TO MISSING DEPENDENCIES FOR 'AMBIGUOUS_EXPR'. ***/!!!
    AMBIGUOUS_EXPR :: DATE
    FROM
    TAB;
Copy

推奨事項

SSC-EWI-TD0017

重大性

説明

この警告は、 GLOBAL TEMPORARY TRACE オプションを含むCreate Tableステートメントを SnowConvert が検出したときに表示されます。この機能は、Teradata(TRACE 機能))固有のもので、Snowflakeでは利用することができず、変換中に削除されます。

コード例

Teradata:

CREATE GLOBAL TEMPORARY TRACE TABLE TableExample
(
ColumnExample Number
)
Copy

Snowflake Scripting:

!!!RESOLVE EWI!!! /*** SSC-EWI-TD0017 - GLOBAL TEMPORARY TABLE TRACE FUNCTIONALITY NOT SUPPORTED ***/!!!
CREATE OR REPLACE TABLE TableExample (
ColumnExample NUMBER(38, 18)
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"teradata"}}'
;
Copy

推奨事項

  • 注意: Snowflakeのトレース機能は、 EVENT TABLE を使用して再現することができます。詳細情報については、 ログとトレース に関するSnowflakeドキュメントをご参照ください。

  • その他のサポートについては、 snowconvert-support@snowflake.com にお問い合わせください

SSC-EWI-TD0046

重大性

説明

このエラーは、 DBC テーブルを参照するときに発生します。選択された列がSnowflakeに対応するものがありません。

コード例

入力:

CREATE VIEW SAMPLE_VIEW
AS
SELECT PROTECTIONTYPE FROM DBC.DATABASES;
Copy

出力:

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

推奨事項

SSC-EWI-TD0023

重大性

説明

ACTIVITY_COUNT ステータス変数は、埋め込み SQL またはストアドプロシージャで使用された SQL DML ステートメント(INSERT、 UPDATE、 DELETE など)によって変更された行数を示します。詳細は こちら をご覧ください。

ACTIVITY_COUNT の動作を再現するには、翻訳仕様に記載されている回避策を使用することができます。

SELECT $1 FROM TABLE(RESULT_SCAN(LAST_QUERY_ID()));
Copy

SELECT または SET INTO VARIABLE ステートメントで ACTIVITY_COUNT を使用する場合は、前述の回避策で直接代用することができません。

コード例

Teradata

REPLACE PROCEDURE InsertEmployeeSalaryAndLog_4 ()
BEGIN
    DECLARE rowCount 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 ACTIVITY_COUNT INTO rowCount;
    SET message = 'ROWS INSERTED: ' || rowCount;

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

Snowflake

CREATE OR REPLACE PROCEDURE InsertEmployeeSalaryAndLog_4 ()
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
               rowCount 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
            ACTIVITY_COUNT !!!RESOLVE EWI!!! /*** SSC-EWI-TD0023 - ACTIVITY_COUNT INSIDE SELECT/SET INTO VARIABLE REQUIRES MANUAL FIX ***/!!! INTO
            :rowCount;
            message := 'ROWS INSERTED: ' || rowCount;

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

マニュアル修正

挿入、更新、または削除された行数を取得するには、上記の回避策の一部を使用することができます。

CREATE OR REPLACE PROCEDURE InsertEmployeeSalaryAndLog_4 ()
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
               rowCount 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 $1 INTO :rowCount FROM TABLE(RESULT_SCAN(LAST_QUERY_ID()));
            message := 'ROWS INSERTED: ' || rowCount;

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

このクエリをSnowflakeで使用するには、Snowflakeの SELECT INTO VARIABLE 構文を使うように修正する必要があります。

さらに、 RESULT_SCAN(LAST_QUERY_ID()) を使用したときに正しくない結果に気づいた場合は、 SSC-FDM-TD0033 で潜在的な制限とその対処法に関する情報をご参照ください。

推奨事項

  • 推奨される回避策を手動で適用します。

  • SSC-FDM-TD0033 を見直し、 LAST_QUERY_ID を使用することの限界とその対処法を理解します。

  • その他のサポートについては、 snowconvert-support@snowflake.com にお問い合わせください

SSC-EWI-TD0051

重大性

説明

バイトデータ型を扱う場合、TeradataとSnowflakeには重要な違いがあります。

この違いを説明するために例を挙げましょう。

Teradata:

create table exampleTable(
	bytecol byte(10)
);

insert into exampleTable values ('2B'XB);

select bytes(bytecol) from exampleTable;
-- Will return 10, the size of bytecol
Copy

Snowflakeのコードに相当します。

CREATE OR REPLACE TABLE exampleTable (
	bytecol BINARY
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"teradata"}}'
;

INSERT INTO exampleTable
VALUES (TO_BINARY('2B'));

SELECT
	LENGTH(bytecol) !!!RESOLVE EWI!!! /*** SSC-EWI-TD0051 - TERADATA BYTES FUNCTION RESULTS DIFFER FROM SNOWFLAKE LENGTH FUNCTION FOR BYTE TYPE COLUMNS ***/!!! from
	exampleTable;
	-- Will return 10, the size of bytecol
Copy

コード例:

入力コード:

create table sampleTable(
    byteColumn byte(10),
    varbyteColumn varbyte(15)
);

select bytes(byteColumn), bytes(varbyteColumn) from sampleTable;
Copy

出力コード:

CREATE OR REPLACE TABLE sampleTable (
    byteColumn BINARY,
    varbyteColumn BINARY(15)
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"teradata"}}'
;

SELECT
    LENGTH(byteColumn) !!!RESOLVE EWI!!! /*** SSC-EWI-TD0051 - TERADATA BYTES FUNCTION RESULTS DIFFER FROM SNOWFLAKE LENGTH FUNCTION FOR BYTE TYPE COLUMNS ***/!!!,
    LENGTH(varbyteColumn) from
    sampleTable;
Copy

推奨事項

  • BYTES 関数の結果分析によると、Snowflake LENGTH 関数はすでに望ましい動作を提供しているため、修正の必要はありません。

  • その他のサポートについては、 snowconvert-support@snowflake.com にお問い合わせください

SSC-EWI-TD0034

例を明解で分かりやすくするため、出力コードの一部を削除しています

重大性

説明

1つのリクエストで複数の SQL ステートメントを実行することはサポートされていません。リクエストは1つのトランザクションとして処理されました。

このエラー警告情報(EWI)は、コマンドを使用して PL ターゲット言語フラグをJavascriptにセットした場合にのみ表示されます。「--PLTargetLanguage Javascript」

コード例

入力:

-- Additional Params: --PLTargetLanguage Javascript
REPLACE PROCEDURE proc1()
  BEGIN
    BEGIN REQUEST;
      SELECT* FROM TABLE1;
    END REQUEST;
END;
Copy

出力:

CREATE OR REPLACE PROCEDURE proc1 ()
RETURNS STRING
LANGUAGE JAVASCRIPT
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"teradata"}}'
EXECUTE AS CALLER
AS
$$
  // SnowConvert Helpers Code section is omitted.

  var TRANSACTION_HANDLER = function (error) {
    throw error;
  };
  // ** SSC-EWI-TD0034 - MULTISTATEMENT SQL EXECUTION NOT SUPPORTED, REQUEST HANDLED AS TRANSACTION **
  try {
    EXEC(`BEGIN`);
    EXEC(`SELECT
   *
FROM
   TABLE1`,[],undefined,TRANSACTION_HANDLER);
    EXEC(`COMMIT`);
  } catch(error) {
    EXEC(`ROLLBACK`);
  }
$$;
Copy

推奨事項

SSC-EWI-TD0024

重大性

説明

この警告は、ストアドプロシージャ内のコメントアウトされた ABORT ステートメント内で AGGREGATE 関数が使用されている場合に表示されます。

コード例

Teradata:

REPLACE PROCEDURE ABORT_SAMPLE()
BEGIN
    ABORT WHERE SUM(TABLE1.COL1) < 2;
END;
Copy

Snowflake Scripting:

CREATE OR REPLACE PROCEDURE ABORT_SAMPLE()
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"teradata"}}'
EXECUTE AS CALLER
AS
$$
    BEGIN
        !!!RESOLVE EWI!!! /*** SSC-EWI-TD0024 - ABORT STATEMENT IS NOT SUPPORTED DUE TO AN AGGREGATE FUNCTION ***/!!!
        ABORT WHERE SUM(TABLE1.COL1) < 2;
    END;
$$;
Copy

推奨事項

SSC-EWI-TD0010

重大性

説明

テキストを大文字に変換するために使用される UPPERCASE 列属性は、Snowflakeでは利用できません。

コード例

Teradata:

CREATE TABLE T_2010
(
    col1 VARCHAR(1) UPPERCASE
);
Copy

Snowflake Scripting:

CREATE OR REPLACE TABLE T_2010 (
    col1 VARCHAR(1)
                    !!!RESOLVE EWI!!! /*** SSC-EWI-TD0010 - UPPERCASE NOT SUPPORTED BY SNOWFLAKE ***/!!!
 UPPERCASE
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"teradata"}}'
;
Copy

推奨事項

  • UPPERCASE 句は、データを格納する際に小文字を大文字に変換します。たとえば、「aaa」は「AAA」として格納されます。これを処理するには、すべてのinsertステートメントに UPPER 関数を追加することができます。ただし、外部データを読み込み中の ETL プロセスも変更する必要があることに注意してください。

  • その他のサポートについては、 snowconvert-support@snowflake.com にお問い合わせください

SSC-EWI-TD0041

重大性

説明

入力されたファイル形式はシステムでサポートされていません。

コード例

入力:

SELECT
    cast(T_2041.integer_column as integer);
Copy

出力:

SELECT
    cast(TRUNC(T_2041.integer_column) as integer) !!!RESOLVE EWI!!! /*** SSC-EWI-TD0041 - TRUNC FUNCTION WAS ADDED TO ENSURE INTEGER. MAY NEED CHANGES IF NOT NUMERIC OR STRING. ***/!!!;
Copy

推奨事項

SSC-EWI-TD0061

重大性

説明

SnowConvert は、列データをテーブルの行に変換する TD_UNPIVOT 関数をサポートしたり変換したりすることはありません。

この変換を正しく行うには、テーブルの列名に関する情報が必要です。この情報がない場合は変換が不完全になり、結果の列が欠落することがあります。このような場合は、 EWI (エラー、警告、情報)メッセージが生成されます。

コード例

入力コード:

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

出力コード:

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

--** SSC-FDM-0007 - MISSING DEPENDENT OBJECTS "VALUE_COLUMNS", "UNPIVOT_COLUMN", "COLUMN_LIST", "COLUMN_ALIAS_LIST" **
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;

	--** SSC-FDM-0007 - MISSING DEPENDENT OBJECTS "VALUE_COLUMNS", "UNPIVOT_COLUMN", "COLUMN_LIST", "COLUMN_ALIAS_LIST" **
	SELECT
	* FROM
	!!!RESOLVE EWI!!! /*** SSC-EWI-TD0061 - 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

推奨事項

  • 変換ツールに列情報を提供するには、次の2つの方法があります。

    • TD_UNPIVOT 呼び出しと同じファイルにテーブル指定を含めます。

    • SELECT * またはテーブル名のみを使用する代わりに、 ON 式の SELECT クエリで特定の列をリストします。

  • 入力テーブルから ALL 列のピボット化を解除している場合は、この問題を無視できます。しかし、一部の列のピボット化だけを解除すると、データが欠落します。

  • その他のサポートについては、 snowconvert-support@snowflake.com にお問い合わせください

SSC-EWI-TD0004

重大性

説明

Snowflakeプロシージャには、TeradataのContinueハンドラー機能に直接相当するものがありません。SnowConvert はいくつかの例外コードを処理し、同様の動作をエミュレートできますが、Continue Handlerステートメントでサポートされていない例外コードに遭遇すると、 EWI (エラー、警告、情報)メッセージを生成します。

コード例

Teradata:

REPLACE PROCEDURE PURGING_ADD_TABLE
(
 IN inDatabaseName     	VARCHAR(30),
 IN inTableName    		VARCHAR(30)
)
BEGIN
 DECLARE vCHAR_SQLSTATE CHAR(5);
 DECLARE vSUCCESS       CHAR(5);

  DECLARE CONTINUE HANDLER FOR SQLSTATE 'UNSUPPORTED'
  BEGIN
     SET vCHAR_SQLSTATE = SQLCODE;
     SET vSUCCESS    = SQLCODE;
  END;

  SELECT 1;

END;
Copy

Snowflake Scripting:

CREATE OR REPLACE PROCEDURE PURGING_ADD_TABLE
(INDATABASENAME VARCHAR(30), INTABLENAME VARCHAR(30)
)
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "teradata",  "convertedOn": "07/04/2024" }}'
EXECUTE AS CALLER
AS
$$
 DECLARE
  vCHAR_SQLSTATE CHAR(5);
  vSUCCESS       CHAR(5);
 BEGIN


  !!!RESOLVE EWI!!! /*** SSC-EWI-TD0004 - NOT SUPPORTED SQL EXCEPTION ON CONTINUE HANDLER ***/!!!

  DECLARE CONTINUE HANDLER FOR SQLSTATE 'UNSUPPORTED'
  BEGIN
   vCHAR_SQLSTATE := SQLCODE;
   vSUCCESS := SQLCODE;
  END;
  SELECT
   1;
 END;
$$;
Copy

推奨事項

  • Continue Handler翻訳参照 に示されている例と同様に、例外を発生させる可能性のあるステートメントを識別して特定し、コードブロックで囲みます。

  • その他のサポートについては、サポートチーム snowconvert-support@snowflake.com にお問い合わせください

SSC-EWI-TD0055

この早期警告問題(EWI)はサポートされなくなりました。最新の情報については、 SSC-FDM-TD0029 ドキュメントをご参照ください。

セッションパラメーターに依存する形式要素

以下のTeradata形式要素は、特定のセッションパラメーター設定を必要とするSnowflake関数にマッピングされています。TeradataとSnowflakeで一貫した結果を得るには、これらのセッションパラメーターをTeradataのセットに合わせて構成する必要があります。

  • D: DAYOFWEEK 関数にマッピング。TeradataとSnowflakeではデフォルトの設定が異なるため、結果が異なる場合があります。Teradataは日曜日を週の最初の曜日として使用し、Snowflakeは月曜日を使用しています。

  • WW: WEEK 関数にマッピング。週の計算ポリシーが異なるため、結果が異なる場合があります。Snowflakeはデフォルトで ISO (最初の週は1月が4日以上含まれること)の標準を使用しますが、Teradataは1月1日を最初の週の開始とみなします。

セッションパラメーターを変更するには、 ALTER SESSION SET parameter_name = value コマンドを使用します。使用可能なセッションパラメーターとその使用方法に関する詳細については、 こちらのページ をご覧ください。

TO_CHAR の単一パラメーターバージョン

TO_CHAR(Datetime) 関数にパラメーターを1つ指定すると、セッションパラメーターで定義されたデフォルトの日付と時刻の形式を使用します。これらのパラメーターには以下があります。

  • TIMESTAMP_LTZ_OUTPUT_FORMAT

  • TIMESTAMP_NTZ_OUTPUT_FORMAT

  • TIMESTAMP_TZ_OUTPUT_FORMAT

  • TIME_OUTPUT_FORMAT

TeradataとSnowflake間で一貫した動作を保証するために、これらのパラメーターがTeradataの設定と一致していることを確認してください。

TO_CHAR(Numeric) を使用して数値を文字列に変換する場合、Snowflakeは自動的に TM9 または TME のいずれかの形式を使用して、コンパクトな文字列表現を作成します。Teradataもデフォルトでコンパクトな数値表現を作成するため、追加の形式は必要ありません。

コード例

入力コード:

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

出力コード:

SELECT
TO_CHAR(date '2008-09-13', 'DD/') || PUBLIC.ROMAN_NUMERALS_MONTH_UDF(date '2008-09-13') || TO_CHAR(date '2008-09-13', '/YYYY') !!!RESOLVE EWI!!! /*** SSC-EWI-TD0055 - 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') !!!RESOLVE EWI!!! /*** SSC-EWI-TD0055 - 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') !!!RESOLVE EWI!!! /*** SSC-EWI-TD0055 - SNOWFLAKE SUPPORTED FORMATS FOR TO_CHAR DIFFER FROM TERADATA AND MAY FAIL OR HAVE DIFFERENT BEHAVIOR ***/!!!;

SELECT
TO_CHAR(45620) !!!RESOLVE EWI!!! /*** SSC-EWI-TD0055 - SNOWFLAKE SUPPORTED FORMATS FOR TO_CHAR DIFFER FROM TERADATA AND MAY FAIL OR HAVE DIFFERENT BEHAVIOR ***/!!!;
Copy

推奨事項

  • 形式関数(FF)を使用する場合は、Teradataの精度に合った DateTime タイプを使用するか、形式要素で精度を指定して、一貫した動作を保証してください。

  • タイムゾーン形式では、一貫した結果を得るために、最初のパラメーターのタイプが TIMESTAMP_TZ であることを確認してください。Snowflakeの TIME データ型はタイムゾーン情報をサポートしていないことに注意してください。

  • セッションパラメーターをTeradataのデフォルト値に合わせて構成し、一貫した動作を維持します。

  • その他のサポートについては、 snowconvert-support@snowflake.com にお問い合わせください

SSC-EWI-TD0082

重大性

説明

現在のエンコーディングパラメーターを使用したTranslate関数はSnowflakeでは使用できません。翻訳中、この関数はコメントアウトされます。

コード例

入力コード:

SELECT Translate('abc' USING KANJISJIS_TO_LATIN);
Copy

出力コード

SELECT
!!!RESOLVE EWI!!! /*** SSC-EWI-TD0082 - TRANSLATE FUNCTION USING KANJISJIS_TO_LATIN ENCODING IS NOT SUPPORTED ***/!!!
Translate('abc' USING KANJISJIS_TO_LATIN);
Copy

推奨事項

SSC-EWI-TD0020

この警告メッセージは使用されなくなりました。最新のドキュメントは SSC-EWI-0009 をご参照ください。

重大性

説明

Snowflakeは現在、 POSIX 基本正規表現構文のみをサポートしています。高度な正規表現機能は使用できません。

この警告は、 REGEX_SUBSTR、 REGEX_REPLACE、 または REGEX_INSTR の関数呼び出しがSnowflakeに変換されるたびに表示されます。正規表現機能の一部がSnowflakeでサポートされていない可能性があることをユーザーに警告します。 サポートされていない 重要な機能には以下があります。

  • Lookahead

  • Lookbehind

  • Non-capturing groups

コード例

Teradata:

SELECT REGEXP_SUBSTR('qaqequ','q(?=u)', 1, 1);
Copy

Snowflake Scripting:

SELECT
!!!RESOLVE EWI!!! /*** SSC-EWI-TD0020 - REGEXP_SUBSTR FUNCTION ONLY SUPPORTS POSIX REGULAR EXPRESSIONS ***/!!!
REGEXP_SUBSTR('qaqequ','q(?=u)', 1, 1);
Copy

推奨事項

  • 各正規表現パターンを確認し、手動による調整が必要かどうかを識別します。Snowflakeの正規表現機能と代替オプションの詳細については、 こちら をご参照ください。

  • その他のサポートについては、サポートチーム snowconvert-support@snowflake.com にお問い合わせください

SSC-EWI-TD0060

例を明解で分かりやすくするため、出力コードの一部を削除しています

重大性

説明

SnowConvert ツールは JSON_TABLE 関数を変換できますが、変換を正しく実行するには JSON_TABLE ON サブクエリで選択されている特定の列名が分かっている必要があります。

この警告は、サブクエリで列名が明示的に指定されておらず(SELECT* を使用した場合など)、システムがテーブルの構造情報を見つけられない場合に表示されます。この情報がないと、列名を自動的に決定することはできません。

JSON のデータをテーブルに読み込む方法については、 ドキュメントページ をご参照ください。

コード例

入力コード:

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

出力コード:

CREATE OR REPLACE TABLE demo.Train (
    firstCol INT,
    jsonCol VARIANT,
    thirdCol VARCHAR(30)
)
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "teradata",  "convertedOn": "12/16/2024",  "domain": "test" }}'
;

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
    !!!RESOLVE EWI!!! /*** SSC-EWI-TD0060 - JSON_TABLE NOT TRANSFORMED, COLUMN NAMES COULD NOT BE RETRIEVED FROM SEMANTIC INFORMATION ***/!!! 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

推奨事項

  • SnowConvert にコードを提供する際は、必ずテーブル定義を含めるようにしてください。それらがないと、コードをもう一度実行する必要があります。

  • その他のサポートについては、 snowconvert-support@snowflake.com にお問い合わせください

SSC-EWI-TD0031

重大性

説明

TeradataとSnowflakeの CHAR データ型を比較する際には、注意すべき重要な違いがあります。Teradataでは、 CHAR は固定長です。つまり、 LIKE 関数は後続の空白を含む列全体の長さと一致させようとします。これは予期せぬ結果につながる可能性があります。一方、Snowflakeの CHAR タイプは変数長であるため、 LIKE 関数は後続のスペースを考慮せず、実際に格納されている値に対してのみ一致させます。この動作を示す例を示します。

コード例

入力:

CREATE TABLE table1
(
    col1 VARCHAR(36),
    col2 CHAR(36)
);

INSERT INTO table1 VALUES ('Gabriel', 'Gabriel');
INSERT INTO table1 VALUES ('Barnum', 'Barnum');
INSERT INTO table1 VALUES ('Sergio', 'Sergio');

SELECT col1 FROM table1 where col1 LIKE 'Barnum';
-- The result is a single row with 'Barnum'
SELECT col2 FROM table1 where col2 LIKE 'Barnum';
-- It does not return any row
Copy

出力:

CREATE OR REPLACE TABLE table1
(
    col1 VARCHAR(36),
    col2 CHAR(36)
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"teradata"}}'
;

INSERT INTO table1
VALUES ('Gabriel', 'Gabriel');

INSERT INTO table1
VALUES ('Barnum', 'Barnum');

INSERT INTO table1
VALUES ('Sergio', 'Sergio');

SELECT
    col1 FROM
    table1
where col1 LIKE 'Barnum';
-- The result is a single row with 'Barnum'
    SELECT
    col2 FROM
    table1
    where
    !!!RESOLVE EWI!!! /*** SSC-EWI-TD0031 - THE RESULT OF LIKE MAY DIFFER DUE TO CHAR TYPE HAVING A FIXED LENGTH IN TERADATA ***/!!! col2 LIKE 'Barnum';
    -- It does not return any row
Copy

推奨事項

SSC-EWI-TD0005

重大性

Critical

説明

コードは正常に変換されましたが、この機能はまだ完全に実装されていないため、意図したとおりに動作しない可能性があります。

警告では、このステートメントを使用すると元のスクリプトとは異なる関数になることをユーザーに通知します。

ソース例

BTEQ 入力コード:

.SET SIDETITLES ON
Copy

Python出力コード:

#*** Generated code is based on the SnowConvert 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
def main():
  snowconvert.helpers.configure_log()
  con = snowconvert.helpers.log_on()
  #** SSC-EWI-TD0005 - THE STATEMENT WAS CONVERTED BUT ITS FUNCTIONALITY IS NOT IMPLEMENTED YET **
  Export.side_titles(True)
  snowconvert.helpers.quit_application()

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

推奨事項

SSC-EWI-TD0083

分かりやすくするため、出力コードの一部を削除しています。

重大性

説明

SnowConvert は、複数の複雑なステートメント(SELECT)を同時に処理することができません。これらのステートメントを変換するには、共通テーブル式(CTEs)または複合 FROM 句にマッピングする必要があり、コンパイルエラーや無限論理ループが発生する可能性があるため、この制限が存在します。

複雑な SELECT 句とは

共通テーブル式(CTE)または複合 FROM 句にマッピングする必要があるステートメント。 NORMALIZE、 EXPAND ON、 RESET WHEN 関数を含みます。

コード例

入力コード:

SELECT
   NORMALIZE emp_id,
   duration,
   dept_id,
   balance,
   (
     ROW_NUMBER() OVER (
       PARTITION BY emp_id
       ORDER BY
         dept_id RESET WHEN balance <= SUM(balance) OVER (
           PARTITION BY emp_id
           ORDER BY dept_id
           ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING
         )
     ) -1
   ) AS balance_increase
FROM project
EXPAND ON duration AS bg BY ANCHOR ANCHOR_SECOND
ORDER BY 1, 2;
Copy

出力コード

// SnowConvert Helpers Code section is omitted.
SELECT
!!!RESOLVE EWI!!! /*** SSC-EWI-TD0083 - NOT ABLE TO TRANSFORM TWO OR MORE COMPLEX SELECT CLAUSES AT A TIME ***/!!!
NORMALIZE emp_id,
   duration,
   dept_id,
   balance,
   (
     ROW_NUMBER() OVER (
   PARTITION BY
      emp_id, new_dynamic_part
   ORDER BY
         dept_id
     ) -1
   ) AS balance_increase
FROM
   (
      SELECT
         emp_id,
         duration,
         dept_id,
         balance,
         previous_value,
         SUM(dynamic_part) OVER (
                 PARTITION BY emp_id
                 ORDER BY dept_id
         ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
               ) AS new_dynamic_part
      FROM
         (
            SELECT
               emp_id,
               duration,
               dept_id,
               balance,
               SUM(balance) OVER (
                       PARTITION BY emp_id
                       ORDER BY dept_id
                       ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING
                     ) AS previous_value,
               (CASE
                  WHEN balance <= previous_value
                     THEN 1
                  ELSE 0
               END) AS dynamic_part
            FROM
               project
         )
   )
!!!RESOLVE EWI!!! /*** SSC-EWI-TD0083 - NOT ABLE TO TRANSFORM TWO OR MORE COMPLEX SELECT CLAUSES AT A TIME ***/!!!
EXPAND ON duration AS bg BY ANCHOR ANCHOR_SECOND
ORDER BY 1, 2;
Copy

推奨事項

SSC-EWI-TD0070

この早期警告問題(EWI)はサポートされなくなりました。最新の情報については、 SSC-FDM-TD0030 ドキュメントをご参照ください。

重大性

説明

SC でGotoステートメントをLabelセクションに置き換えると、returnステートメントがない場合は、自動的にセクションの最後に追加されます。これにより、プログラムの実行フローが元のコードと変わらないことが保証されます。

BTEQ Gotoコマンドが実行されると、Gotoコマンドと対応するラベルの間のステートメントはすべてスキップされます。ラベルに到達した後の意図しない実行を防ぐために、ラベルセクションにreturnステートメントを含める必要があります。

Gotoコマンドが実行されると、一致するLabelに到達するまですべてのステートメントをスキップすることに注意することが重要です。プログラムの実行はそのラベルから継続されます。Gotoコマンドの前に定義されたLabelセクションは実行されません。

コード例

入力コード:

-- Additional Params: --scriptsTargetLanguage SnowScript
.LOGON dbc,dbc;
select 'STATEMENTS';
.GOTO LABEL_B
select 'IGNORED STATEMENTS';
.label LABEL_B
select 'LABEL_B STATEMENTS';
Copy

出力コード

EXECUTE IMMEDIATE
$$
  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
        '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;
    !!!RESOLVE EWI!!! /*** SSC-EWI-TD0070 - 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

推奨事項

SSC-EWI-TD0001

分かりやすくするため、出力コードの一部を削除しています。

重大性

説明

この警告は、 SnowConvert がエイリアス式で再帰パターンを識別した場合に表示されます。このような場合、 SnowConvert は、エイリアスがSnowflakeで適切に動作するために必要なForward Alias変換を実行できません。

再帰エイリアスは、2つ以上のエイリアスが循環パターンでお互いを参照する場合に発生します。これは、エイリアスAがエイリアスBを参照し、エイリアスBがエイリアスAを参照するというように直接的に起こることもあれば、複数のミディアムエイリアスを通じて間接的に(transitively)循環参照が起こることもあります。

コード例

注意: Snowflakeでは再帰エイリアスは一般的にサポートされていませんが、いくつかの基本的なケースはサポートされています。

注意: 一般的にSnowflakeは再帰エイリアスをサポートしていません。しかし、以下の例に示すように、いくつかの基本的なケースはサポートされています。

以下のコードは、移行プロセス完了後、Snowflakeで正常に実行されたことを示しています。

Teradata:

SELECT
    COL1 AS COL2,
    COL2 AS COL1
FROM
    TABLE_EXAMPLE;
Copy

Snowflake Scripting:

// SnowConvert Helpers Code section is omitted.
SELECT
    COL1 AS COL2,
    !!!RESOLVE EWI!!! /*** SSC-EWI-TD0001 - 'COL1' HAS RECURSIVE REFERENCES. FORWARD ALIAS CONVERSION COULD NOT BE COMPLETED ***/!!!
    COL2 AS COL1
FROM
    TABLE_EXAMPLE;
Copy

以下のコード例は正しく実行されません。

Teradata:

SELECT
    A + B as C,
    COL2 + C AS A,
    COL3 AS B
FROM
    TABLE_EXAMPLE;
Copy

Snowflake Scripting:

// SnowConvert Helpers Code section is omitted.
SELECT
    !!!RESOLVE EWI!!! /*** SSC-EWI-TD0001 - 'A' HAS RECURSIVE REFERENCES. FORWARD ALIAS CONVERSION COULD NOT BE COMPLETED ***/!!!
    COL2 + C AS A,
    COL3 AS B,
    A + B as C
FROM
    TABLE_EXAMPLE;
Copy

推奨事項

  • 再帰的な前方エイリアスがないか、コードを確認します。EWI は最初の再帰エイリアスを識別しますが、コードには他にも注意の必要なエイリアスが存在する可能性があります。

  • その他のサポートについては、 snowconvert-support@snowflake.com にお問い合わせください

SSC-EWI-TD0087

このドキュメントはもはや維持されていません。最新の情報については、 SSC-FDM-TD0026 をご参照ください。

例を明確かつ簡潔にするため、コードの一部を省略しています。

重大性

説明

SQL IF ステートメントの関数を複製する場合、開発者はしばしば GOTO コマンドと IF、 LABEL コマンドを組み合わせます。これらの組み合わせは、ifステートメント、if-elseステートメント、if-elseif-elseステートメントに直接変換することができます。このような場合は、 LABEL セクションに置き換わると冗長になるため、 GOTO コマンドを削除します。

コード例

入力コード:

-- Additional Params: --scriptsTargetLanguage SnowScript
.If ActivityCount = 0 THEN .GOTO endIf
DROP TABLE TABLE1;
.Label endIf
SELECT A FROM TABLE1;
Copy

出力コード

EXECUTE IMMEDIATE
$$
  DECLARE
    STATUS_OBJECT OBJECT := OBJECT_CONSTRUCT('SQLCODE', 0);
  BEGIN
    IF (NOT (STATUS_OBJECT['SQLROWCOUNT'] = 0)) THEN
      !!!RESOLVE EWI!!! /*** SSC-EWI-TD0087 - 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

推奨事項

SSC-EWI-TD0025

重大性

説明

この警告は、Snowflake Scriptingがサポートしていない出力形式で CAST 関数を使用した場合に表示されます。

コード例

Teradata:

CREATE TABLE SAMPLE_TABLE
(
    VARCHAR_TYPE VARCHAR
);

REPLACE VIEW SAMPLE_VIEW
AS
SELECT
CAST(VARCHAR_TYPE AS FLOAT FORMAT 'ZZZ.ZZZZZ'),
CAST('01:02.030405' AS TIME(1) WITH TIME ZONE FORMAT 'MI:SS.S(6)'),
CAST('01-12-2020' AS DATE FORMAT 'dd-mm-yyyy')
FROM SAMPLE_TABLE;
Copy

Snowflake Scripting:

CREATE OR REPLACE TABLE SAMPLE_TABLE (
    VARCHAR_TYPE VARCHAR
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"teradata"}}'
;

CREATE OR REPLACE VIEW SAMPLE_VIEW
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"teradata"}}'
AS
SELECT
    TO_NUMBER(VARCHAR_TYPE, '999.00000', 38, 10) !!!RESOLVE EWI!!! /*** SSC-EWI-TD0025 - OUTPUT FORMAT 'ZZZ.ZZZZZ' NOT SUPPORTED. ***/!!!,
    TO_TIME('01:02.030405', 'MI:SS.FF6') !!!RESOLVE EWI!!! /*** SSC-EWI-TD0025 - OUTPUT FORMAT 'MI:SS.S(6)' NOT SUPPORTED. ***/!!!,
    TO_DATE('01-12-2020', 'DD-MM-YYYY') !!!RESOLVE EWI!!! /*** SSC-EWI-TD0025 - OUTPUT FORMAT 'dd-mm-yyyy' NOT SUPPORTED. ***/!!!
   FROM
    SAMPLE_TABLE;
Copy

推奨事項

  • 変換されたコードがソースコードと同じように機能することを検証します。

  • その他のサポートについては、サポートチーム snowconvert-support@snowflake.com にお問い合わせください

SSC-EWI-TD0040

重大性

説明

入力されたファイル形式はシステムでサポートされていません。

コード例

入力:

CREATE TABLE T_2040
(
    C1 VARCHAR(255) CHARACTER SET LATIN NOT CASESPECIFIC FORMAT 'X(50)',
    C2 VARCHAR(255) CHARACTER SET LATIN NOT CASESPECIFIC FORMAT 'X(75)'
);
Copy

出力:

CREATE OR REPLACE TABLE T_2040
(
    C1 VARCHAR(255) COLLATE 'en-cs' FORMAT 'X(50)' !!!RESOLVE EWI!!! /*** SSC-EWI-TD0040 - FORMAT IN TABLE T_2040 NOT SUPPORTED ***/!!!,
    C2 VARCHAR(255) COLLATE 'en-cs' FORMAT 'X(75)' !!!RESOLVE EWI!!! /*** SSC-EWI-TD0040 - FORMAT IN TABLE T_2040 NOT SUPPORTED ***/!!!
)
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "teradata",  "convertedOn": "06/17/2024" }}'
;
Copy

推奨事項