SnowConvert: Teradataの機能差

SSC-FDM-TD0001

説明

このメッセージは、 SnowConvert が BLOB データ型を検出したときに表示されます。Snowflakeは BLOB をサポートしていないため、自動的にバイナリデータ型に変換されます。

コード例

入力コード:
 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

説明

このメッセージは、 SnowConvert が CLOB データ型に遭遇したときに表示されます。SnowConvert は CLOB をサポートしていないため、自動的に 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

説明

SnowConvert がスクリプトファイルをSnowflake Scriptingに移行する際、Bashスタイルの変数プレースホルダー($variableまたは${variable})を 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
生成されたコード:
-- Additional Params: -q snowscript

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

説明

Teradataの PERIOD データ型は時間間隔を表します。各 PERIOD には、同じタイプ(TIME、 DATE、または TIMESTAMP)の開始値と終了値があります。Teradataは、これらの時間間隔を作成管理するために、 PERIOD、 BEGIN、 END、 OVERLAPS のような組み込み関数を提供しています。

Snowflakeは期間データ型をサポートしていないため、 SnowConvert は、特定の変換ルールを使用してこの型と関連関数を変換します。

  • 列テーブルの期間タイプ宣言は、同じタイプの2つの列に変換されます。

  • 期間値のコンストラクター関数 は、開始値のコンストラクターと終了値のコンストラクターに分かれています。

  • 期間タイプのパラメーターを必要とする関数は、ユーザー定義関数(UDFs)に変換されます。これらの UDFs には、通常2つのパラメーターが必要です。1つは開始値、もう1つは終了値です。

コード例

入力コード:
 -- 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

説明

Teradataでは、 SET TIME ZONE コマンドを使用して、 -12:59 から +14:00 の間でユーザーは任意のタイムゾーンオフセットを設定できます。ただし、Snowflakeは、 IANA タイムゾーンデータベース に公式にリストされているタイムゾーンのみをサポートしています。

オフセットを指定して SET TIME ZONE を使用する場合、指定されたオフセットがどの標準タイムゾーンにも正確に一致しない場合、Snowflakeは最も近い 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 が WITH CHECK OPTION 句を含むビューを検出したときに表示されます。Snowflakeはこの機能をサポートしていないため、変換後のコードでは句が自動的にコメントアウトされます。

この句を使用すると、更新可能なビューに対して INSERT および UPDATE 操作を実行できます。ビューに対してこれらのコマンドを実行すると、そのビューに関連付けられた基になるテーブルに変更が自動的に適用されます。

WHERE 句は、表示内のコマンドによって影響を受ける行をフィルターします。

この句とその関数の詳細情報については、 Teradataの公式ドキュメント をご参照ください。

コード例

入力コード:
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":1, "minor":0},{"attributes":{"component":"teradata"}}'
AS
SELECT
    *
FROM
    SOMETABLE
WHERE app_id = 'SUPPLIER'
--    --** SSC-FDM-TD0006 - VIEW WITH OPTION NOT SUPPORTED IN SNOWFLAKE **
--    WITH CHECK OPTION
                     ;
Copy

ベストプラクティス

SSC-FDM-TD0007

説明

このメッセージは、 SnowConvert がバリアントデータ型を持つコードの変換中に COLLATE 句に遭遇すると表示されます。バリアントデータ型は COLLATE 句をサポートしていないため、 SnowConvert は COLLATE 句を削除し、通知メッセージを表示します。

コード例

入力コード:
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

説明

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

説明

このメッセージは、 SnowConvert が VARCHAR 以外のデータ型を持つ DEFAULT SESSION を検出したときに表示されます。このような場合、 SnowConvert は自動的にデータ型を 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」という列は、 INTEGER データ型で定義され、 DEFAULT SESSION 設定を持っています。データ型が VARCHAR ではなく INTEGER であるため、システムは自動的に VARCHAR に変換して出力します。

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

ベストプラクティス

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

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

SSC-FDM-TD0010

説明

