SnowConvert AI - Teradataの機能の違い

SSC-FDM-TD0001

Blobデータ型から変換された列。

説明

このメッセージは、 SnowConvert AI が BLOB データ型を見つけたときに表示されます。BLOB はSnowflakeではサポートされていないため、型はバイナリに変更されます。

コード例

入力コード:
 CREATE TABLE TableExample
(
ColumnExample BLOB
);
Copy
生成されたコード:
 CREATE OR REPLACE TABLE TableExample
(
ColumnExample BINARY /*** SSC-FDM-TD0001 - COLUMN CONVERTED FROM BLOB DATA TYPE ***/
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"teradata"}}'
;
Copy

ベストプラクティス

  • ユーザーによる追加のアクションは必要ありません。

  • さらにサポートが必要な場合は、 snowconvert-support@snowflake.com までメールでお問い合わせください。

SSC-FDM-TD0002

Clobデータ型から変換された列。

説明

このメッセージは、 SnowConvert AI が CLOB データ型を見つけたときに表示されます。CLOB は SnowConvert AI ではサポートされていないため、型は VARCHAR に変更されます。

コード例

入力コード:
 CREATE TABLE TableExample
(
ColumnExample CLOB
)
Copy
生成されたコード:
 CREATE OR REPLACE TABLE TableExample
(
ColumnExample VARCHAR /*** SSC-FDM-TD0002 - COLUMN CONVERTED FROM CLOB DATA TYPE ***/
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"teradata"}}'
;
Copy

ベストプラクティス

  • ユーザーによる追加のアクションは必要ありません。

  • さらにサポートが必要な場合は、 snowconvert-support@snowflake.com までメールでお問い合わせください。

SSC-FDM-TD0003

Bash変数が見つかりました。このスクリプトを実行するには、 SnowSQL で変数の置換を有効にする必要があります。

説明

Snowflakeスクリプトに移行したスクリプトファイルのソースコードにBash変数のプレースホルダー($variableまたは${variable})が含まれている場合、 SnowConvert AI はそれらを SnowSQL 変数(&variableまたは&{variable})に変換します。

この警告は、移行されたスクリプトの実行が SnowSQL に依存して動作するようになったことを示すために生成されます。SnowSQL でスクリプトを実行する際には、以下を考慮してください。

コード例

入力コード:
 .LOGON dbc, dbc;

select '$variable', '${variable}', '${variable}_concatenated';

select $colname from $tablename where info = $id;

select ${colname} from ${tablename} where info = ${id};

.LOGOFF;
Copy
生成されたコード:
EXECUTE IMMEDIATE
$$
  --** SSC-FDM-TD0003 - BASH VARIABLES FOUND, USING SNOWSQL WITH VARIABLE SUBSTITUTION ENABLED IS REQUIRED TO RUN THIS SCRIPT **
  DECLARE
    STATUS_OBJECT OBJECT := OBJECT_CONSTRUCT('SQLCODE', 0);
  BEGIN
    --.LOGON dbc, dbc
    !!!RESOLVE EWI!!! /*** SSC-EWI-0073 - PENDING FUNCTIONAL EQUIVALENCE REVIEW FOR 'BTLogOn' NODE ***/!!!
    null;
    BEGIN
      SELECT
        '&variable',
        '&{variable}',
        '&{variable}_concatenated';
      STATUS_OBJECT := OBJECT_CONSTRUCT('SQLROWCOUNT', SQLROWCOUNT);
    EXCEPTION
      WHEN OTHER THEN
        STATUS_OBJECT := OBJECT_CONSTRUCT('SQLCODE', SQLCODE, 'SQLERRM', SQLERRM, 'SQLSTATE', SQLSTATE);
    END;
    BEGIN
      SELECT
        &colname
      from
        &tablename
      where
        info = &id;
      STATUS_OBJECT := OBJECT_CONSTRUCT('SQLROWCOUNT', SQLROWCOUNT);
    EXCEPTION
      WHEN OTHER THEN
        STATUS_OBJECT := OBJECT_CONSTRUCT('SQLCODE', SQLCODE, 'SQLERRM', SQLERRM, 'SQLSTATE', SQLSTATE);
    END;
    BEGIN
      SELECT
        &{colname}
      from
        &{tablename}
      where
        info = &{id};
      STATUS_OBJECT := OBJECT_CONSTRUCT('SQLROWCOUNT', SQLROWCOUNT);
    EXCEPTION
      WHEN OTHER THEN
        STATUS_OBJECT := OBJECT_CONSTRUCT('SQLCODE', SQLCODE, 'SQLERRM', SQLERRM, 'SQLSTATE', SQLSTATE);
    END;
    --.LOGOFF
    !!!RESOLVE EWI!!! /*** SSC-EWI-0073 - PENDING FUNCTIONAL EQUIVALENCE REVIEW FOR 'LogOff' NODE ***/!!!
    null;
  END
$$
Copy

ベストプラクティス

SSC-FDM-TD0004

ピリオド型は2つのデータフィールドとして処理されます

説明

Teradataには、時間間隔を表すために使用されるPeriodデータ型があり、この型のインスタンスは、同じ型(時刻、日付、タイムスタンプ)の開始と終了の境界を持ち、 PERIOD 、 BEGIN 、 END 、 OVERLAPS などのPeriodデータを初期化し、操作することを可能にする一連の関数があります。

Period型はSnowflakeではサポートされていないため、 SnowConvert AI はこの型とその関連する関数を以下のルールを使用して変換します。

  • 列テーブルのPeriod型の宣言は、同じ型の2列として移行されます。

  • Period値コンストラクター関数 は、ピリオドサブ型の2つの異なるコンストラクターに移行され、1つは開始値で、もう1つは終了値を持ちます。

  • Period型のパラメーターを期待するサポートされている関数も同様に UDFs に移行され、これらの UDFs は開始値と終了値に対してほぼ2つのパラメーターを期待します。

コード例

入力コード:
 -- Additional Params: --SplitPeriodDatatype
CREATE TABLE DateTable
(
	COL1 PERIOD(DATE) DEFAULT PERIOD (DATE '2005-02-03', UNTIL_CHANGED)
);
Copy
生成されたコード:
CREATE OR REPLACE TABLE DateTable
(
	COL1_begin DATE DEFAULT DATE '2005-02-03',
	COL1_end DATE DEFAULT DATE '9999-12-31' /*** SSC-FDM-TD0004 - PERIOD DATA TYPES ARE HANDLED AS TWO DATA FIELDS ***/
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"teradata"}}'
;
Copy

ベストプラクティス

SSC-FDM-TD0005

非標準のタイムゾーンオフセットはSnowflakeではサポートされておらず、最も近い有効なタイムゾーンに丸められます。

説明

Teradataでは、 SET TIME ZONE クエリを使用して、 -12:59 から +14:00 の間で任意のタイムゾーンオフセットを定義できる柔軟性がありますが、Snowflakeでは IANA タイムゾーンデータベース にリストされているタイムゾーンのみをサポートしています。

SET TIME ZONE クエリで指定されたオフセットが IANA 標準タイムゾーンと一致しない場合、Snowflakeは自動的に最も近いオフセットを持つ標準タイムゾーンに丸めます。その場合、警告メッセージが生成されます。

コード例

入力コード:
-- Will be rounded to Asia/Colombo (+05:30)
SET TIME ZONE '05:26';
Copy
生成されたコード:
 -- Will be rounded to Asia/Colombo (+05:30)
--** SSC-FDM-TD0005 - NON-STANDARD TIME ZONE OFFSETS NOT SUPPORTED IN SNOWFLAKE, ROUNDED TO NEAREST VALID TIME ZONE **
ALTER SESSION SET TIMEZONE = 'Asia/Colombo';
Copy

ベストプラクティス

  • ユーザーによる追加のアクションは必要ありません。

  • さらにサポートが必要な場合は、 snowconvert-support@snowflake.com までメールでお問い合わせください。

SSC-FDM-TD0006

チェックオプション付きの表示はサポートされていません。

説明

このメッセージは、 SnowConvert AI が WITH CHECK OPTION 句を含むクエリを見つけたときに表示されます。これはSnowflakeではサポートされていないので、コードからコメントアウトされています。

この句は、 INSERT と UPDATE コマンドをビュー上で実行し、ビューに関連付けられたテーブルを内部的に更新するために使用できる、更新可能なビューで動作します。

この句は、ビューで WHERE 句を使用して、コマンドの影響を受ける行を制限するために使用されます。

詳細は、句の機能に関する ドキュメント をご参照ください。

コード例

入力コード:
REPLACE VIEW VIEWWITHOPTIONTEST AS
LOCKING ROW FOR ACCESS
SELECT 
    *        
