SnowConvert: Teradataの機能差¶
SSC-FDM-TD0001¶
説明¶
このメッセージは、 SnowConvert が BLOB データ型を検出したときに表示されます。Snowflakeは BLOB をサポートしていないため、自動的にバイナリデータ型に変換されます。
コード例¶
入力コード:¶
CREATE TABLE TableExample
(
ColumnExample BLOB
)
生成されたコード:¶
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"}}'
;
ベストプラクティス¶
ユーザー側からのアクションは必要ありません。
その他のサポートについては、 snowconvert-support@snowflake.com にお問い合わせください
SSC-FDM-TD0002¶
説明¶
このメッセージは、 SnowConvert が CLOB データ型に遭遇したときに表示されます。SnowConvert は CLOB をサポートしていないため、自動的に VARCHAR に変換されます。
コード例¶
入力コード:¶
CREATE TABLE TableExample
(
ColumnExample CLOB
)
生成されたコード:¶
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"}}'
;
ベストプラクティス¶
ユーザー側からのアクションは必要ありません。
その他のサポートについては、 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;
生成されたコード:¶
-- 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
$$
ベストプラクティス¶
その他のサポートについては、 snowconvert-support@snowflake.com にお問い合わせください
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)
);
生成されたコード:¶
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"}}'
;
ベストプラクティス¶
その他のサポートについては、 snowconvert-support@snowflake.com にお問い合わせください
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';
生成されたコード:¶
-- 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';
ベストプラクティス¶
ユーザー側からのアクションは必要ありません。
その他のサポートについては、 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;
生成されたコード:¶
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
;
ベストプラクティス¶
その他のサポートについては、 snowconvert-support@snowflake.com にお問い合わせください
SSC-FDM-TD0007¶
説明¶
このメッセージは、 SnowConvert がバリアントデータ型を持つコードの変換中に COLLATE 句に遭遇すると表示されます。バリアントデータ型は COLLATE 句をサポートしていないため、 SnowConvert は COLLATE 句を削除し、通知メッセージを表示します。
コード例¶
入力コード:¶
CREATE TABLE TableExample
(
ColumnExample JSON(2500) NOT CASESPECIFIC
)
生成されたコード:¶
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"}}'
;
JSON データ型は自動的に VARIANT に変換されます。NOT CASESPECIFIC 仕様はすべて、同等の COLLATE 句に変換されます。
ベストプラクティス¶
ユーザー側からのアクションは必要ありません。
その他のサポートについては、 snowconvert-support@snowflake.com にお問い合わせください
SSC-FDM-TD0008¶
説明¶
Snowflakeでスペースを含むリテラル以外の区切り文字を使用する場合は、正しく機能するようにバックスラッシュ文字をエスケープする必要があります。
コード例¶
入力コード¶
SELECT NVP('store = whole foods&&store: ?Bristol farms','store', '&&', valueDelimiter, 2);
出力コード¶
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 ***/;
ベストプラクティス¶
その他のサポートについては、 snowconvert-support@snowflake.com にお問い合わせください
SSC-FDM-TD0009¶
説明¶
このメッセージは、 SnowConvert が VARCHAR 以外のデータ型を持つ DEFAULT SESSION を検出したときに表示されます。このような場合、 SnowConvert は自動的にデータ型を VARCHAR に変換し、通知メッセージを生成します。
コード例¶
入力コード:¶
CREATE TABLE TableExample
(
ColumnExample INTEGER DEFAULT SESSION,
ColumnExample2 VARCHAR DEFAULT SESSION
)
生成されたコード:¶
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"}}'
;
この例を見てみましょう。「ColumnExample」という列は、 INTEGER データ型で定義され、 DEFAULT SESSION 設定を持っています。データ型が VARCHAR ではなく INTEGER であるため、システムは自動的に VARCHAR に変換して出力します。
VARCHAR としてすでに定義されているため、 ColumnExample2 のデータ型は変更されません。
ベストプラクティス¶
ユーザー側からのアクションは必要ありません。
その他のサポートについては、 snowconvert-support@snowflake.com にお問い合わせください
SSC-FDM-TD0010¶
説明¶
Teradataテーブル DBC.COLUMNSV
はSnowflakeの INFORMATION_SCHEMA.COLUMNS
にマッピングされます。ただし、以下の点にご注意ください。
Teradataの列には、Snowflakeに対応する列がないものがあります。
列がシステム間で一致しても、データの内容が異なる場合があります。
Teradataにある DBC.COLUMNSV テーブル構造のサンプルビュー
Snowflakeにある INFORMATION_SCHEMA.COLUMNS テーブルのサンプルビュー
Snowflakeには 「ColumnFormat」 に相当する列がないことに注意してください。また、 「DATA_TYPE」 はTeradataの 「ColumnType」 列に対応しているように見えますが、その内容は大きく異なります。
コード例¶
入力コード:¶
SELECT columnname FROM dbc.columnsV WHERE tablename = 'TableN';
生成されたコード:¶
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';
ベストプラクティス¶
Teradataで使用されている列とSnowflakeで使用可能な列を比較し、要件を満たしていることを確認します。
その他のサポートについては、 snowconvert-support@snowflake.com にお問い合わせください
SSC-FDM-TD0011¶
説明¶
SnowflakeはUnicode基本多言語面(BMP)文字をサポートしていません。このメッセージは、 SnowConvert が、Unicode BMP エスケープシーケンスを含むTeradata Unicode区切り文字リテラル をSnowflake形式に変換するときに表示されます。
コード例¶
入力コード:¶
SELECT U&'hola #+005132 mundo' UESCAPE '#';
生成されたコード:¶
SELECT
--** SSC-FDM-TD0011 - UNICODE BMP IS NOT SUPPORTED IN SNOWFLAKE **
'hola \u+005132 mundo';
ベストプラクティス¶
要件に一致するUnicode文字があるかどうかを検証します。
その他のサポートについては、 snowconvert-support@snowflake.com にお問い合わせください
SSC-FDM-TD0012¶
注釈
この FDM は廃止されました。詳細情報については、 SSC-EWI-TD0006 をご参照ください。
説明¶
FLOAT データ型は、 DEFAULT TIME、 DEFAULT DATE、 DEFAULT CURRENT_DATE、 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
);
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"}}'
;
ベストプラクティス¶
ユーザー側からのアクションは必要ありません。
その他のサポートについては、 snowconvert-support@snowflake.com にお問い合わせください
SSC-FDM-TD0013¶
説明¶
このメッセージが表示されるのは、 BTEQ ERRORCODE 組み込み変数に格納されているエラーコードが、Snowflake Scriptingで同等のコードに直接マッピングできないためです。
コード例¶
入力コード:¶
SELECT * FROM table1;
.IF ERRORCODE<>0 THEN .EXIT 1
.QUIT 0
出力コード:¶
-- 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
$$
ベストプラクティス¶
その他のサポートについては、 snowconvert-support@snowflake.com にお問い合わせください
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
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()
ベストプラクティス¶
その他のサポートについては、 snowconvert-support@snowflake.com にお問い合わせください
SSC-FDM-TD0015¶
注釈
この FDM は現在サポートされていません。詳細情報については、 SSC-EWI-0009 をご参照ください。
説明¶
Snowflakeは現在、 POSIX 基本正規表現構文のみをサポートしています。高度な正規表現機能は使用できません。
この警告は、 REGEX_SUBSTR
、 REGEX_REPLACE
、 REGEX_INSTR
への関数呼び出しがSnowflakeに変換されるたびに表示されます。正規表現機能の一部がSnowflakeでサポートされていない可能性があることをユーザーに警告します。サポートされていない重要な機能には、 lookahead、 lookbehind、 non-capturing groups があります。
コード例¶
Teradata:¶
SELECT REGEXP_SUBSTR('qaqequ','q(?=u)', 1, 1);
Snowflake Scripting:¶
SELECT
--** SSC-FDM-TD0015 - REGEXP_SUBSTR FUNCTION ONLY SUPPORTS POSIX REGULAR EXPRESSIONS **
REGEXP_SUBSTR('qaqequ','q(?=u)', 1, 1);
ベストプラクティス¶
各正規表現パターンを確認し、手動での変更が必要かどうかを判断します。SnowFlake の正規表現機能と代替オプションの詳細については、 こちら をご参照ください。
その他のサポートについては、 snowconvert-support@snowflake.com にお問い合わせください
SSC-FDM-TD0016¶
説明¶
Teradataの正規表現関数(REGEX_SUBSTR、 REGEX_REPLACE、 REGEX_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');
生成されたコード:¶
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);
ベストプラクティス¶
その他のサポートについては、 snowconvert-support@snowflake.com にお問い合わせください
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;
出力コード:¶
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;
推奨事項¶
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);
生成されたコード:¶
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);
推奨事項¶
JSON のパスの形式が正しく、無効な文字が含まれていないことを検証します。
その他のサポートについては、 snowconvert-support@snowflake.com にお問い合わせください
SSC-FDM-TD0019¶
説明¶
Teradataでは、トランザクション、セッション、プロファイルの3つの異なるレベルでクエリバンド(メタデータタグ)を設定することができます。ユーザーは、 GetQueryBandValue などの関数を使用して、これらのクエリバンド値を取得することができます。
Snowflakeはクエリバンドの代わりにquery_tagパラメーターを使用します。query_tagはセッション、ユーザー、アカウントレベルで設定できます。Snowflakeはプロファイルをサポートしていません。
この機能移行の詳細(FMD)では、Snowflakeがトランザクションまたはプロファイルレベルのクエリタグをサポートしていないことをユーザーに警告します。代わりに、セッションレベルのクエリタグが使われます。この変更は、特定のシナリオで関数に影響を与える可能性があります。
コード例¶
入力コード:¶
SELECT GETQUERYBANDVALUE(3, 'account');
生成されたコード¶
SELECT
--** SSC-FDM-TD0019 - TRANSACTION AND PROFILE LEVEL QUERY TAGS NOT SUPPORTED IN SNOWFLAKE, REFERENCING SESSION QUERY TAG INSTEAD **
GETQUERYBANDVALUE_UDF('account');
推奨事項¶
セッションレベルでクエリバンドを実装するようにコードを更新します。
その他のサポートについては、 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);
生成されたコード:¶
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;
推奨事項¶
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;
出力:¶
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;
推奨事項¶
その他のサポートについては、 snowconvert-support@snowflake.com にお問い合わせください
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
シェル変数は文字列補間と同じような役割を果たします。スクリプトがPythonに変換されるとき、シェル変数はシェルスクリプト(.shファイル)内で変換されたコードを実行することでその関数を維持します。この関数を維持するためには、変換後のコードのシェル変数が元の入力コードの形式と一致している必要があります。
コード例¶
入力コード:¶
SELECT $column FROM ${tablename}
生成されたコード¶
#*** 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()
推奨事項¶
変換したコードはシェルスクリプトを使って実行する必要があります。
その他のサポートについては、 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;
Id | sim_fn |
---|---|
1 | 0 |
2 | 0.565079365 |
3 | 1 |
4 | 0.959047619 |
5 | 0 |
6 | 0.611111111 |
7 | 0.7777777777777777 |
8 | 0 |
9 | 0 |
生成されたコード¶
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;
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 |
推奨事項¶
その他のサポートについては、 snowconvert-support@snowflake.com にお問い合わせください
SSC-FDM-TD0024¶
説明¶
この警告は、 SnowConvert が SET オプション付きの CREATE TABLE ステートメントを検出したときに表示されます。Snowflakeは SET TABLE をサポートしていないため、 SnowConvert は変換時にこのオプションを削除します。
コード例¶
Teradata:¶
CREATE SET TABLE TableExample
(
ColumnExample Number
)
CREATE SET VOLATILE TABLE SOMETABLE, LOG AS
(SELECT ColumnExample FROM TableExample);
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"}}'
;
--** 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
);
推奨事項¶
その他のサポートについては、 snowconvert-support@snowflake.com にお問い合わせください
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';
出力コード:¶
----** SSC-FDM-TD0025 - TEMPORAL FORMS ARE NOT SUPPORTED IN SNOWFLAKE **
--SEQUENCED VALIDTIME
SELECT
Policy_ID,
Customer_ID
FROM
Policy
WHERE Policy_Type = 'AU';
トランザクションをロールバックする必要がある場合は、 Abort
コマンドを使用して、そのトランザクション中に行われたすべての変更をキャンセルします。
入力コード:¶
CREATE OR REPLACE PROCEDURE TEST.ABORT_STATS()
BEGIN
CURRENT VALIDTIME AND NONSEQUENCED TRANSACTIONTIME ABORT
FROM table_1
WHERE table_1.x1 = 1;
END;
出力コード:¶
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;
$$;
推奨事項¶
ユーザー側からのアクションは必要ありません。
その他のサポートについては、 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;
生成されたコード
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
$$
推奨事項 ¶
その他のサポートについては、 snowconvert-support@snowflake.com にお問い合わせください
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;
出力コード:¶
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;
推奨事項¶
変換ツールに列情報を提供するには、次の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;
出力コード:¶
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;
推奨事項¶
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);
出力コード:¶
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 ***/;
ベストプラクティス¶
形式関数(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';
出力コード¶
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
$$
推奨事項¶
その他のサポートについては、 snowconvert-support@snowflake.com にお問い合わせください
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;
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;
Snowflakeの結果¶
LOCATION1 |
LOCATION2 |
DISTANCE_IN_KM |
---|---|---|
{ "coordinates": [ -73.989308, 40.741895 ], "type": "Point" } |
{ "coordinates": [ 40.741895, 34.053691 ], "type": "Point" } |
9351154.65572674 |
推奨事項¶
その他のサポートについては、 snowconvert-support@snowflake.com にお問い合わせください
SSC-FDM-TD0032¶
注釈
わかりやすくするため、出力コードの一部を簡略化しています。
説明¶
このエラーは、 LIKE
式に [NOT] CASESPECIFIC
句が含まれている場合に発生します。
コード例¶
入力コード:¶
SELECT * FROM MY_TABLE
WHERE Name Like 'Marco%' (NOT CASESPECIFIC);
出力コード¶
SELECT
* FROM
MY_TABLE
WHERE Name LIKE 'Marco%' /*** SSC-FDM-TD0032 - NOT CASESPECIFIC CLAUSE WAS REMOVED ***/;
推奨事項¶
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()));
しかし、考慮する必要のあるいくつかの制限があります。
制限事項¶
最初の例¶
別の 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;
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;
$$;
Teradataで ACTIVITY_COUNT
を使用する場合は、 DML ステートメント(INSERT のように)の後に複数回呼び出すことができます。そうすると、そのステートメントから関係する行数を一貫して返します。しかし、Snowflakeでは、変換されたコードは異なる動作をする LAST_QUERY_ID()
を使用します。LAST_QUERY_ID()
のクエリ結果は、最後に実行されたクエリに依存するため、複数回呼び出した場合、その間に他のクエリが実行されると、同じ値が返されないことがあります。
ストアドプロシージャ InsertEmployeeSalaryAndLog_1()
は、何の修正も必要とせずに動作します。クエリ履歴を下から上へ時系列で確認することで検証できます。
InsertEmployeeSalaryAndLog_1() の実行を示すクエリ履歴
INSERT
ステートメントが最初に実行され、LAST_QUERY_ID()
がこの操作を参照します。ACTIVITY_COUNT
を持つ最初のSELECT
ステートメントが実行され、$1
を1
に設定します。LAST_QUERY_ID()
はこのSELECT
ステートメントをポイントします。ACTIVITY_COUNT
のある2番目のSELECT
ステートメントが実行されます。SELECT
前のステートメントは1
を返したため、$1
は1
のままです。値
1
はrow_count1
に格納され、activity_log
テーブルに挿入されます。
InsertEmployeeSalaryAndLog_2()
プロシージャを見ると、手動での修正が必要です。クエリ履歴を古いものから時系列で見てみましょう。
InsertEmployeeSalaryAndLog_2() プロシージャの実行結果を示すクエリ履歴
INSERT
ステートメントが実行されると、LAST_QUERY_ID()
がこの特定のステートメントを参照します。ACTIVITY_COUNT
における最初のSELECT
の間、$1
は1
と等しくなります。ただし、QUERY_TEXT
には+ 10
が含まれており、最終結果は変更されます。この時点で、LAST_QUERY_ID()
はこのSELECT
ステートメントをポイントしています。ACTIVITY_COUNT
における2番目のSELECT
が実行されると、以前のクエリが原因で11
(1
の代わりに)が返されます。この値は$1
に格納されます。変数
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 ***/;
...
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;
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;
$$;
LAST_QUERY_ID
関数は間違ったクエリを参照しているため、row_count1に不正な値を返します。クエリ履歴を逆時系列で確認することで検証できます。
InsertEmployeeSalaryAndLog_3() の実行結果を示すクエリ履歴
まず、
INSERT
ステートメントが実行されます。LAST_QUERY_ID()
関数は、このINSERT
操作を参照します。次に、
SELECT INTO
ステートメントが実行され、$1に101が設定されます。LAST_QUERY_ID()
関数は、このSELECT INTO
操作をポイントするようになりました。その後、
SELECT
ステートメントが実行され、ACTIVITY_COUNT
を取得します。最後のクエリは101を返したため、$1には期待値の1ではなく101が含まれます。その結果、
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番目のケースの調整¶
この問題を解決するには、
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 ***/;
...
また、挿入直後に
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;
...
推奨事項¶
LAST_QUERY_ID
を使用する場合は、目的のクエリを参照していることを検証します。DML ステートメントの直後に
ACTIVITY_COUNT
を実行すると、正確な評価が可能になります。その他のサポートについては、 snowconvert-support@snowflake.com にお問い合わせください