Teradataテーブル DBC.COLUMNSV はSnowflakeの INFORMATION_SCHEMA.COLUMNS にマッピングされます。ただし、以下の点にご注意ください。

  1. Teradataの列には、Snowflakeに対応する列がないものがあります。

  2. 列がシステム間で一致しても、データの内容が異なる場合があります。

Teradataにある DBC.COLUMNSV テーブル構造のサンプルビュー

Snowflakeにある INFORMATION_SCHEMA.COLUMNS テーブルのサンプルビュー

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
TABLE_NAME = 'TableN';
Copy

ベストプラクティス

  • Teradataで使用されている列とSnowflakeで使用可能な列を比較し、要件を満たしていることを確認します。

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

SSC-FDM-TD0011

説明

SnowflakeはUnicode基本多言語面(BMP)文字をサポートしていません。このメッセージは、 SnowConvert が、Unicode BMP エスケープシーケンスを含むTeradata Unicode区切り文字リテラル を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 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-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スクリプト
 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

説明

このメッセージが表示されるのは、 BTEQ ERRORCODE 組み込み変数に格納されているエラーコードが、Snowflake Scriptingで同等のコードに直接マッピングできないためです。

コード例

入力コード:
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

説明

この警告は、環境ファイルから SQL ステートメントを実行する BTEQ コードを移行するときに表示されます(例: $(<$INPUT_SQL_FILE))。注意すべき重要な動作の違いがあります。 BTEQ は、1つのステートメントが失敗しても残りのステートメントを実行し続けますが、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 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

注釈

この FDM は現在サポートされていません。詳細情報については、 SSC-EWI-0009 をご参照ください。

説明

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

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

コード例

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

説明

Teradataの正規表現関数(REGEX_SUBSTRREGEX_REPLACEREGEX_INSTR)には、 「match_arg」 というパラメーターがあります。このパラメーターは、特定の値を受け付ける文字引数です。

  • 「i」: 大文字と小文字に関係なく文字に一致します。

  • 「c」: 大文字と小文字を考慮し、出現した文字に正確に一致します。

  • 「n」: ピリオド(.)が改行文字に一致するようにします。

  • 「m」: 入力文字列を連続した一行ではなく、複数の行として扱います。

  • 「l」: 入力文字列が16 MB より大きい場合は、エラーを発生させる代わりに NULL を返します。

  • 'x': パターン内のスペースや空白文字を無視します。

この関数は複数の文字を入力として受け付けます。

Snowflakeでは、これらの関数は _ regexp_parameters_ を同等の引数として使用します。この引数は、正規表現パターンマッチングの動作を定義する1つ以上の文字を含む文字列です。サポートされている値は次のとおりです。

  • c: パターンマッチングの大文字と小文字を区別します

  • i: パターンマッチングの大文字と小文字を区別しません

  • m: 複数行にわたるマッチングが可能です

  • e: 一致からサブパターンの抽出を許可します

  • s: ドット(.)ワイルドカードが改行文字に一致することを許可します

このように、データ型インジケーター 「i」、「c」、「m」 は両言語で同一です。Teradataの値 「n」 は、ターゲットシステムの 「s」 に対応します。しかし、Teradataの値 '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

注釈

この FDM は廃止されました。詳細情報については、 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
--** 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 <テーブル> ステートメントと互換性のあるすべてのデータ形式をサポートしています。

  • SnowflakeのIcebergテーブル は、別のソリューションを提供します。これらのテーブルはオープン形式を使用し、データをクラウドストレージ内のParquetファイルに格納します。

  • 標準的なSnowflakeテーブル は、Teradataの外部テーブルと同様の機能を提供することもできます。

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

SSC-FDM-TD0018

注釈

この FDM は現在サポートされていません。詳細情報については、 SSC-EWI-TD0063 をご参照ください。

説明

このエラーは、 SnowConvert の文字列形式が無効であるか、Snowflakeがサポートしていないため、 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

説明