FROM SOMETABLE
WHERE app_id = 'SUPPLIER'
WITH CHECK OPTION;
Copy
生成されたコード:
 CREATE OR REPLACE VIEW VIEWWITHOPTIONTEST
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "teradata",  "convertedOn": "07/02/2025",  "domain": "no-domain-provided" }}'
AS
SELECT
    *
FROM
    SOMETABLE
WHERE
    UPPER(RTRIM( app_id)) = UPPER(RTRIM('SUPPLIER'))
--    --** SSC-FDM-TD0006 - VIEW WITH OPTION NOT SUPPORTED IN SNOWFLAKE **
--    WITH CHECK OPTION
                     ;
Copy

ベストプラクティス

SSC-FDM-TD0007

バリアント列は照合をサポートしていません。

説明

このメッセージは、コードの変換における SnowConvert AI バリアントデータ型が COLLATE 句を持つ場合に表示されます。COLLATE はデータ型 VARIANT ではサポートされていないため、削除され、メッセージが追加されます。

コード例

入力コード:
-- Additional Params: --useCollateForCaseSpecification
CREATE TABLE TableExample
(
ColumnExample JSON(2500) NOT CASESPECIFIC
)
Copy
生成されたコード:
 CREATE OR REPLACE TABLE TableExample
(
ColumnExample VARIANT
--                      NOT CASESPECIFIC /*** SSC-FDM-TD0007 - VARIANT COLUMN DOES NOT SUPPORT COLLATION ***/
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"teradata"}}'
;
Copy

データ型 JSON は VARIANT に変換され、 NOT CASESPECIFIC は COLLATE 句に変換されます。

ベストプラクティス

  • ユーザーによる追加のアクションは必要ありません。

  • さらにサポートが必要な場合は、 snowconvert-support@snowflake.com までメールでお問い合わせください。

SSC-FDM-TD0008

NVP_UDF 第4パラメーターが非リテラルでバックスラッシュを含む場合、そのバックスラッシュをエスケープする必要があります。

説明

スペースを含む非リテラル区切り文字は、snowflakeではバックスラッシュをエスケープする必要があります。

コード例

入力コード
SELECT NVP('store = whole foods&&store: ?Bristol farms','store', '&&', valueDelimiter, 2);
Copy
生成されたコード
 SELECT
PUBLIC.NVP_UDF('store = whole foods&&store: ?Bristol farms', 'store', '&&', valueDelimiter, 2) /*** SSC-FDM-TD0008 - WHEN NVP_UDF FOURTH PARAMETER IS NON-LITERAL AND IT CONTAINS A BACKSLASH, THAT BACKSLASH NEEDS TO BE ESCAPED ***/;
Copy

ベストプラクティス

SSC-FDM-TD0009

現在のセッションのデフォルトでintegerからvarcharに変換されます。

説明

このメッセージは、 SnowConvert AI が DEFAULT SESSION を見つけ、データ型が NOT VARCHAR のときに表示されます。その場合、データ型は VARCHAR に変更され、メッセージが追加されます。

コード例

入力コード:
 CREATE TABLE TableExample
(
ColumnExample INTEGER DEFAULT SESSION,
ColumnExample2 VARCHAR DEFAULT SESSION
)
Copy
生成されたコード:
 CREATE OR REPLACE TABLE TableExample
(
ColumnExample VARCHAR DEFAULT CURRENT_SESSION() /*** SSC-FDM-TD0009 - CONVERTED FROM INTEGER TO VARCHAR FOR CURRENT_SESSION DEFAULT ***/,
ColumnExample2 VARCHAR DEFAULT CURRENT_SESSION()
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"teradata"}}'
;
Copy

例を見てみましょう。ColumnExample には、 DEFAULT SESSION を持つデータ型 INTEGER があることに注意してください。データ型が VARCHAR でないため、出力では VARCHAR に変換されます。

ColumnExample2 のデータ型は、すでに VARCHAR であるため変更されていません。

ベストプラクティス

  • ユーザーによる追加のアクションは必要ありません。

  • さらにサポートが必要な場合は、 snowconvert-support@snowflake.com までメールでお問い合わせください。

SSC-FDM-TD0010

テーブル(Teradata) DBC.COLUMNSV およびINFORMATION_SCHEMA.COLUMNS ( SnowFlake )間のテーブル列。しかし、列によってはSnowflakeに完全に一致するものがない場合もあります。

説明

Teradataのテーブル DBC.COLUMNSV の使用は INFORMATION_SCHEMA.COLUMNS に変換されますが、列によっては SnowFlake に完全に一致するものがない場合があります。つまり、Teradataには SnowFlake に相当するものが ない 列があれば、一致する列があっても内容がまったく同じでない列があるということです。

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

An example of the contents of INFORMATION_SCHEMA.COLUMNS table in SnowFlake

たとえば、SnowFlake には "ColumnFormat" に相当する列がないこと、また、 "DATA_TYPE" はTeradataの "ColumnType" 列と一致するように見えますが、その内容は大きく異なることに注意してください。

コード例

入力コード:
 SELECT columnname FROM dbc.columnsV WHERE tablename = 'TableN';
Copy
生成されたコード:
 SELECT
COLUMN_NAME AS COLUMNNAME
FROM
--** SSC-FDM-TD0010 - USES OF TABLE DBC.COLUMNSV ARE CONVERTED TO INFORMATION_SCHEMA.COLUMNS, BUT SOME COLUMNS MIGHT NOT HAVE AND EXACT MATCH IN SNOWFLAKE **
INFORMATION_SCHEMA.COLUMNS
WHERE
UPPER(RTRIM(TABLE_NAME)) = UPPER(RTRIM('TableN'));
Copy

ベストプラクティス

  • Teradataでどのような列が使用されていたかを確認し、 SnowFlake で利用可能なコンテンツがニーズに合っているかどうかをチェックします。

  • さらにサポートが必要な場合は、 snowconvert-support@snowflake.com までメールでお問い合わせください。

SSC-FDM-TD0011

Unicode BMP エスケープはサポートされていません。

説明

SnowflakeはUnicode BMP をサポートしていないため、 SnowConvert AI がTeradata Unicode区切り文字リテラル をUnicode BMP エスケープでSnowflakeに変換すると、このメッセージが表示されます。

コード例

入力コード:
 SELECT U&'hola #+005132 mundo' UESCAPE '#';
Copy
生成されたコード:
 SELECT
--** SSC-FDM-TD0011 - UNICODE BMP IS NOT SUPPORTED IN SNOWFLAKE **
'hola \u+005132 mundo';
Copy

ベストプラクティス

  • Unicodeに相当するものが存在するかどうかをチェックします。

  • さらにサポートが必要な場合は、 snowconvert-support@snowflake.com までメールでお問い合わせください。

SSC-FDM-TD0012

無効なデフォルト値です。

注釈

このFDM は非推奨です。 SSC-EWI-TD0006 を参照してください。

説明

FLOAT データ型の DEFAULT TIME / DEFAULT DATE / DEFAULT CURREN_DATE / DEFAULT DEFAULT CURRENT_TIME / DEFAULT CURRENT_TIMESTAMP 列の仕様は、サポート対象外です。

コード例

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

ベストプラクティス

  • ユーザーによる追加のアクションは必要ありません。

  • さらにサポートが必要な場合は、 snowconvert-support@snowflake.com までメールでお問い合わせください。

SSC-FDM-TD0013

Snowflakeエラーコードが元のTeradataのエラーコードと一致しません。

説明

このメッセージが表示されるのは、 BTEQ ERRORCODE ビルドイン変数に保存されたエラーコードが、Snowflakeスクリプトでは同じでない可能性があるためです。

コード例

入力コード:
SELECT * FROM table1;
 
.IF ERRORCODE<>0 THEN .EXIT 1

.QUIT 0
Copy
生成されたコード:
 -- Additional Params: -q snowscript

EXECUTE IMMEDIATE
$$
  DECLARE
    STATUS_OBJECT OBJECT := OBJECT_CONSTRUCT('SQLCODE', 0);
  BEGIN
    BEGIN
      SELECT
        *
      FROM
        table1;
      STATUS_OBJECT := OBJECT_CONSTRUCT('SQLROWCOUNT', SQLROWCOUNT);
    EXCEPTION
      WHEN OTHER THEN
        STATUS_OBJECT := OBJECT_CONSTRUCT('SQLCODE', SQLCODE, 'SQLERRM', SQLERRM, 'SQLSTATE', SQLSTATE);
    END;
    IF (STATUS_OBJECT['SQLCODE'] /*** SSC-FDM-TD0013 - THE SNOWFLAKE ERROR CODE MISMATCH THE ORIGINAL TERADATA ERROR CODE ***/ != 0) THEN
      RETURN 1;
    END IF;
    RETURN 0;
  END
