SnowConvert AI - Teradataの機能の違い¶
SSC-FDM-TD0001¶
Blobデータ型から変換された列。
説明¶
このメッセージは、 SnowConvert AI が BLOB データ型を見つけたときに表示されます。BLOB はSnowflakeではサポートされていないため、型はバイナリに変更されます。
コード例¶
入力コード:¶
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¶
Clobデータ型から変換された列。
説明¶
このメッセージは、 SnowConvert AI が CLOB データ型を見つけたときに表示されます。CLOB は SnowConvert AI ではサポートされていないため、型は 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¶
Bash変数が見つかりました。このスクリプトを実行するには、 SnowSQL で変数の置換を有効にする必要があります。
説明¶
Snowflakeスクリプトに移行したスクリプトファイルのソースコードにBash変数のプレースホルダー($variableまたは${variable})が含まれている場合、 SnowConvert AI はそれらを SnowSQL 変数(&variableまたは&{variable})に変換します。
この警告は、移行されたスクリプトの実行が SnowSQL に依存して動作するようになったことを示すために生成されます。SnowSQL でスクリプトを実行する際には、以下を考慮してください。
変数の置換を 有効にする必要があります 。
すべての変数は 定義されている必要があります 。
ファイルを バッチスクリプト として実行します。
コード例¶
入力コード:¶
.LOGON dbc, dbc;
select '$variable', '${variable}', '${variable}_concatenated';
select $colname from $tablename where info = $id;
select ${colname} from ${tablename} where info = ${id};
.LOGOFF;
生成されたコード:¶
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¶
ピリオド型は2つのデータフィールドとして処理されます
説明¶
Teradataには、時間間隔を表すために使用されるPeriodデータ型があり、この型のインスタンスは、同じ型(時刻、日付、タイムスタンプ)の開始と終了の境界を持ち、 PERIOD 、 BEGIN 、 END 、 OVERLAPS などのPeriodデータを初期化し、操作することを可能にする一連の関数があります。
Period型はSnowflakeではサポートされていないため、 SnowConvert AI はこの型とその関連する関数を以下のルールを使用して変換します。
列テーブルのPeriod型の宣言は、同じ型の2列として移行されます。
Period値コンストラクター関数 は、ピリオドサブ型の2つの異なるコンストラクターに移行され、1つは開始値で、もう1つは終了値を持ちます。
Period型のパラメーターを期待するサポートされている関数も同様に UDFs に移行され、これらの UDFs は開始値と終了値に対してほぼ2つのパラメーターを期待します。
コード例¶
入力コード:¶
-- Additional Params: --SplitPeriodDatatype
CREATE TABLE DateTable
(
COL1 PERIOD(DATE) DEFAULT PERIOD (DATE '2005-02-03', UNTIL_CHANGED)
);
生成されたコード:¶
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¶
非標準のタイムゾーンオフセットはSnowflakeではサポートされておらず、最も近い有効なタイムゾーンに丸められます。
説明¶
Teradataでは、 SET TIME ZONE クエリを使用して、 -12:59 から +14:00 の間で任意のタイムゾーンオフセットを定義できる柔軟性がありますが、Snowflakeでは IANA タイムゾーンデータベース にリストされているタイムゾーンのみをサポートしています。
SET TIME ZONE クエリで指定されたオフセットが IANA 標準タイムゾーンと一致しない場合、Snowflakeは自動的に最も近いオフセットを持つ標準タイムゾーンに丸めます。その場合、警告メッセージが生成されます。
コード例¶
入力コード:¶
-- Will be rounded to Asia/Colombo (+05:30)
SET TIME ZONE '05:26';
生成されたコード:¶
-- 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 AI が WITH CHECK OPTION 句を含むクエリを見つけたときに表示されます。これはSnowflakeではサポートされていないので、コードからコメントアウトされています。
この句は、 INSERT と UPDATE コマンドをビュー上で実行し、ビューに関連付けられたテーブルを内部的に更新するために使用できる、更新可能なビューで動作します。
この句は、ビューで WHERE 句を使用して、コマンドの影響を受ける行を制限するために使用されます。
詳細は、句の機能に関する ドキュメント をご参照ください。
コード例¶
入力コード:¶
REPLACE VIEW VIEWWITHOPTIONTEST AS
LOCKING ROW FOR ACCESS
SELECT
*
FROM SOMETABLE
WHERE app_id = 'SUPPLIER'
WITH CHECK OPTION;
生成されたコード:¶
CREATE OR REPLACE VIEW VIEWWITHOPTIONTEST
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "teradata", "convertedOn": "07/02/2025", "domain": "no-domain-provided" }}'
AS
SELECT
*
FROM
SOMETABLE
WHERE
UPPER(RTRIM( app_id)) = UPPER(RTRIM('SUPPLIER'))
-- --** SSC-FDM-TD0006 - VIEW WITH OPTION NOT SUPPORTED IN SNOWFLAKE **
-- WITH CHECK OPTION
;
ベストプラクティス¶
さらにサポートが必要な場合は、 snowconvert-support@snowflake.com までメールでお問い合わせください。
SSC-FDM-TD0007¶
バリアント列は照合をサポートしていません。
説明¶
このメッセージは、コードの変換における SnowConvert AI バリアントデータ型が COLLATE 句を持つ場合に表示されます。COLLATE はデータ型 VARIANT ではサポートされていないため、削除され、メッセージが追加されます。
コード例¶
入力コード:¶
-- Additional Params: --useCollateForCaseSpecification
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¶
NVP_UDF 第4パラメーターが非リテラルでバックスラッシュを含む場合、そのバックスラッシュをエスケープする必要があります。
説明¶
スペースを含む非リテラル区切り文字は、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¶
現在のセッションのデフォルトでintegerからvarcharに変換されます。
説明¶
このメッセージは、 SnowConvert AI が DEFAULT SESSION を見つけ、データ型が NOT VARCHAR のときに表示されます。その場合、データ型は 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 には、 DEFAULT SESSION を持つデータ型 INTEGER があることに注意してください。データ型が VARCHAR でないため、出力では VARCHAR に変換されます。
ColumnExample2 のデータ型は、すでに VARCHAR であるため変更されていません。
ベストプラクティス¶
ユーザーによる追加のアクションは必要ありません。
さらにサポートが必要な場合は、 snowconvert-support@snowflake.com までメールでお問い合わせください。
SSC-FDM-TD0010¶
テーブル(Teradata) DBC.COLUMNSV およびINFORMATION_SCHEMA.COLUMNS ( SnowFlake )間のテーブル列。しかし、列によってはSnowflakeに完全に一致するものがない場合もあります。
説明¶
Teradataのテーブル DBC.COLUMNSV の使用は INFORMATION_SCHEMA.COLUMNS に変換されますが、列によっては SnowFlake に完全に一致するものがない場合があります。つまり、Teradataには SnowFlake に相当するものが ない 列があれば、一致する列があっても内容がまったく同じでない列があるということです。
.png)
An example of the contents of DBC.COLUMNSV table in Teradata
.png)
An example of the contents of INFORMATION_SCHEMA.COLUMNS table in SnowFlake
たとえば、SnowFlake には "ColumnFormat" に相当する列がないこと、また、 "DATA_TYPE" はTeradataの "ColumnType" 列と一致するように見えますが、その内容は大きく異なることに注意してください。
コード例¶
入力コード:¶
SELECT columnname FROM dbc.columnsV WHERE tablename = 'TableN';
生成されたコード:¶
SELECT
COLUMN_NAME AS COLUMNNAME
FROM
--** SSC-FDM-TD0010 - USES OF TABLE DBC.COLUMNSV ARE CONVERTED TO INFORMATION_SCHEMA.COLUMNS, BUT SOME COLUMNS MIGHT NOT HAVE AND EXACT MATCH IN SNOWFLAKE **
INFORMATION_SCHEMA.COLUMNS
WHERE
UPPER(RTRIM(TABLE_NAME)) = UPPER(RTRIM('TableN'));
ベストプラクティス¶
Teradataでどのような列が使用されていたかを確認し、 SnowFlake で利用可能なコンテンツがニーズに合っているかどうかをチェックします。
さらにサポートが必要な場合は、 snowconvert-support@snowflake.com までメールでお問い合わせください。
SSC-FDM-TD0011¶
Unicode BMP エスケープはサポートされていません。
説明¶
SnowflakeはUnicode BMP をサポートしていないため、 SnowConvert AI がTeradata Unicode区切り文字リテラル をUnicode BMP エスケープでSnowflakeに変換すると、このメッセージが表示されます。
コード例¶
入力コード:¶
SELECT U&'hola #+005132 mundo' UESCAPE '#';
生成されたコード:¶
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 CURREN_DATE / DEFAULT DEFAULT CURRENT_TIME / DEFAULT CURRENT_TIMESTAMP 列の仕様は、サポート対象外です。
コード例¶
Teradata:¶
CREATE TABLE T_2004
(
-- In the output code all of these columns will be FLOAT type
-- and will include the SSC-FDM-TD0012 message.
COL1 FLOAT DEFAULT TIME,
COL2 FLOAT DEFAULT DATE,
COL3 FLOAT DEFAULT CURRENT_DATE,
COL4 FLOAT DEFAULT CURRENT_TIME,
COL5 FLOAT DEFAULT CURRENT_TIMESTAMP
);
Snowflake Scripting:¶
CREATE TABLE T_2004
(
-- In the output code all of these columns will be FLOAT type
-- and will include the SSC-FDM-TD0012 message.
COL1 FLOAT DEFAULT TIME /*** SSC-FDM-TD0012 - DEFAULT CURRENT_TIME NOT VALID FOR DATA TYPE ***/,
COL2 FLOAT DEFAULT DATE /*** SSC-FDM-TD0012 - DEFAULT CURRENT_DATE NOT VALID FOR DATA TYPE ***/,
COL3 FLOAT DEFAULT CURRENT_DATE /*** SSC-FDM-TD0012 - DEFAULT CURRENT_DATE NOT VALID FOR DATA TYPE ***/,
COL4 FLOAT DEFAULT CURRENT_TIME /*** SSC-FDM-TD0012 - DEFAULT CURRENT_TIME NOT VALID FOR DATA TYPE ***/,
COL5 FLOAT DEFAULT CURRENT_TIMESTAMP /*** SSC-FDM-TD0012 - DEFAULT CURRENT_TIMESTAMP NOT VALID FOR DATA TYPE ***/
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"teradata"}}'
;
ベストプラクティス¶
ユーザーによる追加のアクションは必要ありません。
さらにサポートが必要な場合は、 snowconvert-support@snowflake.com までメールでお問い合わせください。
SSC-FDM-TD0013¶
Snowflakeエラーコードが元のTeradataのエラーコードと一致しません。
説明¶
このメッセージが表示されるのは、 BTEQ ERRORCODE ビルドイン変数に保存されたエラーコードが、Snowflakeスクリプトでは同じでない可能性があるためです。
コード例¶
入力コード:¶
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¶
ファイル実行の不整合
説明¶
この EWI は、移行されたコードが SQL ステートメントを含む環境ファイルを実行する BTEQ 文である場合に表示されます。たとえば、 $(<$INPUT_SQL_FILE) 。BTEQ 実行とpython生成コードの違いは、ファイル内の一部のステートメントが失敗しても BTEQ は他のステートメントを続行しますが、python実行はエラーが発生するたびに停止します。
コード例¶
Teradata BTEQ:¶
.logmech LDAP;
.logon $LOGON_STR;
.SET DEFAULTS;
$(<$INPUT_SQL_FILE)
.export reset
.logoff
.quit
Python:¶
#*** Generated code is based on the SnowConvert AI Python Helpers version 2.0.6 ***
from snowconvert.helpers import exec_file
import os
import sys
import snowconvert.helpers
from snowconvert.helpers import Export
from snowconvert.helpers import exec
from snowconvert.helpers import BeginLoading
con = None
#** SSC-FDM-TD0022 - SHELL VARIABLES FOUND, RUNNING THIS CODE IN A SHELL SCRIPT IS REQUIRED **
def main():
snowconvert.helpers.configure_log()
con = snowconvert.helpers.log_on()
#** SSC-FDM-0027 - REMOVED NEXT STATEMENT, NOT APPLICABLE IN SNOWFLAKE. LOGMECH **
#.logmech LDAP;
#** SSC-FDM-0027 - REMOVED NEXT STATEMENT, NOT APPLICABLE IN SNOWFLAKE. LOGON **
#.logon $LOGON_STR
#** SSC-EWI-TD0005 - THE STATEMENT WAS CONVERTED BUT ITS FUNCTIONALITY IS NOT IMPLEMENTED YET **
Export.defaults()
#** SSC-FDM-TD0014 - EXECUTION OF FILE WITH SQL STATEMENTS STOPS WHEN AN ERROR OCCURS **
exec_file("$INPUT_SQL_FILE")
#** SSC-EWI-TD0005 - THE STATEMENT WAS CONVERTED BUT ITS FUNCTIONALITY IS NOT IMPLEMENTED YET **
Export.reset()
#** SSC-FDM-0027 - REMOVED NEXT STATEMENT, NOT APPLICABLE IN SNOWFLAKE. LOGOFF **
#.logoff
snowconvert.helpers.quit_application()
if __name__ == "__main__":
main()
ベストプラクティス¶
さらにサポートが必要な場合は、 snowconvert-support@snowflake.com までメールでお問い合わせください。
SSC-FDM-TD0015¶
Regexp_Substr関数は POSIX 正規表現のみをサポートしています。
注釈
この FDM は非推奨です。 SSC-EWI-0009 ドキュメントを参照してください。
説明¶
現在、Snowflakeでは POSIX 基本正規表現構文を超える拡張正規表現はサポートされていません。
この EWI は、 REGEX_SUBSTR 、 REGEX_REPLACE 、 または REGEX_INSTR への関数呼び出しが SnowFlake に変換されるたびに追加され、サポートされていない可能性のある正規表現についてユーザーに警告します。サポートされていない 関数には、先読み、後読み、非キャプチャグループがあります。
コード例¶
Teradata:¶
SELECT REGEXP_SUBSTR('qaqequ','q(?=u)', 1, 1);
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¶
パラメーター'match_arg'の値'l'はSnowflakeではサポートされていません。
説明¶
Teradataの REGEX_SUBSTR 、 REGEX_REPLACE 、 または REGEX_INSTR などの関数には、 "match_arg" というパラメーターがあります。これは以下の有効な値を持つ文字引数です。
'i':大文字と小文字を区別しない一致。'c':大文字と小文字を区別する一致。'n':ピリオド文字(任意の文字に一致)は改行文字に一致することができます。'm':ソース文字列が1行ではなく複数行として扱われます。'l':source_stringが現在許容されている最大source_stringサイズ(現在16 MB )を超える場合、エラーの代わりに NULL が返されます。'x':空白を無視します(パターン文字列にのみ影響)。
引数には複数の文字を含めることができます。
Snowflakeでは、これらの関数の相当する引数は regexp_parameters です。A st一致の検索に使用される正規表現パラメーターを指定する1文字以上の文字列です。サポートされている値は次のとおりです。
c:大文字と小文字を区別します。i:大文字と小文字を区別しません。m:複数行モード。e:部分一致を抽出します。s:'.'ワイルドカードは改行文字にも一致します。
見てのとおり、値 'i'、'c'、'm' は両言語で同一であり、Teradataの値 'n' は 's' にマッピングされます。しかし、値 'l'、'x' は相当するものがありません。
値 'x' については、REGEXP_REPLACE 関数の呼び出しを生成することで機能が複製されます。しかし、'l' パラメーターは複製できないので、このような場合にこの警告が生成されます。
入力コード:¶
SELECT REGEXP_SUBSTR('Chip Chop','ch(i|o)p', 1, 1, 'i'),
REGEXP_SUBSTR('Chip Chop','ch(i|o)p', 1, 1, 'c'),
REGEXP_SUBSTR('Chip Chop','ch(i|o)p', 1, 1, 'm'),
REGEXP_SUBSTR('Chip Chop','ch(i|o)p', 1, 1, 'n'),
REGEXP_SUBSTR('Chip Chop','ch(i|o)p', 1, 1, 'l'),
REGEXP_SUBSTR('Chip Chop','ch(i|o)p', 1, 1, 'x');
生成されたコード:¶
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¶
Snowflakeでは外部テーブルの使用はサポートされていません。
注釈
この FDM は非推奨です。 SSC-EWI-TD0076 を参照してください。
説明¶
外部テーブル は、Amazon S3、Azure Blob storage、Google Cloud Storageの半構造化データや非構造化データなど、外部オブジェクトストレージ内のデータへのアクセスを可能にします。この構文はSnowflakeではサポートされていません。しかし、Snowflakeには外部テーブル、icebergテーブル、標準テーブルなど、代わりに使用できるものがあります。
コード例¶
入力コード:¶
SELECT cust_id, income, age FROM
FOREIGN TABLE (SELECT cust_id, income, age FROM twm_customer)@hadoop1 T1;
生成されたコード:¶
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 <table>ステートメントがサポートする任意の形式で保存されたデータにアクセスできます。
もうひとつの手段は、 SnowflakeのIcebergテーブル です。つまり、Icebergテーブルは、オープン形式とカスタマー提供のクラウドストレージを使用するテーブルと考えることができます。このデータはParquetファイルに保存されます。
最後が 標準Snowflakeテーブル です。これは、Teradataの外部テーブルの機能をカバーするための選択肢になります。
さらにサポートが必要な場合は、 snowconvert-support@snowflake.com までメールでお問い合わせください。
SSC-FDM-TD0018¶
JSON パスは認識されませんでした
注釈
この FDM は非推奨です。 SSC-EWI-TD0063 を参照してください。
説明¶
このメッセージは、文字列が期待される形式を持たない、またはSnowflakeでサポートされていないため、 SnowConvert AI がJSONパスをデシリアライズできない場合に表示されます。
コード例¶
入力コード:¶
SELECT
*
FROM
JSON_TABLE (
ON (
SELECT
id,
trainSchedule as ts
FROM
demo.PUBLIC.Train T
) USING rowexpr('$weekShedule.Monday[*]') colexpr(
'[{"jsonpath" "$.time",
"type"" : "CHAR ( 12 )"}]'
)
) AS JT(Id, Ordinal, Time, City);
生成されたコード:¶
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¶
トランザクションおよびプロファイルレベルのクエリタグがSnowflakeでサポートされていないため、代わりにセッションクエリタグを参照します
説明¶
Teradataでは、トランザクション、セッション、プロファイルの各レベルでクエリバンドを定義し、 GetQueryBandValue のような関数を使ってクエリバンドを参照することができます。
Snowflakeのクエリバンドに相当するのはquery_tagパラメーターで、セッション、ユーザー、アカウントに対して設定できます。また、Snowflakeにはプロファイルがありません。
これらの違いにより、トランザクションまたはプロファイルレベルのクエリタグはSnowflakeでは定義も参照もできず、セッションレベルのクエリタグが代替として使用されるため、場合によっては機能的な違いが生じる可能性があることをユーザーに警告するために、この FMD が追加されます。
コード例¶
入力コード:¶
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¶
JSON 値は、無効な形式のため認識できませんでした
注釈
わかりやすくするため、出力コードの一部を省略しています。
説明¶
このメッセージは、 SnowConvert AI が変換コンテキストの JSON データをデシリアライズする必要があるのに、 JSON 値が期待された形式でないか、有効な JSON でない場合に表示されます。
コード例¶
入力コード:¶
SELECT
*
FROM
JSON_TABLE
(ON (SELECT id,
trainSchedule as ts
FROM demo.PUBLIC.Train T)
USING rowexpr('$.weekShedule.Monday[*]')
colexpr('[ {"ordinal" true},
{"jsonpath" "$.time",
"type"" : "CHAR ( 12 )"},
{"jsonpath" "$.city",
"type" : "VARCHAR ( 12 )"}]'))
AS JT(Id, Ordinal, Time, City);
SELECT
*
FROM
JSON_TABLE
(ON (SELECT id,
trainSchedule as ts
FROM demo.PUBLIC.Train T)
USING rowexpr('$.weekShedule.Monday[*]')
colexpr('{"jsonpath" "$.time",
"type"" : "CHAR ( 12 )"}'))
AS JT(Id, Ordinal, Time, City);
生成されたコード:¶
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¶
{0}の組み込みの参照はSnowflakeではサポートされていません。
注釈
この 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 AI Python Helpers version 2.0.6 ***
import os
import sys
import snowconvert.helpers
from snowconvert.helpers import Export
from snowconvert.helpers import exec
from snowconvert.helpers import BeginLoading
con = None
#** SSC-FDM-TD0022 - SHELL VARIABLES FOUND, RUNNING THIS CODE IN A SHELL SCRIPT IS REQUIRED **
def main():
snowconvert.helpers.configure_log()
con = snowconvert.helpers.log_on()
exec("""
SELECT
$column
FROM
${tablename}
""")
snowconvert.helpers.quit_application()
if __name__ == "__main__":
main()
ベストプラクティス¶
変換したコードをシェルスクリプトで実行する必要があります。
さらにサポートが必要な場合は、 snowconvert-support@snowflake.com までメールでお問い合わせください。
SSC-FDM-TD0023¶
String Similarityは動作が異なる場合があります。
説明¶
この FDM は、 SnowConvert AI が TeradataからSnowflakeにSimilarity Functionを変換するときに表示されます。これは、結果が異なる動作を示す可能性があることを示しています。
コード例¶
例として次のようなデータがあるとします。
Id |
a |
b |
|---|---|---|
1 |
||
2 |
Gute nacht |
Ich weis nicht |
3 |
Ich weiß nicht |
Ich wei? nicht |
4 |
Ich weiß nicht |
Ich wei? nicht |
5 |
Ich weiß nicht |
Ich weiss nicht |
6 |
Snowflake |
Oracle |
7 |
święta |
swieta |
8 |
NULL |
|
9 |
NULL |
NULL |
入力コード:¶
クエリ¶
-- Additional Params: -q SnowScript
SELECT * FROM StringSimilarity (
ON (
SELECT id, CAST(a AS VARCHAR(200)) AS a, CAST(b AS VARCHAR(200)) AS b
FROM table_1
) PARTITION BY ANY
USING
ComparisonColumnPairs ('jaro_winkler(a,b) AS sim_fn')
Accumulate ('id')
) AS dt ORDER BY 1;
結果¶
| 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¶
セットテーブル機能はサポートされていません。
説明¶
この EWI は、 SnowConvert AI が SET オプションを伴うCreate Tableを検出した時に表示されます。SET TABLE はSnowflakeではサポートされていないため、削除されます。
コード例¶
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¶
TeradataデータベースのTemporal TableはSnowflakeではサポートされていません。
説明¶
Teradata Database Temporalサポート は、一時テーブルと一時 DDL および DML オブジェクトの作成に関与します。一時(時間認識)テーブルとデータのサポートは、絶対的に同等のものが存在しないため、Snowflakeではサポートされていません。
これらのステートメントはすべて、SnowConvert AI によって認識(解析)されますが、Snowflakeでクエリを実行するために、これらの要素は翻訳プロセスで削除されます。
abort ステートメントに遭遇した場合、同等の機能を維持するために、 Delete コマンドに変換され、トランザクション中に実行される操作を元に戻したり、データベースを開始時の状態に復元したりできるようになることに注意してください。
コード例¶
次の例は、Temporal-form Selectが通常のSelectに変換されていることを示しています。
入力コード:¶
SEQUENCED VALIDTIME
SELECT
Policy_ID,
Customer_ID
FROM Policy
WHERE Policy_Type = 'AU';
生成されたコード:¶
----** SSC-FDM-TD0025 - TEMPORAL FORMS ARE NOT SUPPORTED IN SNOWFLAKE **
--SEQUENCED VALIDTIME
SELECT
Policy_ID,
Customer_ID
FROM
Policy
WHERE
UPPER(RTRIM( Policy_Type)) = UPPER(RTRIM('AU'));
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¶
ifステートメントが逆転したため、 GOTO ステートメントは削除されました。
注釈
わかりやすくするため、出力コードの一部を省略しています。
説明¶
SQL ifステートメントの機能を複製するために、 IF および LABEL コマンドとともに GOTO コマンドを使用するのが一般的です。このように使うと、ifステートメント、if-elseステートメント、あるいはif-elseif-elseステートメントに直接変換できます。しかし、このような場合、 GOTO コマンドは不要になるので、 LABEL セクションで置き換えられないよう削除する必要があります。
コード例 ¶
入力コード:
-- Additional Params: --scriptsTargetLanguage SnowScript
.If ActivityCount = 0 THEN .GOTO endIf
DROP TABLE TABLE1;
.Label endIf
SELECT A FROM TABLE1;
出力コード
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¶
TD_UNPIVOT 変換には、見つからなかった列の情報が必要です。結果に列がありません
注釈
この FDM は非推奨です。 SSC-EWI-TD0061 を参照してください。
説明¶
SnowConvert AI は TD_UNPIVOT 関数をサポートし、変換します。これは、テーブルの列を行として表現するために使用できます。
しかし、この変換を行うには、テーブル列に関する情報(より具体的には列の名前)が必要です。この情報が存在しない場合、変換は、列が結果から欠落した不完全な状態のままになることがあります。このような場合にこの EWI が生成されます。
コード例¶
入力コード:¶
CREATE TABLE unpivotTable (
myKey INTEGER NOT NULL PRIMARY KEY,
firstSemesterIncome DECIMAL(10,2),
secondSemesterIncome DECIMAL(10,2),
firstSemesterExpenses DECIMAL(10,2),
secondSemesterExpenses DECIMAL(10,2)
);
SELECT * FROM
TD_UNPIVOT(
ON unpivotTable
USING
VALUE_COLUMNS('Income', 'Expenses')
UNPIVOT_COLUMN('Semester')
COLUMN_LIST('firstSemesterIncome, firstSemesterExpenses', 'secondSemesterIncome, secondSemesterExpenses')
COLUMN_ALIAS_LIST('First', 'Second')
)X ORDER BY mykey;
SELECT * FROM
TD_UNPIVOT(
ON unknownTable
USING
VALUE_COLUMNS('MonthIncome')
UNPIVOT_COLUMN('Months')
COLUMN_LIST('januaryIncome', 'februaryIncome', 'marchIncome', 'aprilIncome')
COLUMN_ALIAS_LIST('January', 'February', 'March', 'April')
)X ORDER BY yearKey;
生成されたコード:¶
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¶
JSON_TABLE は変換されず、セマンティック情報から列の名前を取得できませんでした
注釈
この FDM は非推奨です。 SSC-EWI-TD0060 を参照してください。
説明¶
JSON_TABLE 関数は SnowConvert AI で変換できますが、この変換には JSON_TABLE ON サブクエリで選択されている列の名前を知っている必要があります。
このメッセージは、列の名前がサブクエリに明示的に記述されておらず(たとえば SELECT * が使用されている)、参照されているテーブルのセマンティック情報が見つからなかった、つまり列の名前を抽出できなかったことを警告するために生成されます。
コード例¶
入力コード:¶
CREATE TABLE demo.Train (
firstCol INT,
jsonCol JSON(400),
thirdCol VARCHAR(30)
);
SELECT * FROM JSON_TABLE
(ON (SELECT T.*
FROM demo.Train T)
USING rowexpr('$.schools[*]')
colexpr('[ {"jsonpath" : "$.name",
"type" : "CHAR(20)"},
{"jsonpath" : "$.type",
"type" : "VARCHAR(20)"}]')
)
AS JT;
SELECT * FROM JSON_TABLE
(ON (SELECT T.*
FROM demo.missingTable T)
USING rowexpr('$.schools[*]')
colexpr('[ {"jsonpath" : "$.name",
"type" : "CHAR(20)"},
{"jsonpath" : "$.type",
"type" : "VARCHAR(20)"}]')
)
AS JT;
生成されたコード:¶
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 AI に提供されたコードが完全であることを確認してください。テーブル定義を提供していない場合は、テーブル定義がある状態でコードを再実行してください。
さらにサポートが必要な場合は、 snowconvert-support@snowflake.com までメールでお問い合わせください。
SSC-FDM-TD0029¶
Snowflakeがサポートする TO_CHAR の形式はTeradataと異なるため、失敗したり動作が異なったりする場合があります。
セッションパラメーターに依存する形式要素¶
Teradata形式要素の中には、セッションパラメーターの値に依存するSnowflake関数にマッピングされるものがあります。結果の機能的な差異を避けるために、これらのセッションパラメーターをTeradataと同じ値に設定する必要があります。この種の関数にマッピングされる形式要素は以下の通りです。
D :
DAYOFWEEK関数にマップされます。この関数の結果はWEEK_STARTセッションパラメーターに依存します。デフォルトでは、Teradataは日曜日を週の初めとみなしますが、Snowflakeでは月曜日を週の初日とみなします。WW :
WEEK関数にマップされます。この関数はセッションパラメーターWEEK_OF_YEAR_POLICYに依存します。このパラメーターはデフォルトで ISO 標準(1年の最初の週は、1月の少なくとも4日を含む最初の週)を使用するように設定されていますが、Teradataでは1月1日を最初の週の開始とみなすように設定されています。
セッションパラメーターを変更するには、 ALTER SESSION SET parameter_name = value を使用します。セッションパラメーターの詳細については、 このページ をご参照ください。
TO_CHAR の単一パラメーターバージョン¶
TO_CHAR(Datetime) の単一パラメーターバージョンは、セッションパラメーター TIMESTAMP_LTZ_OUTPUT_FORMAT 、 TIMESTAMP_NTZ_OUTPUT_FORMAT 、 TIMESTAMP_TZ_OUTPUT_FORMAT 、 TIME_OUTPUT_FORMAT で指定されたデフォルト形式を使用します。動作の違いを避けるために、Teradataで使用されているものと同じ値に設定してください。
TO_CHAR(Numeric) の場合、Snowflakeは TM9 または TME 形式のいずれかを使用してvarchar表現を生成し、数値のコンパクトな表現を取得します。Teradataは、数値のコンパクトな表現も生成するため、アクションは不要です。
コード例¶
入力コード:¶
select to_char(date '2008-09-13', 'DD/RM/YYYY');
select to_char(date '2010-10-20', 'DS');
select to_char(1255.495, 'SC9999.9999', 'nls_iso_currency = ''EUR''');
select to_char(45620);
生成されたコード:¶
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¶
同じ実行フローを保証するために、Labelセクションの最後にreturnステートメントが追加されました。
説明¶
GotoステートメントがLabelセクションに置き換えられ、returnステートメントを含まない場合、同じ実行フローを保証するために、セクションの最後にreturnステートメントを追加します。
Gotoコマンドの後に BTEQ が実行されると、gotoコマンドとlabelコマンドの間にある同名のステートメントは無視されます。そのため、これらのステートメントが実行されるのを避けるために、Labelセクションにはreturnステートメントを含める必要があります。
加えて、Gotoコマンドは同名のLabelを除き、他のすべてのステートメントをスキップします。この時、実行が再開されます。したがって、Gotoコマンド以前に定義されたLabelセクションで実行が再開されることはありません。
コード例¶
入力コード:¶
-- Additional Params: --scriptsTargetLanguage SnowScript
.LOGON dbc,dbc;
select 'STATEMENTS';
.GOTO LABEL_B
select 'IGNORED STATEMENTS';
.label LABEL_B
select 'LABEL_B STATEMENTS';
生成されたコード¶
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¶
ST_DISTANCE の結果は ST_SPHERICALDISTANCE と若干異なります。
説明¶
Teradataの関数 ST_SPHERICALDISTANCE は、地球上の2つの球面座標間の距離をハバーサイン公式を用いて計算します。一方、Snowflakeの ST_DISTANCE 関数は、2つの地理的な点の間の最小距離を計算するためにハバーサイン公式を利用しません。
コード例¶
入力コード:¶
--The distance between New York and Los Angeles
Select Cast('POINT(-73.989308 40.741895)' As ST_GEOMETRY) As location1,
Cast('POINT(40.741895 34.053691)' As ST_GEOMETRY) As location2,
location1.ST_SPHERICALDISTANCE(location2) As Distance_In_km;
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¶
CASESPECIFIC 句は LIKE 式から削除されました。
注釈
わかりやすくするため、出力コードの一部を省略しています。
説明¶
このエラーは、 LIKE 式が [NOT]CASESPECIFIC 句を伴っている場合に表示されます。
コード例¶
入力コード:¶
SELECT * FROM MY_TABLE
WHERE Name Like 'Marco%' (NOT CASESPECIFIC);
生成されたコード¶
SELECT
* FROM
MY_TABLE
WHERE Name ILIKE 'Marco%' /*** SSC-FDM-TD0032 - NOT CASESPECIFIC CLAUSE WAS REMOVED ***/;
ベストプラクティス¶
TERADATA におけるケース固有の動作は、 TMODE システム構成に依存します。
さらにサポートが必要な場合は、 snowconvert-support@snowflake.com までメールでお問い合わせください。
SSC-FDM-TD0033¶
ACTIVITY_COUNT 変換には手動の調整が必要になることがあります。
説明¶
ACTIVITY_COUNT ステータス変数は、組み込み SQL またはストアドプロシージャアプリケーションのSQL DML ステートメントによって影響を受ける行の数を返します。詳しくは、 こちら をご参照ください。
その翻訳仕様で説明されているように、以下によって ACTIVITY_COUNT の動作をエミュレートする回避策があります。
SELECT $1 FROM TABLE(RESULT_SCAN(LAST_QUERY_ID()));
しかし、これには以下のような制限があります。
制限 ¶
最初の例¶
別の DML ステートメントを実行する前に ACTIVITY_COUNT を2回以上呼び出すと、変換が期待する値を返さないことがあります。
Teradata¶
REPLACE PROCEDURE InsertEmployeeSalaryAndLog_1 ()
BEGIN
DECLARE row_count1 INT;
INSERT INTO employees (employee_id, first_name, last_name, department_id, salary)
VALUES (101, 'Alice', 'Smith', 10, 70000.00);
-- Get the ACTIVITY_COUNT
SET row_count1 = ACTIVITY_COUNT;
SET row_count1 = ACTIVITY_COUNT;
-- Insert the ACTIVITY_COUNT into the activity_log table
INSERT INTO activity_log (operation, row_count)
VALUES ('INSERT PROCEDURE', row_count1);
END;
REPLACE PROCEDURE InsertEmployeeSalaryAndLog_2 ()
BEGIN
DECLARE row_count1 INT;
DECLARE message VARCHAR(100);
INSERT INTO employees (employee_id, first_name, last_name, department_id, salary)
VALUES (101, 'Alice', 'Smith', 10, 70000.00);
-- Get the ACTIVITY_COUNT
SET row_count1 = ACTIVITY_COUNT + 1;
SET row_count1 = ACTIVITY_COUNT;
-- Insert the ACTIVITY_COUNT into the activity_log table
INSERT INTO activity_log (operation, row_count)
VALUES ('INSERT PROCEDURE', row_count1);
END;
Snowflake¶
CREATE OR REPLACE PROCEDURE InsertEmployeeSalaryAndLog_1 ()
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "teradata", "convertedOn": "07/15/2024" }}'
EXECUTE AS CALLER
AS
$$
DECLARE
row_count1 INT;
BEGIN
INSERT INTO employees (employee_id, first_name, last_name, department_id, salary)
VALUES (101, 'Alice', 'Smith', 10, 70000.00);
-- Get the ACTIVITY_COUNT
row_count1 := (
SELECT
$1
FROM
TABLE(RESULT_SCAN(LAST_QUERY_ID()))
) /*** SSC-FDM-TD0033 - 'ACTIVITY_COUNT' TRANSFORMATION MIGHT REQUIRE MANUAL ADJUSTMENTS ***/;
row_count1 := (
SELECT
$1
FROM
TABLE(RESULT_SCAN(LAST_QUERY_ID()))
) /*** SSC-FDM-TD0033 - 'ACTIVITY_COUNT' TRANSFORMATION MIGHT REQUIRE MANUAL ADJUSTMENTS ***/;
-- Insert the ACTIVITY_COUNT into the activity_log table
INSERT INTO activity_log (operation, row_count)
VALUES ('INSERT PROCEDURE', :row_count1);
END;
$$;
CREATE OR REPLACE PROCEDURE InsertEmployeeSalaryAndLog_2 ()
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "teradata", "convertedOn": "07/15/2024" }}'
EXECUTE AS CALLER
AS
$$
DECLARE
row_count1 INT;
message VARCHAR(100);
BEGIN
INSERT INTO employees (employee_id, first_name, last_name, department_id, salary)
VALUES (101, 'Alice', 'Smith', 10, 70000.00);
-- Get the ACTIVITY_COUNT
row_count1 := (
SELECT
$1
FROM
TABLE(RESULT_SCAN(LAST_QUERY_ID()))
) /*** SSC-FDM-TD0033 - 'ACTIVITY_COUNT' TRANSFORMATION MIGHT REQUIRE MANUAL ADJUSTMENTS ***/ + 1;
row_count1 := (
SELECT
$1
FROM
TABLE(RESULT_SCAN(LAST_QUERY_ID()))
) /*** SSC-FDM-TD0033 - 'ACTIVITY_COUNT' TRANSFORMATION MIGHT REQUIRE MANUAL ADJUSTMENTS ***/;
-- Insert the ACTIVITY_COUNT into the activity_log table
INSERT INTO activity_log (operation, row_count)
VALUES ('INSERT PROCEDURE', :row_count1);
END;
$$;
どちらのプロシージャでも、 DML ステートメントが呼び出される前に、 ACTIVITY_COUNT が2回呼び出されます。Teradataでは、 ACTIVITY_COUNT は、2回呼び出された場合でも、その上の INSERT ステートメントの行数を返します。しかし、Snowflake変換は LAST_QUERY_ID() を使用するため、結果は LAST_QUERY_ID() が保持する結果セットに依存します。
InsertEmployeeSalaryAndLog_1() は手動での調整を必要としません。クエリ履歴を確認する(下から上):
.png)
Query History when calling InsertEmployeeSalaryAndLog_1()
INSERTステートメントが実行されます。LAST_QUERY_ID()はこのステートメントを指します。SELECT(最初のACTIVITY_COUNT) が実行され、$1は1になります。LAST_QUERY_ID()はこのステートメントを指します。SELECT(2番目のACTIVITY_COUNT)が実行されます。最後のステートメントの結果は1なので、このSELECTについても$1は1になります。最後に、
row_count1は値1を保持し、これはactivity_logに挿入されます。
一方、 InsertEmployeeSalaryAndLog_2() は手動での調整が必要となります。クエリ履歴を確認する(下から上):
.png)
Query History when calling InsertEmployeeSalaryAndLog_2()
INSERTステートメントが実行されます。LAST_QUERY_ID()はこのステートメントを指します。SELECT (最初の
ACTIVITY_COUNT)が実行され、$1は1となります。しかし、QUERY_TEXTが+ 10を持っていることに注意してください。LAST_QUERY_ID()はこのステートメントを指します。SELECT(2番目のACTIVITY_COUNT)が実行されます。最後のクエリの結果は11です。したがって$1は1の代わりに11を保持します。最後に、
row_count1は値11を保持し、これはactivity_logに挿入されます。
これらは、 activity_log に挿入される値です。
LOG_ID |
OPERATION |
ROW_COUNT |
LOG_TIMESTAMP |
|---|---|---|---|
1 |
INSERT PROCEDURE |
1 |
2024-07-15 09:22:21.725 |
101 |
INSERT PROCEDURE |
11 |
2024-07-15 09:22:26.248 |
最初のケースの調整¶
Snowflakeの LAST_QUERY_ID のドキュメントにあるように、クエリの位置によって返すクエリを指定することができます。 LAST_QUERY_ID(-1) は最新のクエリ、 (-2) は最後から2番目のクエリ、といった具合です。
InsertEmployeeSalaryAndLog_2() の問題の修正は、 LAST_QUERY_ID(-2) を ACTIVITY_COUNT の2回目の使用(2番目の SELECT )で指定するだけで、代わりに INSERT ステートメントからの結果を取得するようになります。
...
INSERT INTO employees (employee_id, first_name, last_name, department_id, salary)
VALUES (101, 'Alice', 'Smith', 10, 70000.00);
-- Get the ACTIVITY_COUNT
row_count1 := (
SELECT
$1
FROM
TABLE(RESULT_SCAN(LAST_QUERY_ID()))
) /*** SSC-FDM-TD0033 - 'ACTIVITY_COUNT' TRANSFORMATION MIGHT REQUIRE MANUAL ADJUSTMENTS ***/ + 1;
row_count1 := (
SELECT
$1
FROM
TABLE(RESULT_SCAN(LAST_QUERY_ID(-2)))
) /*** SSC-FDM-TD0033 - 'ACTIVITY_COUNT' TRANSFORMATION MIGHT REQUIRE MANUAL ADJUSTMENTS ***/;
...
2番目のケース¶
DML 以外のステートメントが実行された後に ACTIVITY_COUNT が呼び出された場合、変換は期待される値を返しません。
Teradata¶
REPLACE PROCEDURE InsertEmployeeSalaryAndLog_3 ()
BEGIN
DECLARE row_count1 INT;
DECLARE emp_id INT;
DECLARE message VARCHAR(100);
INSERT INTO employees (employee_id, first_name, last_name, department_id, salary)
VALUES (101, 'Alice', 'Smith', 10, 70000.00);
SELECT employee_id INTO emp_id FROM employees;
-- Get the ACTIVITY_COUNT
SET row_count1 = ACTIVITY_COUNT;
SET message = 'EMPLOYEE INSERTED - ID: ' || emp_id;
-- Insert the ACTIVITY_COUNT into the activity_log table
INSERT INTO activity_log (operation, row_count)
VALUES (message, row_count1);
END;
Snowflake¶
CREATE OR REPLACE PROCEDURE InsertEmployeeSalaryAndLog_3 ()
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "teradata", "convertedOn": "07/15/2024" }}'
EXECUTE AS CALLER
AS
$$
DECLARE
row_count1 INT;
emp_id INT;
message VARCHAR(100);
BEGIN
INSERT INTO employees (employee_id, first_name, last_name, department_id, salary)
VALUES (101, 'Alice', 'Smith', 10, 70000.00);
SELECT
employee_id INTO
:emp_id
FROM
employees;
-- Get the ACTIVITY_COUNT
row_count1 := (
SELECT
$1
FROM
TABLE(RESULT_SCAN(LAST_QUERY_ID()))
) /*** SSC-FDM-TD0033 - 'ACTIVITY_COUNT' TRANSFORMATION MIGHT REQUIRE MANUAL ADJUSTMENTS ***/;
message := 'EMPLOYEE INSERTED - ID: ' || emp_id;
-- Insert the ACTIVITY_COUNT into the activity_log table
INSERT INTO activity_log (operation, row_count)
VALUES (:message, :row_count1);
END;
$$;
前述と同様に、 LAST_QUERY_ID は正しいクエリを指していないため、正しくない値を返し、それがrow_count1に割り当てられます。クエリ履歴を確認する(下から上):
.png)
Query History when calling InsertEmployeeSalaryAndLog_3()
INSERTステートメントが実行されます。LAST_QUERY_ID()はこのステートメントを指します。SELECT INTOが実行され、$1は101になります。LAST_QUERY_ID()はこのステートメントを指します。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番目のケースの調整¶
可能な修正方法の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 ***/;
...
もう1つの修正方法は、
INSERTステートメントを実行した直後に、ACTIVITY_COUNT(SELECT)を使用することです。
...
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 までメールでお問い合わせください。
SSC-FDM-TD0034¶
Periodはユーザー定義関数に変換されたものを含みます。
説明¶
Teradata CONTAINS 式は、右側の要素が、 PERIOD 型とされる左側の要素に含まれているかどうかを示す検証を実行します。CONTAINS は、 DATE 、 TIME 、 TIMESTAMP または PERIOD にのみ適用されます。Snowflakeでは PERIOD がサポートされていないため、ユーザー定義関数はネイティブの CONTAINS 動作のロジックをエミュレートします。
コード例¶
入力コード:¶
UPDATE TABLE1
SET COL1 = CURRENT_TIMESTAMP
WHERE COL3 CONTAINS CURRENT_TIMESTAMP;
生成されたコード¶
UPDATE TABLE1
SET
COL1 = CURRENT_TIMESTAMP()
WHERE
PUBLIC.PERIOD_CONTAINS_UDF(COL3, CURRENT_TIMESTAMP()) /*** SSC-FDM-TD0034 - PERIOD CONTAINS EXPRESSION TRANSFORMED TO USER DEFINED FUNCTION. ***/
ベストプラクティス¶
PERIODの代わりに使用されるVARCHARは、すべての値において<PERIOD_BEGIN>*<PERIOD_END>の形式を想定しています。値が*と異なるトークンで分割されている場合、 SnowConvertAI が提供するPUBLIC.GET_PERIOD_SEPARATORUDF から返される値を変更できます。その構造には、 PERIOD の開始と終了をマークするトークンがあるはずなので、2つの日付、時刻、タイムスタンプは、常に同じトークンで区切られている必要があります。さらにサポートが必要な場合は、 snowconvert-support@snowflake.com までメールでお問い合わせください。
SSC-FDM-TD0035¶
統計関数はSnowflakeでは必要ありません。
注釈
この FDM は非推奨です。 SSC-EWI-0037 ドキュメントを参照してください。
説明¶
DROP 、 COLLECT 、または HELP 統計は、Snowflakeでは必要ありません。Snowflakeはすでに自動クエリ最適化に使用される統計情報を収集しているため、これらの統計ステートメントはTeradataで使用されます。
コード例¶
入力コード:¶
HELP STATISTICS TestName;
生成されたコード¶
----** SSC-FDM-TD0035 - HELP STATISTICS NOT NEEDED. SNOWFLAKE AUTOMATICALLY COLLECTS STATISTICS. **
--HELP STATISTICS TestName
ベストプラクティス¶
さらにサポートが必要な場合は、 snowconvert-support@snowflake.com までメールでお問い合わせください。
SSC-FDM-TD0036¶
Snowflakeはperiodデータ型をサポートしておらず、すべてのperiodはvarcharとして処理されます
注釈
わかりやすくするため、出力コードの一部を省略しています。
生成されるvarchar表現の精度¶
PERIOD_UDF は、Snowflakeで指定されたタイムスタンプと時間のデフォルト形式を使用してperiodのvarchar表現を生成します。つまり、タイムスタンプは3桁の精度を持ち、時刻変数は0の精度を持つことを意味します。このため、結果の精度が予想よりも高くなったり低くなったりすることがあります。結果の文字列に含まれる精度の桁数を変更するには2つの方法があります。
PERIOD_UDF の3種類のパラメーターバージョンを使用します。この関数のオーバーロードは
PRECISIONDIGITSパラメーターを使用し、0から9までの整数で結果に含まれる時間の小数部の桁数を制御します。Snowflakeが最大9桁の精度をサポートしていても、Teradataでは最大6桁であることに注意してください。例:
呼び出し |
結果 |
|---|---|
|
|
|
|
|
|
セッションパラメーター
TIMESTAMP_NTZ_OUTPUT_FORMATとTIME_OUTPUT_FORMATを変更します。コマンドALTER SESSION SET TIMESTAMP_NTZ_OUTPUT_FORMAT = <format>およびALTER SESSION SET TIME_OUTPUT_FORMAT = <format>を使用して、現在のセッションにSnowflakeがデフォルトで使用する形式を変更できます。それらを変更して、現在のセッションについて PERIOD_UDF の今後の実行の結果に、望ましい精度の桁数の変更が含まれるようにします。
コード例¶
入力コード:¶
create table vacations (
employeeName varchar(50),
duration period(date)
);
insert into vacations values ('Richard', period(date '2021-05-15', date '2021-06-15'));
select end(duration) from vacations;
生成されたコード:¶
CREATE OR REPLACE TABLE vacations (
employeeName varchar(50),
duration VARCHAR(24) /*** SSC-FDM-TD0036 - SNOWFLAKE DOES NOT SUPPORT THE PERIOD DATATYPE, ALL PERIODS ARE HANDLED AS VARCHAR INSTEAD ***/
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"teradata"}}'
;
INSERT INTO vacations
VALUES ('Richard', PUBLIC.PERIOD_UDF(date '2021-05-15', date '2021-06-15') /*** SSC-FDM-TD0036 - SNOWFLAKE DOES NOT SUPPORT THE PERIOD DATATYPE, ALL PERIODS ARE HANDLED AS VARCHAR INSTEAD ***/);
SELECT
PUBLIC.PERIOD_END_UDF(duration) /*** SSC-FDM-TD0036 - SNOWFLAKE DOES NOT SUPPORT THE PERIOD DATATYPE, ALL PERIODS ARE HANDLED AS VARCHAR INSTEAD ***/ from
vacations;
ベストプラクティス¶
PERIODとその関連する関数の動作はvarcharを使用してエミュレートされるため、その正しさを保証するために得られた結果を確認することをお勧めします。さらにサポートが必要な場合は、 snowconvert-support@snowflake.com までメールでお問い合わせください。