Teradataでは、トランザクション、セッション、プロファイルの3つの異なるレベルでクエリバンド(メタデータタグ)を設定することができます。ユーザーは、 GetQueryBandValue などの関数を使用して、これらのクエリバンド値を取得することができます。

Snowflakeはクエリバンドの代わりにquery_tagパラメーターを使用します。query_tagはセッション、ユーザー、アカウントレベルで設定できます。Snowflakeはプロファイルをサポートしていません。

この機能移行の詳細(FMD)では、Snowflakeがトランザクションまたはプロファイルレベルのクエリタグをサポートしていないことをユーザーに警告します。代わりに、セッションレベルのクエリタグが使われます。この変更は、特定のシナリオで関数に影響を与える可能性があります。

コード例

入力コード:
 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

注釈

わかりやすくするため、いくつかのセクションを省略してコードを簡略化しています。

説明

このエラーは、 SnowConvert による変換中に 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

注釈

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

説明

この機能差メッセージ(FDM)は、 SnowConvert が類似性関数をTeradataからSnowflakeに変換する際に表示されます。関数の動作は2つのプラットフォームで異なる場合があるため注意してください。

コード例

以下のデータを例として使用

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

説明

この警告は、 SnowConvert が SET オプション付きの CREATE TABLE ステートメントを検出したときに表示されます。Snowflakeは SET TABLE をサポートしていないため、 SnowConvert は変換時にこのオプションを削除します。

コード例

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

説明

テンポラルテーブルや時間ベースの操作(DDL および DML)を含むTeradataデータベースのテンポラル機能は、Snowflakeでは直接再現できません。Snowflakeは現在のところ、Teradataと同じように時間テーブルや時間を意識したデータ管理をサポートしていません。Teradataのテンポラル機能に関する情報は、 Teradataデータベーステンポラルサポート をご参照ください。

これらのステートメントは解析中に SnowConvert によって認識されますが、Snowflakeの実行環境との互換性を確保するため、翻訳プロセス中に削除されます。

abort ステートメントに遭遇すると、 Delete コマンドに変換されます。これにより、トランザクション操作をロールバックしてデータベースを元の状態に戻すことができ、同等の関数が維持されます。

コード例

次の例は、テンポラル形式の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 Policy_Type = '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

注釈

わかりやすくするために、いくつかの部分を省略してコードを簡略化しています。

説明

SQL IF ステートメントの関数を複製する場合、開発者はしばしば GOTO コマンドと IF、 LABEL コマンドを組み合わせます。これらの組み合わせは、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

注釈

この FDM は現在サポートされていません。詳細情報については、 SSC-EWI-TD0061 をご参照ください。

説明

SnowConvert (SC)は、Teradataの 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

注釈

この FDM は現在サポートされていません。詳細情報については、 SSC-EWI-TD0060 をご参照ください。

説明

SnowConvert ツールは JSON_TABLE 関数を変換できますが、変換を正しく実行するには 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 にコードを提供する際には、必ずテーブル定義を含めるようにしてください。これがないと、コードをもう一度実行する必要があります。

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

SSC-FDM-TD0029

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

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

  • D: DAYOFWEEK 関数にマッピング。TeradataとSnowflakeではデフォルトの設定が異なるため、結果が異なります。Teradataは日曜日を週の最初の曜日として使用し、Snowflakeは月曜日を使用しています。これは WEEK_START セッションパラメーターで制御されます。

  • WW: WEEK 関数にマッピング。動作は WEEK_OF_YEAR_POLICY セッションパラメーターによって制御されます。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') /*** 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

説明

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

説明

Teradata関数 ST_SPHERICALDISTANCE は、球座標を使用して地球上の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
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

注釈

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

説明

このエラーは、 LIKE 式に [NOT] CASESPECIFIC 句が含まれている場合に発生します。

コード例

入力コード:
 SELECT * FROM MY_TABLE
WHERE Name Like 'Marco%' (NOT CASESPECIFIC);
Copy
出力コード
 SELECT
* FROM
MY_TABLE
WHERE Name LIKE 'Marco%' /*** SSC-FDM-TD0032 - NOT CASESPECIFIC CLAUSE WAS REMOVED ***/;
Copy