$$
Copy

ベストプラクティス

SSC-FDM-TD0014

ファイル実行の不整合

説明

この EWI は、移行されたコードが SQL ステートメントを含む環境ファイルを実行する BTEQ 文である場合に表示されます。たとえば、 $(<$INPUT_SQL_FILE) 。BTEQ 実行とpython生成コードの違いは、ファイル内の一部のステートメントが失敗しても BTEQ は他のステートメントを続行しますが、python実行はエラーが発生するたびに停止します。

コード例

Teradata BTEQ:
 .logmech LDAP;
.logon $LOGON_STR;
.SET DEFAULTS;


$(<$INPUT_SQL_FILE)

.export reset
.logoff
.quit
Copy
Python:
#*** Generated code is based on the SnowConvert AI Python Helpers version 2.0.6 ***

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

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

ベストプラクティス

SSC-FDM-TD0015

Regexp_Substr関数は POSIX 正規表現のみをサポートしています。

注釈

この FDM は非推奨です。 SSC-EWI-0009 ドキュメントを参照してください。

説明

現在、Snowflakeでは POSIX 基本正規表現構文を超える拡張正規表現はサポートされていません。

この EWI は、 REGEX_SUBSTR 、 REGEX_REPLACE 、 または REGEX_INSTR への関数呼び出しが SnowFlake に変換されるたびに追加され、サポートされていない可能性のある正規表現についてユーザーに警告します。サポートされていない 関数には、先読み、後読み、非キャプチャグループがあります。

コード例

Teradata:
 SELECT REGEXP_SUBSTR('qaqequ','q(?=u)', 1, 1);
Copy
Snowflake Scripting:
 SELECT
--** SSC-FDM-TD0015 - REGEXP_SUBSTR FUNCTION ONLY SUPPORTS POSIX REGULAR EXPRESSIONS **
REGEXP_SUBSTR('qaqequ','q(?=u)', 1, 1);
Copy

ベストプラクティス

  • それぞれのケースで使われている正規表現をチェックし、手作業が必要かどうかを判断します。SnowFlake の拡張正規表現サポートとその代替についての詳細は、 こちら を参照してください

  • さらにサポートが必要な場合は、 snowconvert-support@snowflake.com までメールでお問い合わせください。

SSC-FDM-TD0016

パラメーター'match_arg'の値'l'はSnowflakeではサポートされていません。

説明

Teradataの REGEX_SUBSTR 、 REGEX_REPLACE 、 または REGEX_INSTR などの関数には、 "match_arg" というパラメーターがあります。これは以下の有効な値を持つ文字引数です。

  • 'i' :大文字と小文字を区別しない一致。

  • 'c' :大文字と小文字を区別する一致。

  • 'n' :ピリオド文字(任意の文字に一致)は改行文字に一致することができます。

  • 'm' :ソース文字列が1行ではなく複数行として扱われます。

  • 'l' :source_stringが現在許容されている最大source_stringサイズ(現在16 MB )を超える場合、エラーの代わりに NULL が返されます。

  • 'x':空白を無視します(パターン文字列にのみ影響)。

引数には複数の文字を含めることができます。

Snowflakeでは、これらの関数の相当する引数は regexp_parameters です。A st一致の検索に使用される正規表現パラメーターを指定する1文字以上の文字列です。サポートされている値は次のとおりです。

  • c :大文字と小文字を区別します。

  • i :大文字と小文字を区別しません。

  • m :複数行モード。

  • e :部分一致を抽出します。

  • s :'.'ワイルドカードは改行文字にも一致します。

見てのとおり、値 'i'、'c'、'm' は両言語で同一であり、Teradataの値 'n''s' にマッピングされます。しかし、値 'l'、'x' は相当するものがありません。

'x' については、REGEXP_REPLACE 関数の呼び出しを生成することで機能が複製されます。しかし、'l' パラメーターは複製できないので、このような場合にこの警告が生成されます。

入力コード:

 SELECT REGEXP_SUBSTR('Chip Chop','ch(i|o)p', 1, 1, 'i'), 
       REGEXP_SUBSTR('Chip Chop','ch(i|o)p', 1, 1, 'c'),
       REGEXP_SUBSTR('Chip Chop','ch(i|o)p', 1, 1, 'm'),
       REGEXP_SUBSTR('Chip Chop','ch(i|o)p', 1, 1, 'n'),
       REGEXP_SUBSTR('Chip Chop','ch(i|o)p', 1, 1, 'l'),
       REGEXP_SUBSTR('Chip Chop','ch(i|o)p', 1, 1, 'x');
Copy
生成されたコード:
 SELECT
       REGEXP_SUBSTR('Chip Chop', 'ch(i|o)p', 1, 1, 'i'),
       REGEXP_SUBSTR('Chip Chop', 'ch(i|o)p', 1, 1, 'c'),
       REGEXP_SUBSTR('Chip Chop', 'ch(i|o)p', 1, 1, 'm'),
       REGEXP_SUBSTR('Chip Chop', 'ch(i|o)p', 1, 1, 's'),
       --** SSC-FDM-TD0016 - VALUE 'l' FOR PARAMETER 'match_arg' IS NOT SUPPORTED IN SNOWFLAKE **
       REGEXP_SUBSTR('Chip Chop', 'ch(i|o)p', 1, 1),
       REGEXP_SUBSTR('Chip Chop', 'ch(i|o)p', 1, 1);
Copy

ベストプラクティス

SSC-FDM-TD0017

Snowflakeでは外部テーブルの使用はサポートされていません。

注釈

この FDM は非推奨です。 SSC-EWI-TD0076 を参照してください。

説明

外部テーブル は、Amazon S3、Azure Blob storage、Google Cloud Storageの半構造化データや非構造化データなど、外部オブジェクトストレージ内のデータへのアクセスを可能にします。この構文はSnowflakeではサポートされていません。しかし、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
--** SSC-FDM-TD0017 - THE USE OF FOREIGN TABLES IS NOT SUPPORTED IN SNOWFLAKE. **
 FOREIGN TABLE (SELECT cust_id, income, age FROM twm_customer)@hadoop1 T1;
Copy

ベストプラクティス

  • Teradataの外部テーブルの代わりに、 Snowflake外部テーブル を使うことができます。外部テーブルは、クラウドストレージ(Amazon S3、Google Cloud Storage、またはMicrosoft Azure)データレイクにあるデータファイルを参照します。これにより、データレイク内のファイルに保存されているデータを、データベース内にあるかのようにクエリできます。外部テーブルは、 COPY INTO <table>ステートメントがサポートする任意の形式で保存されたデータにアクセスできます。

  • もうひとつの手段は、 SnowflakeのIcebergテーブル です。つまり、Icebergテーブルは、オープン形式とカスタマー提供のクラウドストレージを使用するテーブルと考えることができます。このデータはParquetファイルに保存されます。

  • 最後が 標準Snowflakeテーブル です。これは、Teradataの外部テーブルの機能をカバーするための選択肢になります。

  • さらにサポートが必要な場合は、 snowconvert-support@snowflake.com までメールでお問い合わせください。

SSC-FDM-TD0018

JSON パスは認識されませんでした

注釈

この FDM は非推奨です。 SSC-EWI-TD0063 を参照してください。

説明

このメッセージは、文字列が期待される形式を持たない、またはSnowflakeでサポートされていないため、 SnowConvert AI が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
    --** SSC-FDM-TD0018 - UNRECOGNIZED JSON PATH $weekShedule.Monday[*] **
JSON_TABLE (
    ON
       !!!RESOLVE EWI!!! /*** SSC-EWI-0108 - THE FOLLOWING SUBQUERY MATCHES AT LEAST ONE OF THE PATTERNS CONSIDERED INVALID AND MAY PRODUCE COMPILATION ERRORS ***/!!! (
           SELECT
               id,
               trainSchedule as ts
FROM
               demo.PUBLIC.Train T
    ) USING rowexpr('$weekShedule.Monday[*]') colexpr(
        '[{"jsonpath"  "$.time",
              "type"" : "CHAR ( 12 )"}]'
    )
) AS JT(Id, Ordinal, Time, City);
Copy

ベストプラクティス

  • Jsonパスに予期しない文字が含まれていないか、または正しい形式でないかをチェックします。

  • さらにサポートが必要な場合は、 snowconvert-support@snowflake.com までメールでお問い合わせください。

SSC-FDM-TD0019

トランザクションおよびプロファイルレベルのクエリタグがSnowflakeでサポートされていないため、代わりにセッションクエリタグを参照します

説明

Teradataでは、トランザクション、セッション、プロファイルの各レベルでクエリバンドを定義し、 GetQueryBandValue のような関数を使ってクエリバンドを参照することができます。

Snowflakeのクエリバンドに相当するのはquery_tagパラメーターで、セッション、ユーザー、アカウントに対して設定できます。また、Snowflakeにはプロファイルがありません。

これらの違いにより、トランザクションまたはプロファイルレベルのクエリタグはSnowflakeでは定義も参照もできず、セッションレベルのクエリタグが代替として使用されるため、場合によっては機能的な違いが生じる可能性があることをユーザーに警告するために、この FMD が追加されます。

コード例

入力コード:
 SELECT GETQUERYBANDVALUE(3, 'account');
Copy
生成されたコード
 SELECT
--** SSC-FDM-TD0019 - TRANSACTION AND PROFILE LEVEL QUERY TAGS NOT SUPPORTED IN SNOWFLAKE, REFERENCING SESSION QUERY TAG INSTEAD **
GETQUERYBANDVALUE_UDF('account');
Copy

ベストプラクティス

  • セッションレベルでクエリバンドを使用するようにコードロジックを変更します。

  • さらにサポートが必要な場合は、 snowconvert-support@snowflake.com までメールでお問い合わせください。

SSC-FDM-TD0020

JSON 値は、無効な形式のため認識できませんでした

注釈

わかりやすくするため、出力コードの一部を省略しています。

説明

このメッセージは、 SnowConvert AI が変換コンテキストの JSON データをデシリアライズする必要があるのに、 JSON 値が期待された形式でないか、有効な JSON でない場合に表示されます。

コード例

入力コード:
 SELECT
*
FROM 
 JSON_TABLE