推奨事項

  • TERADATA の大文字と小文字を区別する動作は、 TMODE システム構成設定によって決まります。

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

SSC-FDM-TD0033

説明

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

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

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

しかし、考慮する必要のあるいくつかの制限があります。

制限事項

最初の例

別の DML ステートメントを実行する前に ACTIVITY_COUNT を複数回呼び出すと、正しくない結果が表示されることがあります。正確な値を得るには、各 ACTIVITY_COUNT 呼び出しの間に DML ステートメントを実行するようにしてください。

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

Teradataで ACTIVITY_COUNT を使用する場合は、 DML ステートメント(INSERT のように)の後に複数回呼び出すことができます。そうすると、そのステートメントから関係する行数を一貫して返します。しかし、Snowflakeでは、変換されたコードは異なる動作をする LAST_QUERY_ID() を使用します。LAST_QUERY_ID() のクエリ結果は、最後に実行されたクエリに依存するため、複数回呼び出した場合、その間に他のクエリが実行されると、同じ値が返されないことがあります。

ストアドプロシージャ InsertEmployeeSalaryAndLog_1() は、何の修正も必要とせずに動作します。クエリ履歴を下から上へ時系列で確認することで検証できます。

InsertEmployeeSalaryAndLog_1() の実行を示すクエリ履歴

  1. INSERT ステートメントが最初に実行され、 LAST_QUERY_ID() がこの操作を参照します。

  2. ACTIVITY_COUNT を持つ最初の SELECT ステートメントが実行され、 $11 に設定します。 LAST_QUERY_ID() はこの SELECT ステートメントをポイントします。

  3. ACTIVITY_COUNT のある2番目の SELECT ステートメントが実行されます。SELECT 前のステートメントは 1 を返したため、 $11 のままです。

  4. 1row_count1 に格納され、 activity_log テーブルに挿入されます。

InsertEmployeeSalaryAndLog_2() プロシージャを見ると、手動での修正が必要です。クエリ履歴を古いものから時系列で見てみましょう。

InsertEmployeeSalaryAndLog_2() プロシージャの実行結果を示すクエリ履歴

  1. INSERT ステートメントが実行されると、 LAST_QUERY_ID() がこの特定のステートメントを参照します。

  2. ACTIVITY_COUNT における最初の SELECT の間、 $11 と等しくなります。ただし、 QUERY_TEXT には + 10 が含まれており、最終結果は変更されます。この時点で、 LAST_QUERY_ID() はこの SELECT ステートメントをポイントしています。

  3. ACTIVITY_COUNT における2番目の SELECT が実行されると、以前のクエリが原因で 111 の代わりに)が返されます。この値は $1 に格納されます。

  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) は、最新のクエリを取得します。

  • LAST_QUERY_ID(-2) は、2番目に新しいクエリを取得します。

InsertEmployeeSalaryAndLog_2() の問題を解決する方法は、 ACTIVITY_COUNT を取得する際に、2番目の SELECT ステートメントで LAST_QUERY_ID(-2) を使用することです。これにより、前の 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 以外のステートメント(SELECT など)を実行した後に ACTIVITY_COUNT を使用すると、影響を受ける行の正しいカウントが返されません。

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
 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に不正な値を返します。クエリ履歴を逆時系列で確認することで検証できます。

InsertEmployeeSalaryAndLog_3() の実行結果を示すクエリ履歴

  1. まず、 INSERT ステートメントが実行されます。LAST_QUERY_ID() 関数は、この INSERT 操作を参照します。

  2. 次に、 SELECT INTO ステートメントが実行され、$1に101が設定されます。LAST_QUERY_ID() 関数は、この SELECT INTO 操作をポイントするようになりました。

  3. その後、 SELECT ステートメントが実行され、 ACTIVITY_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. この問題を解決するには、 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. また、挿入直後に SELECT ステートメントを使用して ACTIVITY_COUNT を確認すると、 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 ***/;
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 にお問い合わせください