(ON (SELECT id,
trainSchedule as ts
FROM demo.PUBLIC.Train T)
USING rowexpr('$.weekShedule.Monday[*]')
      colexpr('[ {"ordinal"  true},
                 {"jsonpath"  "$.time",
                  "type"" : "CHAR ( 12 )"},
                 {"jsonpath"  "$.city",
                  "type" : "VARCHAR ( 12 )"}]'))
AS JT(Id, Ordinal, Time, City);

SELECT
*
FROM 
 JSON_TABLE
(ON (SELECT id, 
trainSchedule as ts
FROM demo.PUBLIC.Train T)
USING rowexpr('$.weekShedule.Monday[*]')
      colexpr('{"jsonpath"  "$.time",
                  "type"" : "CHAR ( 12 )"}'))
AS JT(Id, Ordinal, Time, City);
Copy
生成されたコード:
 SELECT
 *
 FROM
 (
  SELECT
   id
  --** SSC-FDM-TD0020 - UNRECOGNIZED JSON LITERAL [ {"ordinal" true}, {"jsonpath" "$.time", "type"" : "CHAR ( 12 )"}, {"jsonpath" "$.city", "type" : "VARCHAR ( 12 )"}] **
  FROM
   demo.PUBLIC.Train T,
   TABLE(FLATTEN(INPUT =>
   trainSchedule:weekShedule.Monday)) rowexpr
 ) JT;

 SELECT
 *
 FROM
 (
  SELECT
   id
  --** SSC-FDM-TD0020 - UNRECOGNIZED JSON LITERAL {"jsonpath" "$.time", "type"" : "CHAR ( 12 )"} **
  FROM
   demo.PUBLIC.Train T,
   TABLE(FLATTEN(INPUT =>
   trainSchedule:weekShedule.Monday)) rowexpr
 ) JT;
Copy

ベストプラクティス

  • JSON がTeradataの文法に従った期待される形式であることを確認してください。

  • さらにサポートが必要な場合は、 snowconvert-support@snowflake.com までメールでお問い合わせください。

SSC-FDM-TD0021

{0}の組み込みの参照はSnowflakeではサポートされていません。

注釈

この EWI は非推奨です。 SSC-EWI-TD0046 を参照してください。

説明

このエラーは、 DBC.DATABASES テーブルを参照するクエリを実行して、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-FDM-TD0022

シェル変数が見つかったため、このコードをシェルスクリプトで実行する必要があります。

説明

Teradataスクリプトでは、スクリプト全体でアクセスおよび操作できる一時的な値を保存するためにシェル変数が使用されます。シェル変数は、ドル記号($)の後に名前(中括弧で囲むことができる)を使用して定義し、代入演算子(=)を使って値を設定することができます。

#!/bin/bash

## define a shell variable
tablename="mytable"

## use the variable in a Teradata SQL query
bteq <<EOF
    .LOGON myhost/myuser,mypassword
    SELECT * FROM ${tablename};
    .LOGOFF
EOF

Copy

シェル変数は、文字列の補間と同じか似たような機能を持っていると考えることができます。したがって、変換してもこの機能を維持することが重要です。\ \ スクリプトをPythonに変換する場合、変換したコードをシェルスクリプト(.shファイル)で実行することで、シェル変数はその機能を維持します。このため、これらのシェル変数は入力コードと同じ形式を保つ必要があります。

コード例

入力コード:

 SELECT $column FROM ${tablename}
Copy
生成されたコード
 #*** Generated code is based on the SnowConvert AI Python Helpers version 2.0.6 ***
 
import os
import sys
import snowconvert.helpers
from snowconvert.helpers import Export
from snowconvert.helpers import exec
from snowconvert.helpers import BeginLoading
con = None
#** SSC-FDM-TD0022 - SHELL VARIABLES FOUND, RUNNING THIS CODE IN A SHELL SCRIPT IS REQUIRED **
def main():
  snowconvert.helpers.configure_log()
  con = snowconvert.helpers.log_on()
  exec("""
    SELECT
      $column
    FROM
      ${tablename}
    """)
  snowconvert.helpers.quit_application()

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

ベストプラクティス

  • 変換したコードをシェルスクリプトで実行する必要があります。

  • さらにサポートが必要な場合は、 snowconvert-support@snowflake.com までメールでお問い合わせください。

SSC-FDM-TD0023

String Similarityは動作が異なる場合があります。

説明

この FDM は、 SnowConvert AI が TeradataからSnowflakeにSimilarity Functionを変換するときに表示されます。これは、結果が異なる動作を示す可能性があることを示しています。

コード例

例として次のようなデータがあるとします。

Id

a

b

1

2

Gute nacht

Ich weis nicht

3

Ich weiß nicht

Ich wei? nicht

4

Ich weiß nicht

Ich wei? nicht

5

Ich weiß nicht

Ich weiss nicht

6

Snowflake

Oracle

7

święta

swieta

8

NULL

9

NULL

NULL

入力コード:
クエリ
-- Additional Params: -q SnowScript
SELECT * FROM StringSimilarity (
  ON (
    SELECT id, CAST(a AS VARCHAR(200)) AS a, CAST(b AS VARCHAR(200)) AS b
    FROM table_1
  ) PARTITION BY ANY
  USING
  ComparisonColumnPairs ('jaro_winkler(a,b) AS sim_fn')
  Accumulate ('id')
) AS dt ORDER BY 1;
Copy
結果
Idsim_fn
10
20.565079365
31
40.959047619
50
60.611111111
70.7777777777777777
80
90
生成されたコード
クエリ
 SELECT
* FROM
--** SSC-FDM-TD0023 - STRING SIMILARITY MIGHT HAVE A DIFFERENT BEHAVIOR. **
(
   SELECT
     id,
     JAROWINKLER_UDF(a, b) AS sim_fn
   FROM table_1
 ) dt ORDER BY 1;
Copy
結果

ID

SIM_FN

1

0.000000

2

0.560000

3

0.970000

4

0.950000

5

0.000000

6

0.610000

7

0.770000

8

0.000000

9

0.000000

ベストプラクティス

SSC-FDM-TD0024

セットテーブル機能はサポートされていません。

説明

この EWI は、 SnowConvert AI が SET オプションを伴うCreate Tableを検出した時に表示されます。SET TABLE はSnowflakeではサポートされていないため、削除されます。

コード例

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

ベストプラクティス

SSC-FDM-TD0025

TeradataデータベースのTemporal TableはSnowflakeではサポートされていません。

説明

Teradata Database Temporalサポート は、一時テーブルと一時 DDL および DML オブジェクトの作成に関与します。一時(時間認識)テーブルとデータのサポートは、絶対的に同等のものが存在しないため、Snowflakeではサポートされていません。

これらのステートメントはすべて、SnowConvert AI によって認識(解析)されますが、Snowflakeでクエリを実行するために、これらの要素は翻訳プロセスで削除されます。

abort ステートメントに遭遇した場合、同等の機能を維持するために、 Delete コマンドに変換され、トランザクション中に実行される操作を元に戻したり、データベースを開始時の状態に復元したりできるようになることに注意してください。

コード例

次の例は、Temporal-form Selectが通常のSelectに変換されていることを示しています。

入力コード:
 SEQUENCED VALIDTIME  
   SELECT
   Policy_ID,
   Customer_ID
   FROM Policy
      WHERE Policy_Type = 'AU';
Copy
生成されたコード:
 ----** SSC-FDM-TD0025 - TEMPORAL FORMS ARE NOT SUPPORTED IN SNOWFLAKE **
--SEQUENCED VALIDTIME
SELECT
   Policy_ID,
   Customer_ID
   FROM
   Policy
      WHERE
   UPPER(RTRIM( Policy_Type)) = UPPER(RTRIM('AU'));
Copy

Abort コマンドがトランザクションのコンテキストで使用される場合。

入力コード:
 CREATE OR REPLACE PROCEDURE TEST.ABORT_STATS()
BEGIN
    CURRENT VALIDTIME AND NONSEQUENCED TRANSACTIONTIME ABORT 
     FROM table_1 
     WHERE table_1.x1 = 1;
END;
Copy
生成されたコード:
 CREATE OR REPLACE PROCEDURE TEST.ABORT_STATS ()
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"teradata"}}'
EXECUTE AS CALLER
AS
$$
    BEGIN
        --    CURRENT VALIDTIME AND NONSEQUENCED TRANSACTIONTIME
        --** SSC-FDM-TD0025 - TEMPORAL FORMS ARE NOT SUPPORTED IN SNOWFLAKE **
        LET _ROW_COUNT FLOAT;
        SELECT
            COUNT(*)
        INTO
            _ROW_COUNT
            FROM
            table_1
                 WHERE table_1.x1 = 1;
            IF (_ROW_COUNT > 0) THEN
            ROLLBACK;
            END IF;
    END;
$$;
Copy

ベストプラクティス

  • ユーザーによる追加のアクションは必要ありません。

  • さらにサポートが必要な場合は、 snowconvert-support@snowflake.com までメールでお問い合わせください。

SSC-FDM-TD0026

ifステートメントが逆転したため、 GOTO ステートメントは削除されました。

注釈

わかりやすくするため、出力コードの一部を省略しています。

説明

SQL ifステートメントの機能を複製するために、 IF および LABEL コマンドとともに GOTO コマンドを使用するのが一般的です。このように使うと、ifステートメント、if-elseステートメント、あるいはif-elseif-elseステートメントに直接変換できます。しかし、このような場合、 GOTO コマンドは不要になるので、 LABEL セクションで置き換えられないよう削除する必要があります。

コード例

入力コード:

 -- 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
      --** SSC-FDM-TD0026 - GOTO endIf WAS REMOVED DUE TO IF STATEMENT INVERSION **
       
      BEGIN
        DROP TABLE TABLE1;
        STATUS_OBJECT := OBJECT_CONSTRUCT('SQLROWCOUNT', SQLROWCOUNT);
      EXCEPTION
        WHEN OTHER THEN
          STATUS_OBJECT := OBJECT_CONSTRUCT('SQLCODE', SQLCODE, 'SQLERRM', SQLERRM, 'SQLSTATE', SQLSTATE);
      END;
    END IF;
    /*.Label endIf*/
    --** SSC-FDM-0027 - REMOVED NEXT STATEMENT, NOT APPLICABLE IN SNOWFLAKE.  **
     
    BEGIN
      SELECT
        A
      FROM
        TABLE1;
      STATUS_OBJECT := OBJECT_CONSTRUCT('SQLROWCOUNT', SQLROWCOUNT);
    EXCEPTION
      WHEN OTHER THEN
        STATUS_OBJECT := OBJECT_CONSTRUCT('SQLCODE', SQLCODE, 'SQLERRM', SQLERRM, 'SQLSTATE', SQLSTATE);
    END;
  END
$$
Copy
ベストプラクティス

SSC-FDM-TD0027

TD_UNPIVOT 変換には、見つからなかった列の情報が必要です。結果に列がありません

注釈

この FDM は非推奨です。 SSC-EWI-TD0061 を参照してください。

説明

SnowConvert AI は 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 TABLE unpivotTable (
	myKey INTEGER NOT NULL PRIMARY KEY,
	firstSemesterIncome DECIMAL(10,2),
	secondSemesterIncome DECIMAL(10,2),
	firstSemesterExpenses DECIMAL(10,2),
	secondSemesterExpenses DECIMAL(10,2)
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"teradata"}}'
;

SELECT
	* FROM
	(
		SELECT
			myKey,
			TRIM(GET_IGNORE_CASE(OBJECT_CONSTRUCT('FIRSTSEMESTERINCOME', 'First', 'FIRSTSEMESTEREXPENSES', 'First', 'SECONDSEMESTERINCOME', 'Second', 'SECONDSEMESTEREXPENSES', 'Second'), Semester), '"') AS Semester,
			Income,
			Expenses
		FROM
			unpivotTable UNPIVOT(Income FOR Semester IN (
				firstSemesterIncome,
				secondSemesterIncome
			)) UNPIVOT(Expenses FOR Semester1 IN (
				firstSemesterExpenses,
				secondSemesterExpenses
			))
		WHERE
			Semester = 'FIRSTSEMESTERINCOME'
			AND Semester1 = 'FIRSTSEMESTEREXPENSES'
			OR Semester = 'SECONDSEMESTERINCOME'
			AND Semester1 = 'SECONDSEMESTEREXPENSES'
	) X ORDER BY mykey;

	SELECT
	* FROM
	--** SSC-FDM-TD0027 - TD_UNPIVOT TRANSFORMATION REQUIRES COLUMN INFORMATION THAT COULD NOT BE FOUND, COLUMNS MISSING IN RESULT **
	(
		SELECT
			TRIM(GET_IGNORE_CASE(OBJECT_CONSTRUCT('JANUARYINCOME', 'January', 'FEBRUARYINCOME', 'February', 'MARCHINCOME', 'March', 'APRILINCOME', 'April'), Months), '"') AS Months,
			MonthIncome
		FROM
			unknownTable UNPIVOT(MonthIncome FOR Months IN (
				januaryIncome,
				februaryIncome,
				marchIncome,
				aprilIncome
			))
	) X ORDER BY yearKey;
Copy

ベストプラクティス

  • 変換ツールに列に関する情報を提供する方法は2つあります。 TD_UNPIVOT 呼び出しと同じファイルにテーブル仕様を配置するか、 SELECT * またはテーブル名の代わりに ON 式の SELECT クエリで列リストを指定します。

  • この問題は、入力テーブルの ALL の列がピボットされていない場合は、安全に無視することができます。そうでない場合は、列が欠落してしまいます。

  • さらにサポートが必要な場合は、 snowconvert-support@snowflake.com までメールでお問い合わせください。

SSC-FDM-TD0028

JSON_TABLE は変換されず、セマンティック情報から列の名前を取得できませんでした

注釈

この FDM は非推奨です。 SSC-EWI-TD0060 を参照してください。

説明

JSON_TABLE 関数は SnowConvert AI で変換できますが、この変換には JSON_TABLE ON サブクエリで選択されている列の名前を知っている必要があります。

このメッセージは、列の名前がサブクエリに明示的に記述されておらず(たとえば SELECT * が使用されている)、参照されているテーブルのセマンティック情報が見つからなかった、つまり列の名前を抽出できなかったことを警告するために生成されます。

コード例

入力コード:
 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 TABLE demo.Train (
    firstCol INT,
    jsonCol VARIANT,
    thirdCol VARCHAR(30)
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"teradata"}}'
;

SELECT
    * FROM
    (
        SELECT
            firstCol,
            rowexpr.value:name :: CHAR(20) AS Column_0,
            rowexpr.value:type :: VARCHAR(20) AS Column_1,
            thirdCol
        FROM
            demo.Train T,
            TABLE(FLATTEN(INPUT => jsonCol:schools)) rowexpr
    ) JT;

    SELECT
    * FROM
    --** SSC-FDM-TD0028 - JSON_TABLE NOT TRANSFORMED, COLUMN NAMES COULD NOT BE RETRIEVED FROM SEMANTIC INFORMATION **
    JSON_TABLE
   (ON
       !!!RESOLVE EWI!!! /*** SSC-EWI-0108 - THE FOLLOWING SUBQUERY MATCHES AT LEAST ONE OF THE PATTERNS CONSIDERED INVALID AND MAY PRODUCE COMPILATION ERRORS ***/!!! (
        SELECT
            T.*
                  FROM
            demo.missingTable T)
   USING rowexpr('$.schools[*]')
                  colexpr('[ {"jsonpath" : "$.name",
                           "type" : "CHAR(20)"},
                          {"jsonpath" : "$.type",
                           "type" : "VARCHAR(20)"}]')
   )
   AS JT;
Copy

ベストプラクティス

  • SnowConvert AI に提供されたコードが完全であることを確認してください。テーブル定義を提供していない場合は、テーブル定義がある状態でコードを再実行してください。

  • さらにサポートが必要な場合は、 snowconvert-support@snowflake.com までメールでお問い合わせください。

SSC-FDM-TD0029

Snowflakeがサポートする TO_CHAR の形式はTeradataと異なるため、失敗したり動作が異なったりする場合があります。

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

Teradata形式要素の中には、セッションパラメーターの値に依存するSnowflake関数にマッピングされるものがあります。結果の機能的な差異を避けるために、これらのセッションパラメーターをTeradataと同じ値に設定する必要があります。この種の関数にマッピングされる形式要素は以下の通りです。

  • DDAYOFWEEK 関数にマップされます。この関数の結果は WEEK_START セッションパラメーターに依存します。デフォルトでは、Teradataは日曜日を週の初めとみなしますが、Snowflakeでは月曜日を週の初日とみなします。

  • WWWEEK 関数にマップされます。この関数はセッションパラメーター WEEK_OF_YEAR_POLICY に依存します。このパラメーターはデフォルトで ISO 標準(1年の最初の週は、1月の少なくとも4日を含む最初の週)を使用するように設定されていますが、Teradataでは1月1日を最初の週の開始とみなすように設定されています。

セッションパラメーターを変更するには、 ALTER SESSION SET parameter_name = value を使用します。セッションパラメーターの詳細については、 このページ をご参照ください。

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

TO_CHAR(Datetime) の単一パラメーターバージョンは、セッションパラメーター TIMESTAMP_LTZ_OUTPUT_FORMATTIMESTAMP_NTZ_OUTPUT_FORMATTIMESTAMP_TZ_OUTPUT_FORMATTIME_OUTPUT_FORMAT で指定されたデフォルト形式を使用します。動作の違いを避けるために、Teradataで使用されているものと同じ値に設定してください。

TO_CHAR(Numeric) の場合、Snowflakeは TM9 または TME 形式のいずれかを使用してvarchar表現を生成し、数値のコンパクトな表現を取得します。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') /*** SSC-FDM-TD0029 - SNOWFLAKE SUPPORTED FORMATS FOR TO_CHAR DIFFER FROM TERADATA AND MAY FAIL OR HAVE DIFFERENT BEHAVIOR ***/;

SELECT
TO_CHAR(date '2010-10-20', 'MM/DD/YYYY') /*** SSC-FDM-TD0029 - SNOWFLAKE SUPPORTED FORMATS FOR TO_CHAR DIFFER FROM TERADATA AND MAY FAIL OR HAVE DIFFERENT BEHAVIOR ***/;

SELECT
PUBLIC.INSERT_CURRENCY_UDF(TO_CHAR(1255.495, 'S9999.0000'), 2, 'EUR') /*** SSC-FDM-TD0029 - SNOWFLAKE SUPPORTED FORMATS FOR TO_CHAR DIFFER FROM TERADATA AND MAY FAIL OR HAVE DIFFERENT BEHAVIOR ***/;

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

ベストプラクティス

  • FF を使用する場合は、Teradataで使用しているものと同じ精度の DateTime 型を使用するか、形式要素に精度を追加して、異なる動作を避けるようにしてください。

  • タイムゾーン関連の形式要素を使用する場合は、異なる動作を避けるために TIMESTAMP_TZ 型の最初のパラメーターを使用します。また、Snowflakeでは TIME 型にタイムゾーン情報を持たせることはできないことを覚えておいてください。

  • 異なる動作を避けるために、必要なセッションパラメーターをTeradataのデフォルト値で設定します。

  • さらにサポートが必要な場合は、 snowconvert-support@snowflake.com までメールでお問い合わせください。

SSC-FDM-TD0030

同じ実行フローを保証するために、Labelセクションの最後にreturnステートメントが追加されました。

説明

GotoステートメントがLabelセクションに置き換えられ、returnステートメントを含まない場合、同じ実行フローを保証するために、セクションの最後にreturnステートメントを追加します。

Gotoコマンドの後に BTEQ が実行されると、gotoコマンドとlabelコマンドの間にある同名のステートメントは無視されます。そのため、これらのステートメントが実行されるのを避けるために、Labelセクションには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
    -- Additional Params: --scriptsTargetLanguage SnowScript
    --.LOGON dbc,dbc
    !!!RESOLVE EWI!!! /*** SSC-EWI-0073 - PENDING FUNCTIONAL EQUIVALENCE REVIEW FOR 'BTLogOn' NODE ***/!!!
    null;
    BEGIN
      SELECT
        'STATEMENTS';
      STATUS_OBJECT := OBJECT_CONSTRUCT('SQLROWCOUNT', SQLROWCOUNT);
    EXCEPTION
      WHEN OTHER THEN
        STATUS_OBJECT := OBJECT_CONSTRUCT('SQLCODE', SQLCODE, 'SQLERRM', SQLERRM, 'SQLSTATE', SQLSTATE);
    END;
     
    /*.label LABEL_B*/
     
    BEGIN
      SELECT
        'LABEL_B STATEMENTS';
      STATUS_OBJECT := OBJECT_CONSTRUCT('SQLROWCOUNT', SQLROWCOUNT);
    EXCEPTION
      WHEN OTHER THEN
        STATUS_OBJECT := OBJECT_CONSTRUCT('SQLCODE', SQLCODE, 'SQLERRM', SQLERRM, 'SQLSTATE', SQLSTATE);
    END;
    --** SSC-FDM-TD0030 - A RETURN STATEMENT WAS ADDED AT THE END OF THE LABEL SECTION LABEL_B TO ENSURE THE SAME EXECUTION FLOW **
    RETURN 0;
    BEGIN
      SELECT
        'IGNORED STATEMENTS';
      STATUS_OBJECT := OBJECT_CONSTRUCT('SQLROWCOUNT', SQLROWCOUNT);
    EXCEPTION
      WHEN OTHER THEN
        STATUS_OBJECT := OBJECT_CONSTRUCT('SQLCODE', SQLCODE, 'SQLERRM', SQLERRM, 'SQLSTATE', SQLSTATE);
    END;
    /*.label LABEL_B*/
    --** SSC-FDM-0027 - REMOVED NEXT STATEMENT, NOT APPLICABLE IN SNOWFLAKE.  **
     
    BEGIN
      SELECT
        'LABEL_B STATEMENTS';
      STATUS_OBJECT := OBJECT_CONSTRUCT('SQLROWCOUNT', SQLROWCOUNT);
    EXCEPTION
      WHEN OTHER THEN
        STATUS_OBJECT := OBJECT_CONSTRUCT('SQLCODE', SQLCODE, 'SQLERRM', SQLERRM, 'SQLSTATE', SQLSTATE);
    END;
  END
$$
Copy

ベストプラクティス

SSC-FDM-TD0031

ST_DISTANCE の結果は ST_SPHERICALDISTANCE と若干異なります。

説明

Teradataの関数 ST_SPHERICALDISTANCE は、地球上の2つの球面座標間の距離をハバーサイン公式を用いて計算します。一方、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
Teradata出力

location1

location2

Distance_In_Km

POINT (-73.989308 40.741895)

POINT (40.741895 34.053691)

9351139.978062356

生成されたコード
 --The distance between New York and Los Angeles
SELECT
	TO_GEOGRAPHY('POINT(-73.989308 40.741895)') As location1,
	TO_GEOGRAPHY('POINT(40.741895 34.053691)') As location2,
	--** SSC-FDM-TD0031 - ST_DISTANCE RESULTS ARE SLIGHTLY DIFFERENT FROM ST_SPHERICALDISTANCE **
	ST_DISTANCE(
	location1, location2) As Distance_In_km;
Copy
Snowflake出力

LOCATION1

LOCATION2

DISTANCE_IN_KM

{ "coordinates": [ -73.989308, 40.741895 ], "type": "Point" }

{ "coordinates": [ 40.741895, 34.053691 ], "type": "Point" }

9351154.65572674

ベストプラクティス

SSC-FDM-TD0032

CASESPECIFIC 句は LIKE 式から削除されました。

注釈

わかりやすくするため、出力コードの一部を省略しています。

説明

このエラーは、 LIKE 式が [NOT]CASESPECIFIC 句を伴っている場合に表示されます。

コード例

入力コード:
 SELECT * FROM MY_TABLE
WHERE Name Like 'Marco%' (NOT CASESPECIFIC);
Copy
生成されたコード
 SELECT
    * FROM
    MY_TABLE
WHERE Name ILIKE 'Marco%' /*** SSC-FDM-TD0032 - NOT CASESPECIFIC CLAUSE WAS REMOVED ***/;
Copy

ベストプラクティス

  • TERADATA におけるケース固有の動作は、 TMODE システム構成に依存します。

  • さらにサポートが必要な場合は、 snowconvert-support@snowflake.com までメールでお問い合わせください。

SSC-FDM-TD0033

ACTIVITY_COUNT 変換には手動の調整が必要になることがあります。

説明

ACTIVITY_COUNT ステータス変数は、組み込み SQL またはストアドプロシージャアプリケーションのSQL DML ステートメントによって影響を受ける行の数を返します。詳しくは、 こちら をご参照ください。

その翻訳仕様で説明されているように、以下によって ACTIVITY_COUNT の動作をエミュレートする回避策があります。

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

しかし、これには以下のような制限があります。

制限

最初の例

別の DML ステートメントを実行する前に ACTIVITY_COUNT を2回以上呼び出すと、変換が期待する値を返さないことがあります。

Teradata
 REPLACE PROCEDURE InsertEmployeeSalaryAndLog_1 ()
BEGIN
    DECLARE row_count1 INT;

    INSERT INTO employees (employee_id, first_name, last_name, department_id, salary)
    VALUES (101, 'Alice', 'Smith', 10, 70000.00);

    -- Get the ACTIVITY_COUNT
    SET row_count1 = ACTIVITY_COUNT;
    SET row_count1 = ACTIVITY_COUNT;

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

REPLACE PROCEDURE InsertEmployeeSalaryAndLog_2 ()
BEGIN
    DECLARE row_count1 INT;
    DECLARE message VARCHAR(100);

    INSERT INTO employees (employee_id, first_name, last_name, department_id, salary)
    VALUES (101, 'Alice', 'Smith', 10, 70000.00);

    -- Get the ACTIVITY_COUNT
    SET row_count1 = ACTIVITY_COUNT + 1;
    SET row_count1 = ACTIVITY_COUNT;

    -- Insert the ACTIVITY_COUNT into the activity_log table
    INSERT INTO activity_log (operation, row_count)
    VALUES ('INSERT PROCEDURE', row_count1);
END;
Copy
Snowflake
 CREATE OR REPLACE PROCEDURE InsertEmployeeSalaryAndLog_1 ()
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "teradata",  "convertedOn": "07/15/2024" }}'
EXECUTE AS CALLER
AS
$$
    DECLARE
        row_count1 INT;
    BEGIN
         
        INSERT INTO employees (employee_id, first_name, last_name, department_id, salary)
        VALUES (101, 'Alice', 'Smith', 10, 70000.00);

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

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

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

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

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

どちらのプロシージャでも、 DML ステートメントが呼び出される前に、 ACTIVITY_COUNT が2回呼び出されます。Teradataでは、 ACTIVITY_COUNT は、2回呼び出された場合でも、その上の INSERT ステートメントの行数を返します。しかし、Snowflake変換は LAST_QUERY_ID() を使用するため、結果は LAST_QUERY_ID() が保持する結果セットに依存します。

InsertEmployeeSalaryAndLog_1() は手動での調整を必要としません。クエリ履歴を確認する(下から上):

Query History when calling InsertEmployeeSalaryAndLog_1()

  1. INSERT ステートメントが実行されます。 LAST_QUERY_ID() はこのステートメントを指します。

  2. SELECT (最初の ACTIVITY_COUNT ) が実行され、 $11 になります。LAST_QUERY_ID() はこのステートメントを指します。

  3. SELECT (2番目の ACTIVITY_COUNT )が実行されます。最後のステートメントの結果は 1 なので、この SELECT についても $11 になります。

  4. 最後に、 row_count1 は値 1 を保持し、これは activity_log に挿入されます。

一方、 InsertEmployeeSalaryAndLog_2() は手動での調整が必要となります。クエリ履歴を確認する(下から上):

Query History when calling InsertEmployeeSalaryAndLog_2()

  1. INSERT ステートメントが実行されます。 LAST_QUERY_ID() はこのステートメントを指します。

  2. SELECT (最初の ACTIVITY_COUNT )が実行され、 $11 となります。しかし、 QUERY_TEXT+ 10 を持っていることに注意してください。 LAST_QUERY_ID() はこのステートメントを指します。

  3. SELECT (2番目の ACTIVITY_COUNT )が実行されます。最後のクエリの結果は 11 です。したがって $11 の代わりに 11 を保持します。

  4. 最後に、 row_count1 は値 11 を保持し、これは activity_log に挿入されます。

これらは、 activity_log に挿入される値です。

LOG_ID

OPERATION

ROW_COUNT

LOG_TIMESTAMP

1

INSERT PROCEDURE

1

2024-07-15 09:22:21.725

101

INSERT PROCEDURE

11

2024-07-15 09:22:26.248

最初のケースの調整

Snowflakeの LAST_QUERY_ID のドキュメントにあるように、クエリの位置によって返すクエリを指定することができます。 LAST_QUERY_ID(-1) は最新のクエリ、 (-2) は最後から2番目のクエリ、といった具合です。

InsertEmployeeSalaryAndLog_2() の問題の修正は、 LAST_QUERY_ID(-2)ACTIVITY_COUNT の2回目の使用(2番目の SELECT )で指定するだけで、代わりに INSERT ステートメントからの結果を取得するようになります。

 ...
INSERT INTO employees (employee_id, first_name, last_name, department_id, salary)
        VALUES (101, 'Alice', 'Smith', 10, 70000.00);

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

2番目のケース

DML 以外のステートメントが実行された後に ACTIVITY_COUNT が呼び出された場合、変換は期待される値を返しません。

Teradata
REPLACE PROCEDURE InsertEmployeeSalaryAndLog_3 ()
BEGIN
    DECLARE row_count1 INT;
    DECLARE emp_id INT;
    DECLARE message VARCHAR(100);

    INSERT INTO employees (employee_id, first_name, last_name, department_id, salary)
    VALUES (101, 'Alice', 'Smith', 10, 70000.00);

    SELECT employee_id INTO emp_id FROM employees;
    -- Get the ACTIVITY_COUNT
    SET row_count1 = ACTIVITY_COUNT;
    SET message = 'EMPLOYEE INSERTED - ID: ' || emp_id;

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

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

前述と同様に、 LAST_QUERY_ID は正しいクエリを指していないため、正しくない値を返し、それがrow_count1に割り当てられます。クエリ履歴を確認する(下から上):

Query History when calling InsertEmployeeSalaryAndLog_3()

  1. INSERT ステートメントが実行されます。 LAST_QUERY_ID() はこのステートメントを指します。

  2. SELECT INTO が実行され、$1は101になります。 LAST_QUERY_ID() はこのステートメントを指します。

  3. SELECTACTIVITY_COUNT )が実行されます。最後のクエリの結果は 101 です。したがって、 $1 は期待される1ではなく、 101 となります。

  4. 最後に、 row_count1 は値 101 を保持し、これは activity_log に挿入されます。

これらはactivity_logに挿入される値です。

LOG_ID

OPERATION

ROW_COUNT

LOG_TIMESTAMP

1

EMPLOYEE INSERTED - ID:101

101

2024-07-15 11:00:38.000

2番目のケースの調整

  1. 可能な修正方法の1つが、 LAST_QUERY_ID が返す正しいクエリを指定することです。たとえば、 LAST_QUERY_ID(-2) が指すべき正しいクエリになります。

 ...
row_count1 := (
            SELECT
                $1
            FROM
                TABLE(RESULT_SCAN(LAST_QUERY_ID(-2)))
               ) /*** SSC-FDM-TD0033 - 'ACTIVITY_COUNT' TRANSFORMATION MIGHT REQUIRE MANUAL ADJUSTMENTS ***/;
               ...
Copy
  1. もう1つの修正方法は、INSERT ステートメントを実行した直後に、 ACTIVITY_COUNTSELECT )を使用することです。

...
INSERT INTO employees (employee_id, first_name, last_name, department_id, salary)
VALUES (101, 'Alice', 'Smith', 10, 70000.00);
-- Get the ACTIVITY_COUNT
       row_count1 := (
    SELECT
        $1
    FROM
        TABLE(RESULT_SCAN(LAST_QUERY_ID()))
       ) /*** SSC-FDM-TD0033 - 'ACTIVITY_COUNT' TRANSFORMATION MIGHT REQUIRE MANUAL ADJUSTMENTS ***/;
SELECT
    employee_id INTO
    :emp_id
FROM
    employees;
       message := 'EMPLOYEE INSERTED - ID: ' || emp_id;
...
Copy

ベストプラクティス

  • LAST_QUERY_ID を使用する際は、必ず正しいクエリを指定してください。

  • DML ステートメントの直後に、必ず ACTIVITY_COUNT が使用されるようにしてください。

  • さらにサポートが必要な場合は、 snowconvert-support@snowflake.com までメールでお問い合わせください。

SSC-FDM-TD0034

Periodはユーザー定義関数に変換されたものを含みます。

説明

Teradata CONTAINS 式は、右側の要素が、 PERIOD 型とされる左側の要素に含まれているかどうかを示す検証を実行します。CONTAINS は、 DATETIMETIMESTAMP または PERIOD にのみ適用されます。Snowflakeでは PERIOD がサポートされていないため、ユーザー定義関数はネイティブの CONTAINS 動作のロジックをエミュレートします。

コード例

入力コード:
  UPDATE TABLE1
  SET COL1 = CURRENT_TIMESTAMP
  WHERE COL3 CONTAINS CURRENT_TIMESTAMP;
Copy
生成されたコード
  UPDATE TABLE1
  SET
    COL1 = CURRENT_TIMESTAMP()
  WHERE
    PUBLIC.PERIOD_CONTAINS_UDF(COL3, CURRENT_TIMESTAMP()) /*** SSC-FDM-TD0034 - PERIOD CONTAINS EXPRESSION TRANSFORMED TO USER DEFINED FUNCTION. ***/
Copy

ベストプラクティス

  • PERIOD の代わりに使用される VARCHAR は、すべての値において <PERIOD_BEGIN>*<PERIOD_END> の形式を想定しています。値が * と異なるトークンで分割されている場合、 SnowConvertAI が提供する PUBLIC.GET_PERIOD_SEPARATOR UDF から返される値を変更できます。その構造には、 PERIOD の開始と終了をマークするトークンがあるはずなので、2つの日付、時刻、タイムスタンプは、常に同じトークンで区切られている必要があります。

  • さらにサポートが必要な場合は、 snowconvert-support@snowflake.com までメールでお問い合わせください。

SSC-FDM-TD0035

統計関数はSnowflakeでは必要ありません。

注釈

この FDM は非推奨です。 SSC-EWI-0037 ドキュメントを参照してください。

説明

DROP 、 COLLECT 、または HELP 統計は、Snowflakeでは必要ありません。Snowflakeはすでに自動クエリ最適化に使用される統計情報を収集しているため、これらの統計ステートメントはTeradataで使用されます。

コード例

入力コード:
  HELP STATISTICS TestName;
Copy
生成されたコード
  ----** SSC-FDM-TD0035 - HELP STATISTICS NOT NEEDED. SNOWFLAKE AUTOMATICALLY COLLECTS STATISTICS. **
  --HELP STATISTICS TestName
Copy

ベストプラクティス

SSC-FDM-TD0036

Snowflakeはperiodデータ型をサポートしておらず、すべてのperiodはvarcharとして処理されます

注釈

わかりやすくするため、出力コードの一部を省略しています。

生成されるvarchar表現の精度

PERIOD_UDF は、Snowflakeで指定されたタイムスタンプと時間のデフォルト形式を使用してperiodのvarchar表現を生成します。つまり、タイムスタンプは3桁の精度を持ち、時刻変数は0の精度を持つことを意味します。このため、結果の精度が予想よりも高くなったり低くなったりすることがあります。結果の文字列に含まれる精度の桁数を変更するには2つの方法があります。

  • PERIOD_UDF の3種類のパラメーターバージョンを使用します。この関数のオーバーロードは PRECISIONDIGITS パラメーターを使用し、0から9までの整数で結果に含まれる時間の小数部の桁数を制御します。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'

  • セッションパラメーター TIMESTAMP_NTZ_OUTPUT_FORMATTIME_OUTPUT_FORMAT を変更します。コマンド 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) /*** SSC-FDM-TD0036 - SNOWFLAKE DOES NOT SUPPORT THE PERIOD DATATYPE, ALL PERIODS ARE HANDLED AS VARCHAR INSTEAD ***/
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"teradata"}}'
;

INSERT INTO vacations
VALUES ('Richard', PUBLIC.PERIOD_UDF(date '2021-05-15', date '2021-06-15') /*** SSC-FDM-TD0036 - SNOWFLAKE DOES NOT SUPPORT THE PERIOD DATATYPE, ALL PERIODS ARE HANDLED AS VARCHAR INSTEAD ***/);

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

ベストプラクティス

  • PERIOD とその関連する関数の動作はvarcharを使用してエミュレートされるため、その正しさを保証するために得られた結果を確認することをお勧めします。

  • さらにサポートが必要な場合は、 snowconvert-support@snowflake.com までメールでお問い合わせください。

SSC-FDM-TD0037

LOGTABLE removed.

説明

The .LOGTABLE command in MLoad is used for checkpoint and restart metadata, but Snowflake handles these features automatically. Instead of .LOGTABLE, you can monitor and audit your data loads in Snowflake using the COPY_HISTORY function and related account usage views.

コード例

入力コード:
.LOGTABLE ${DATABASE}.LT_EMPLOYEES;
Copy
生成されたコード:
--** SSC-FDM-TD0037 - REMOVED NEXT STATEMENT. USE COPY_HISTORY() FOR MONITORING **
-- .LOGTABLE ${DATABASE}.LT_EMPLOYEES;
Copy

ベストプラクティス

SSC-FDM-TD0038

PUT command requires SnowSQL execution.

説明

The PUT command lets you upload files to a Snowflake stage, but it only works when you run your script with SnowSQL. It won't work inside scripts, procedures, or the web UI. If your script includes a PUT command, make sure to run it using SnowSQL.

コード例

生成されたコード:
CREATE TEMPORARY STAGE IF NOT EXISTS sc_import_stage;

--** SSC-FDM-TD0038 - PUT COMMAND REQUIRES EXECUTION THROUGH SNOWSQL. **
PUT file://employees.csv @sc_import_stage;

EXECUTE IMMEDIATE
$$
  DECLARE
    STATUS_OBJECT OBJECT := OBJECT_CONSTRUCT('SQLCODE', 0);
  BEGIN
    BEGIN
      COPY INTO employees (
        employee_id,
        first_name,
        last_name
      )
      FROM
      (
        SELECT
          $1,
          $2,
          $3
        FROM
          @sc_import_stage/employees.csv
      )
      FILE_FORMAT = (TYPE = CSV FIELD_DELIMITER = ',')
      ON_ERROR = 'CONTINUE';
    END;
  EXCEPTION
    WHEN OTHER CONTINUE THEN
      STATUS_OBJECT := OBJECT_CONSTRUCT('SQLCODE', SQLCODE, 'SQLERRM', SQLERRM, 'SQLSTATE', SQLSTATE);
  END
$$
Copy

ベストプラクティス

SSC-FDM-TD0039

Collation handled at query level for this table, any new query over this table should apply collation appropriately.

説明

When the "Disable use of COLLATE for Case Specification" general conversion setting is enabled, SnowConvert AI will emulate the case insensitive behavior of the NOT CASESPECIFIC clause by modifying comparisons in queries with the UPPER function, this is performed at query level instead of using collation at the column level. This warning will be generated on any table whose case sensitivity is being emulated at the query level to remind the user that any new query over these tables will require to properly handle the case sensitivity behavior on comparisons.

コード例

入力コード:
CREATE TABLE my_table
(
    col1 VARCHAR(50) NOT CASESPECIFIC
);

SELECT * FROM my_table WHERE col1 = 'test';
Copy
生成されたコード:
--** SSC-FDM-TD0039 - COLLATION HANDLED AT QUERY LEVEL FOR THIS TABLE, ANY NEW QUERY OVER THIS TABLE SHOULD APPLY COLLATION APPROPRIATELY **
CREATE OR REPLACE TABLE my_table
(
    col1 VARCHAR(50)
);

SELECT
    * FROM
    my_table
WHERE
    UPPER(RTRIM( col1)) = UPPER(RTRIM('test'));
Copy

ベストプラクティス

  • If you provided all your queries over the table to SnowConvert as part of your transformation then no additional actions are required, this FDM is informational only.

  • さらにサポートが必要な場合は、 snowconvert-support@snowflake.com までメールでお問い合わせください。