SnowConvert AI - テラデータの問題

SSC-EWI-TD0001

再帰的転送エイリアスのエラー。

注釈

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

重大性

説明

この EWI は、 SnowConvert AI がエイリアス式内の再帰を検出するたびに表示されるため、Snowflake環境内でエイリアスを正しく機能させるために必要な転送エイリアスの変換を実行できません。

再帰的エイリアスは、エイリアス式が別のエイリアスを含み、2番目のエイリアス式が最初のエイリアスを含む場合に発生します。再帰は将来的に「推移的」に起こる可能性があるので、例のような些細なものではないかもしれません。

コード例

注意: 再帰的エイリアスはSnowflakeではサポートされていませんが、いくつかの単純なインスタンスはサポートされています。

注釈

再帰的エイリアスはSnowflakeではサポートされていませんが、いくつかの単純なインスタンスはサポートされていることに注意してください。 次の例をご参照ください。

次のコード例は、移行後のSnowflakeで動作します。

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

しかし、以下のコード例は機能しません。

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

ベストプラクティス

  • コードを確認して、再帰的転送エイリアスが存在しないことを確認してください。EWI には再帰的参照を持つエイリアスの最初のインスタンスの名前が表示されますが、それがコード内で再帰的参照を持つ唯一のインスタンスであることを意味するわけではありません。

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

SSC-EWI-TD0002

インターバル型はサポート対象外です。

この EWI は、 SnowConvert AI 28.1.100リリース以降、非推奨となっています。

Severity

Description

SQL ステートメントの列のセレクタが INTERVAL 型の場合、 EWI が追加され、Stub関数も作成されます。これは、 SnowFlake ではサポート対象外の型であるため、 SnowConvert AI が終了した後の保留中の作業を意味します。

Example Code

Teradata:
 SELECT
     CAST('07:00' AS INTERVAL HOUR(2) TO MINUTE),
     CAST('08:00' AS INTERVAL HOUR(2) TO MINUTE) As Test_Interval;
Copy
Snowflake Scripting:
 SELECT
     !!!RESOLVE EWI!!! /*** SSC-EWI-TD0002 - INTERVAL TYPE NOT SUPPORTED IN SNOWFLAKE ***/!!!
     INTERVAL '07 hour, 00 min',
     !!!RESOLVE EWI!!! /*** SSC-EWI-TD0002 - INTERVAL TYPE NOT SUPPORTED IN SNOWFLAKE ***/!!!
     INTERVAL '08 hour, 00 min' As Test_Interval;
Copy

Best Practices

SSC-EWI-TD0003

照合はトリム関数ではサポート対象外です。保持するには関数の結果に元の照合を追加します。

Severity

Description

Snowflakeでは、トリム関数( LTRIM RTRIM または TRIM )は、トリムする文字が空文字または空白文字でない限り、照合をサポートしません。

SnowConvert AI が LTRIM RTRIM または TRIM LEADING TRAILING、 もしくはその両方を上記のシナリオで検出した場合、 COLLATE 関数が自動的に生成され、入力列の照合なしにコピーを作成します。この EWI はトリム関数の前に列の照合が削除されたことを示すために生成されます。つまり、トリム関数の結果は照合を持たないことになり、その結果を使用するさらなる比較の結果が変わる可能性があります。

Example Code

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

SELECT
    TRIM(BOTH '0' FROM col1),
    TRIM(LEADING '  ' FROM col1),
    TRIM(TRAILING '0' FROM col1),
    LTRIM(col1, '0'),
    RTRIM(col1)
FROM
    collateTable;
Copy
Snowflake Scripting:
 CREATE OR REPLACE TABLE collateTable (
	col1 VARCHAR(50)
)
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "teradata",  "convertedOn": "07/14/2025",  "domain": "no-domain-provided" }}'
;

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

Best Practices

  • 比較中に関数の差異を避けるために、 TRIM 関数の結果文字列に列の元の照合を追加してください。これは、 COLLATE 関数を使用し、2番目の引数として元の列の照合を指定することで達成できます。この引数は、照合の値を持つリテラル文字列でなければなりません。

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

SSC-EWI-TD0004

Continue handlerで SQL 例外はサポート対象外です。

Severity

Description

Snowflakeプロシージャでは、Teradata Continue Handlerに相当する変換はありません。サポートされているExceptionコードによっては、 SnowConvert AI はこの動作をエミュレートする処理を行います。この EWI は、サポートされていない例外コードを持つContinue Handlerステートメントに追加されます。

Example Code

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

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

  SELECT 1;
 
END;
Copy
Snowflake Scripting:
 CREATE OR REPLACE PROCEDURE PURGING_ADD_TABLE
(INDATABASENAME VARCHAR(30), INTABLENAME VARCHAR(30)
)
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "teradata",  "convertedOn": "07/04/2024" }}'
EXECUTE AS CALLER
AS
$$
 DECLARE
  vCHAR_SQLSTATE CHAR(5);
  vSUCCESS       CHAR(5);
 BEGIN
   
   
  !!!RESOLVE EWI!!! /*** SSC-EWI-TD0004 - NOT SUPPORTED SQL EXCEPTION ON CONTINUE HANDLER ***/!!!

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

Best Practices

  • 例外コードをスローする可能性のあるステートメントをチェックし、 Continue Handler翻訳参照 で見られるように類似のコードブロックでそれらをカプセル化します。

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

SSC-EWI-TD0005

ステートメントは変換されましたが、その機能はまだ実装されていません。

Severity

Critical

Description

ステートメントは認識され、変換されましたが、まだ実装が完了していないため、変換されたコードは期待される機能を持ちません。

この警告は、スクリプトがこのステートメントを使用する場合、スクリプトは期待される同じ機能を持たないことをユーザーに認識させるために追加されます。

ソース例

BTEQ 入力コード:
 .SET SIDETITLES ON
Copy
Python出力コード:
 #*** 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
def main():
  snowconvert.helpers.configure_log()
  con = snowconvert.helpers.log_on()
  #** SSC-EWI-TD0005 - THE STATEMENT WAS CONVERTED BUT ITS FUNCTIONALITY IS NOT IMPLEMENTED YET **
  Export.side_titles(True)
  snowconvert.helpers.quit_application()

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

Best Practices

SSC-EWI-TD0006

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

Severity

Description

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

Example Code

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

Best Practices

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

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

SSC-EWI-TD0007

GROUP BY 句はTeradata Modeの文字列比較でサポート対象外です。

Severity

Description

このエラーメッセージは、Teradata SQL クエリをSnowflakeに移行する際に発生する可能性のある問題を示しています。特に、 GROUP BY 句がTeradataモードで文字列比較の感度を処理する方法の違いに関連しています。

Teradataモードでは、 GROUP BY 句の文字列比較はデフォルトで大文字と小文字を区別しません( NOT CASESPECIFIC )が、Snowflakeでは、列が大文字小文字を区別しない COLLATE 句で明示的に定義されていない限り、大文字小文字を区別します。この違いは、Teradataで大文字と小文字を区別しないグループ化に依存しているクエリが、Snowflakeで異なる結果を生成する原因となります。

Example Code

Teradata:
CREATE TABLE employees (
    employee_id INTEGER,
    first_name VARCHAR(50) NOT CASESPECIFIC,
    department VARCHAR(50)
);

INSERT INTO employees VALUES (1, 'John', 'Sales');
INSERT INTO employees VALUES (2, 'JOHN', 'sales'); 
INSERT INTO employees VALUES (3, 'john', 'SALES');

SELECT first_name, COUNT(*) 
FROM employees 
GROUP BY first_name;
Copy
Snowflake Scripting:
CREATE OR REPLACE TABLE employees (
    employee_id INTEGER,
    first_name VARCHAR(50),
    department VARCHAR(50)
)
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "teradata",  "convertedOn": "10/20/2025",  "domain": "no-domain-provided",  "migrationid": "kwOaAavBVnCx8OhdxEITfg==" }}'
;

INSERT INTO employees
VALUES (1, 'John', 'Sales');

INSERT INTO employees
VALUES (2, 'JOHN', 'sales');

INSERT INTO employees
VALUES (3, 'john', 'SALES');

SELECT
    first_name,
    COUNT(*)
FROM
    employees
!!!RESOLVE EWI!!! /*** SSC-EWI-TD0007 - GROUP BY IS NOT EQUIVALENT IN TERADATA MODE ***/!!!
GROUP BY first_name;
Copy

期待される動作の違い

プラットフォーム

グループ分けの行動

結果の行の例

Teradata Mode

Groups 'John', 'JOHN', and 'john' together

John (or JOHN/john), 3

Snowflake

Treats 'John', 'JOHN', and 'john' as separate

John, 1
JOHN, 1
john, 1

Best Practices

  • Teradataモードからの移行時に、文字列の列を含む GROUP BY 句を確認し 、期待されるグループ化の動作を確認します。

注意: GROUP BY 句で RTRIM(UPPER(first_name)) または RTRIM(first_name) のような式を使用して、大文字と小文字を区別しない、またはトリムされたグループ化を行う場合、列が参照されるクエリのすべての部分で同じ式を一貫して適用する必要があります。例:

SELECT RTRIM(UPPER(first_name))
FROM employees
WHERE RTRIM(UPPER(first_name)) = 'JOHN'
GROUP BY RTRIM(UPPER(first_name));
Copy

これにより、フィルタリング、選択、グループ化がすべて同じロジックを使うようになり、ミスマッチや予期せぬ結果を避けることができます。

  • 大文字と小文字を区別しない動作が必要な場合は、テーブル作成時に 列を COLLATE で定義します 。:

    CREATE TABLE employees (
        first_name VARCHAR(50) COLLATE 'en-cs'
    );
    
    Copy
  • 変換中に --UseCollateForCaseSpecification CLI フラグまたは変換設定を有効にして、大文字と小文字の仕様に COLLATE を使用します 。このオプションは、大文字小文字の仕様( CASESPECIFIC や NOT CASESPECIFIC など)が UPPER 関数ではなく COLLATE 関数で処理されるようにします。詳細は、CLI ドキュメント or conversion settingsをご参照ください。

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

SSC-EWI-TD0008

文字列を比較する関数はサポート対象外です

Severity

Description

現在、Snowflakeでは一部の文字列比較関数に相当するものがありません。

この EWI は、比較タイプが_jaro_、n_gramLDLDWSOSADLhammingLCSjaccard、_cosine_および_soundexcode_の場合に追加されます。

Example Code

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

Best Practices

SSC-EWI-TD0009

TEMPORAL 列はサポート対象外です。

Severity

Description

Teradataは、派生期間列を使用して、列レベルで一時的なテーブルのサポートを提供しています。これらの列はSnowflakeではサポートされていません。

Example Code

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

Best Practices

SSC-EWI-TD0010

UPPERCASE はSnowflakeでサポートされていません。

Severity

Description

UPPERCASE 列の属性はSnowflakeではサポートされていません。

Example Code

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

Best Practices

  • UPPERCASE 句は、'aaa'としてタイプされた文字が'AAA'として保存されることを示しているので、可能な回避策として、すべての挿入参照にUPPER関数を追加することができます。しかし、 ETL プロセスによる外部データのロードも変更する必要があります。

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

SSC-EWI-TD0012

バイナリはデフォルトをサポートしていません。

Severity

Description

この EWI は、 SnowConvert AI が DEFAULT 値の仕様とともに BINARY データ型を検出した時に表示されます。デフォルト値は BINARY 列で許可されていないため、削除されます。

Example Code

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

Best Practices

SSC-EWI-TD0017

一時的なグローバルテーブルトレース機能はサポートされていません。

Severity

Description

この EWI は、 SnowConvert AI が GLOBAL TEMPORARY TRACE オプションを伴うCreate Tableを検出した時に表示されます。TRACE の機能 に関する以下のTeradataドキュメントを確認してください。これはSnowflakeではサポートされていないため、削除されます。

Example Code

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

Best Practices

  • 注意:EVENT TABLE を使用することで、Snowflakeのトレース機能の一部を複製できるかもしれません。ログおよびトレース に関する以下のSnowflakeドキュメントを確認してください。

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

SSC-EWI-TD0020

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

注釈

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

重大性

説明

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

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

コード例

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

ベストプラクティス

  • それぞれのケースで使われている正規表現をチェックし、手作業が必要かどうかを判断します。SnowFlake の拡張正規表現サポートとその代替についての詳細は、[こちら](https://community.snowflake.com/s/question/0D50Z00007ENLKsSAP/expanded-support-for-regular-expressions-regex)を参照してください

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

SSC-EWI-TD0023

SELECT/SET INTO VARIABLE 内の ACTIVITY_COUNT は手動で修正する必要があります

重大性

説明

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

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

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

SELECT/SET INTO VARIABLE ステートメントで ACTIVITY_COUNT を使用する場合、上記の回避策で単純に置き換えることはできません。

コード例

Teradata

REPLACE PROCEDURE InsertEmployeeSalaryAndLog_4 ()
BEGIN
    DECLARE rowCount INT;
    DECLARE message VARCHAR(100);

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

    SELECT ACTIVITY_COUNT INTO rowCount;
    SET message = 'ROWS INSERTED: ' || rowCount;

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

Snowflake

 CREATE OR REPLACE PROCEDURE InsertEmployeeSalaryAndLog_4 ()
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "teradata",  "convertedOn": "07/15/2024" }}'
EXECUTE AS CALLER
AS
$$
    DECLARE
               rowCount INT;
               message VARCHAR(100);
    BEGIN
                
                
               INSERT INTO employees (employee_id, first_name, last_name, department_id, salary)
               VALUES (101, 'Alice', 'Smith', 10, 70000.00);
               SELECT
            ACTIVITY_COUNT !!!RESOLVE EWI!!! /*** SSC-EWI-TD0023 - ACTIVITY_COUNT INSIDE SELECT/SET INTO VARIABLE REQUIRES MANUAL FIX ***/!!! INTO
            :rowCount;
            message := 'ROWS INSERTED: ' || rowCount;

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

マニュアル修正

上記で示した回避策の一部を使えば、このように挿入/更新/削除された行数を取得することができます。

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

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

完全なクエリを使用する代わりに、Snowflakeの SELECT INTO VARIABLE 構文に手動で適応させる必要があります。

さらに、RESULT_SCAN(LAST_QUERY_ID()) が正しくない結果を提供している場合は、 LAST_QUERY_ID の使用の考えられる制限の処理方法について、 SSC-FDM-TD0033(../functional-difference/teradataFDM.md#ssc-fdm-td0033) をご参照ください。

ベストプラクティス

  • 提案された回避策を手動で適応させます。

  • LAST_QUERY_ID の使用の考えられる制限の処理方法について、 SSC-FDM-TD0033(../functional-difference/teradataFDM.md#ssc-fdm-td0033) をご参照ください。

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

SSC-EWI-TD0024

集約関数のため、Abortステートメントはサポートされていません。

重大性

説明

この EWI は、 AGGREGATE 関数がストアドプロシージャ内のABORT ステートメントの一部である場合に表示されます。このステートメントはコメントアウトされます。

コード例

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

ベストプラクティス

SSC-EWI-TD0025

出力形式がサポートされていません。

重大性

説明

この EWI は、CAST 関数がSnowflakeスクリプトでサポートされていない出力形式を指定した場合に表示されます。

コード例

Teradata:
 CREATE TABLE SAMPLE_TABLE
(
    VARCHAR_TYPE VARCHAR
);

REPLACE VIEW SAMPLE_VIEW 
AS
SELECT
CAST(VARCHAR_TYPE AS FLOAT FORMAT 'ZZZ.ZZZZZ'),
CAST('01:02.030405' AS TIME(1) WITH TIME ZONE FORMAT 'MI:SS.S(6)')
FROM SAMPLE_TABLE;
Copy
Snowflake Scripting:
 CREATE OR REPLACE TABLE SAMPLE_TABLE
(
    VARCHAR_TYPE VARCHAR
)
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "teradata",  "convertedOn": "03/03/2025",  "domain": "test" }}'
;

CREATE OR REPLACE VIEW SAMPLE_VIEW
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "teradata",  "convertedOn": "03/03/2025",  "domain": "test" }}'
AS
SELECT
    TO_NUMBER(VARCHAR_TYPE, '999.00000', 38, 10) !!!RESOLVE EWI!!! /*** SSC-EWI-TD0025 - OUTPUT FORMAT 'ZZZ.ZZZZZ' NOT SUPPORTED. ***/!!!,
    TO_TIME('01:02.030405', 'MI:SS.FF6') !!!RESOLVE EWI!!! /*** SSC-EWI-TD0025 - OUTPUT FORMAT 'MI:SS.S(6)' NOT SUPPORTED. ***/!!!
    FROM
    SAMPLE_TABLE;
Copy

ベストプラクティス

  • 出力コードが元のコードと機能的に等しいかどうかをチェックします。

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

SSC-EWI-TD0027

SnowflakeはTeradataの組み込みの時間ディメンション列オプションをサポートしていません

重大性

説明

EWI が生成されるのは、Snowflakeが VALIDTIME や TRANSACTIONTIME のようなTeradataの組み込みの時間ディメンジョン属性をサポートしていないためです。

コード例

Teradataの入力:
 CREATE MULTISET TABLE SAMPLE_TABLE   
(
    COL1 PERIOD(TIMESTAMP(6) WITH TIME ZONE) NOT NULL AS TRANSACTIONTIME
);  
Copy
Snowflakeの出力:
 CREATE OR REPLACE TABLE SAMPLE_TABLE (
       COL1 VARCHAR(68) NOT NULL !!!RESOLVE EWI!!! /*** SSC-EWI-TD0027 - SNOWFLAKE DOES NOT SUPPORT 'TRANSACTIONTIME' COLUMN OPTION ***/!!! /*** 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"}}'
;
Copy

ベストプラクティス

  • CURRENT_TIMESTAMP のようなデフォルト値を持つ TIMESTAMP 列を手動で作成します。

  • テーブルストリームを利用することで、テーブルに対するデータ操作の変更と、各変更に関するメタデータを記録することができます。(ガイド)

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

SSC-EWI-TD0029

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

重大性

説明

この警告は、 QUEUE 属性を持つ TABLE が移行されたときに表示されます。Snowflakeでは QUEUE キーワードはサポートされていないため、削除されます。

コード例

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

ベストプラクティス

SSC-EWI-TD0031

Teradataではchar型は固定長であるため、結果が異なる場合があります。

重大性

説明

Teradata CHAR データ型は固定長であるため、 LIKE などの一部の関数は、列に挿入された単語ではなく、完全な列を一致させようとし、結果として誤った一致が発生します。しかし、Snowflakeの CHAR 型は可変サイズであるため、 LIKE 関数は常に挿入された値との一致を試みます。次のコードを例として考えてみましょう。

コード例

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

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

SELECT col1 FROM table1 where col1 LIKE 'Barnum';
-- The result is a single row with 'Barnum'
SELECT col2 FROM table1 where col2 LIKE 'Barnum';
-- It does not return any row
Copy
出力:
 CREATE OR REPLACE TABLE table1
(
    col1 VARCHAR(36),
    col2 CHAR(36)
)
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "teradata",  "convertedOn": "07/14/2025",  "domain": "no-domain-provided" }}'
;

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

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

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

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

ベストプラクティス

SSC-EWI-TD0034

マルチステートメント SQL はサポートされていません。

注釈

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

重大性

説明

マルチステートメント SQL の実行はサポートされていません。リクエストはトランザクションとして処理されました。

注釈

'--PLTargetLanguage Javascript' のように、次の EWI は、 PL Target LanguageフラグがJavascriptに設定されている場合にのみ生成されます。

コード例

入力:
-- Additional Params: --PLTargetLanguage Javascript
REPLACE PROCEDURE proc1()
  BEGIN
    BEGIN REQUEST;
      SELECT* FROM TABLE1;
    END REQUEST;
END;
出力:
 CREATE OR REPLACE PROCEDURE proc1 ()
RETURNS STRING
LANGUAGE JAVASCRIPT
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"teradata"}}'
EXECUTE AS CALLER
AS
$$
  // SnowConvert AI Helpers Code section is omitted.

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

ベストプラクティス

SSC-EWI-TD0039

入力形式がサポートされていません。

重大性

説明

指定された入力形式はSnowflakeではサポートされていません。

コード例

入力:
 SELECT 
    CAST('02/032/25' AS DATE FORMAT 'MM/DDD/YY'),
    CAST('02/032/25' AS DATE FORMAT 'MM/D3/YY'),
    CAST('03-Thursday-2025' AS DATE FORMAT 'DD-EEEE-YYYY'),
    CAST('03-Thursday-2025' AS DATE FORMAT 'DD-E4-YYYY');
Copy
出力:
 SELECT
    TO_DATE('02/032/25', 'MM/DDD/YY') !!!RESOLVE EWI!!! /*** SSC-EWI-TD0039 - INPUT FORMAT 'MM/DDD/YY' NOT SUPPORTED ***/!!!,
    TO_DATE('02/032/25', 'MM/D3/YY') !!!RESOLVE EWI!!! /*** SSC-EWI-TD0039 - INPUT FORMAT 'MM/D3/YY' NOT SUPPORTED ***/!!!,
    TO_DATE('03-Thursday-2025', 'DD-EEEE-YYYY') !!!RESOLVE EWI!!! /*** SSC-EWI-TD0039 - INPUT FORMAT 'DD-EEEE-YYYY' NOT SUPPORTED ***/!!!,
    TO_DATE('03-Thursday-2025', 'DD-E4-YYYY') !!!RESOLVE EWI!!! /*** SSC-EWI-TD0039 - INPUT FORMAT 'DD-E4-YYYY' NOT SUPPORTED ***/!!!;
Copy

ベストプラクティス

SSC-EWI-TD0040

表の形式はサポートされていません。

重大性

説明

指定された形式はサポートされていません。

コード例

入力:
 CREATE TABLE T_2040
(
    C1 VARCHAR(255) CHARACTER SET LATIN NOT CASESPECIFIC FORMAT 'X(50)',
    C2 VARCHAR(255) CHARACTER SET LATIN NOT CASESPECIFIC FORMAT 'X(75)'
);
Copy
出力:
 CREATE OR REPLACE TABLE T_2040
(
    C1 VARCHAR(255) FORMAT 'X(50)' !!!RESOLVE EWI!!! /*** SSC-EWI-TD0040 - FORMAT IN TABLE T_2040 NOT SUPPORTED ***/!!!,
    C2 VARCHAR(255) FORMAT 'X(75)' !!!RESOLVE EWI!!! /*** SSC-EWI-TD0040 - FORMAT IN TABLE T_2040 NOT SUPPORTED ***/!!!
)
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "teradata",  "convertedOn": "07/14/2025",  "domain": "no-domain-provided" }}'
;
Copy

SSC-EWI-TD0041

整数になるように、Trunc関数が追加されました。

重大性

説明

TeradataをSnowflakeに移行する際、数値変換の処理方法が異なる場合があります。Teradataでは、 INTEGER に値をキャストすると、元の値が浮動小数点数や数値の文字列表現であっても、暗黙のうちに小数点以下が切り捨てられます。しかし、Snowflakeでは、整数でない数値や文字列を直接 INTEGER にキャストすると、値がすでに整数でない場合にはエラーが発生したり、予期しない結果になることがあります。

互換性を確保するため、 INTEGER にキャストする前に TRUNC() 関数が適用されます。これは小数の部分を取り除き、整数への安全な変換を可能にします。しかし、ソース値が数値でなかったり、非数値文字列の場合、エラーが発生し、手作業が必要になることがあります。たとえば、 SnowConvert AI が参照先が見つからないために列の型を判断できない場合、手動で変換を調整する必要があるかもしれません。

コード例

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

ベストプラクティス

SSC-EWI-TD0046

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

重大性

説明

このエラーは、 DBC テーブルへの参照があり、選択された列がSnowflakeで同等でない場合に表示されます。

コード例

入力:
 CREATE VIEW SAMPLE_VIEW
AS
SELECT PROTECTIONTYPE FROM DBC.DATABASES;
Copy
出力:
 CREATE OR REPLACE VIEW SAMPLE_VIEW
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "teradata",  "convertedOn": "08/14/2024" }}'
AS
SELECT
!!!RESOLVE EWI!!! /*** SSC-EWI-TD0046 - BUILT-IN REFERENCE TO PROTECTIONTYPE IS NOT SUPPORTED IN SNOWFLAKE ***/!!!
PROTECTIONTYPE FROM
INFORMATION_SCHEMA.DATABASES;
Copy

ベストプラクティス

SSC-EWI-TD0049

TPT-ステートメントが処理されません。

重大性

説明

TPT の DML ステートメントが、ツールで処理および変換できませんでした。これは、スクリプト変数との連結を使用したり、 DML ステートメント内で引用符をエスケープするなどの理由で発生する可能性があります。

コード例

入力コード:
 -- Script1.tpt
DEFINE JOB load_job
DESCRIPTION 'LOAD TABLE FROM A FILE'
  (
     DEFINE SCHEMA schema_name
     DESCRIPTION 'define SCHEMA'
   (
       var1 VARCHAR (50)
   );

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

   );
);
Copy
生成されたコード:
 #*** Generated code is based on the SnowConvert 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
import argparse
args = None
## Script1.tpt
class load_job:
    #'LOAD TABLE FROM A FILE'

  jobname = "load_job"
    #'define SCHEMA'

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


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

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

ベストプラクティス

  • この問題については、insertステートメントを手動で入力できます。もしくは DML ステートメントがまだサポートされていないため、 SnowConvert AI チームにその特定のケースのサポートを追加するよう依頼してください。

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

SSC-EWI-TD0051

Teradata BYTES 関数の結果は、バイト列のSnowflake LENGTH 関数と異なります。

重大性

説明

Teradataのバイトデータ型は固定長であるため、 BYTES 関数は、より小さなバイト型の値を列に収めるために挿入される 末尾のゼロを常にカウントし 、元々挿入されていた値のサイズの代わりに列のサイズを返します。しかし、Snowflakeのバイナリ型は可変サイズであるため、 LENGTH 関数は常に挿入された値とのサイズを返します。次のコードを例として考えてみましょう。

Teradata:

 create table exampleTable(
	bytecol byte(10)
);

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

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

Snowflakeで同等のコード:

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

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

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

コード例:

入力コード:
 create table sampleTable(
    byteColumn byte(10),
    varbyteColumn varbyte(15)
);

select bytes(byteColumn), bytes(varbyteColumn) from sampleTable;
Copy
生成されたコード:
 CREATE OR REPLACE TABLE sampleTable (
    byteColumn BINARY,
    varbyteColumn BINARY(15)
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"teradata"}}'
;

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

ベストプラクティス

  • BYTES 関数の結果に与えられた使用を分析します。Snowflake LENGTH 関数の動作は当初から望まれていたものであり、変更は必要ありません。

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

SSC-EWI-TD0052

Snowflakeの暗黙的な数値変換はTeradataと異なり、非リテラル文字列では失敗することがあります。

重大性

説明

TeradataもSnowflakeも、数値パラメーターを期待する関数に文字列値を許可するので、これらの文字列は解析されて同等の数値に変換されます。

ただし、2つの言語は有効な数値文字列と考えるものが異なります。Teradataはより寛容で、空文字列や空白のみの文字列、埋め込みダッシュ、仮数や指数に桁がない場合、通貨記号、桁区切り記号、桁の後に数値の記号を指定した場合などを解析できます。たとえば、以下の文字列が有効です。

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

  • '$50' -> 50

  • '5000-' -> -5000

  • '1,569,284.55' -> 1569284.55

Snowflakeは自動オプティミスティック文字列変換 を適用し、文字列が TM9 または TME 形式のいずれかに一致することを想定しているため、前述のほとんどのケースで変換は失敗します。これらの差異を解決するために、 SnowConvert AI は暗黙の数値変換を行う関数に渡された文字列リテラルを処理し、 TM9 または TME に一致する同等の文字列を生成するので、Snowflakeはそれらを解析できます。これはリテラル文字列値にのみ適用され、非リテラル値はSnowflakeによって解析される保証がないことを意味します。

コード例

入力コード:
 create table myTable(
    stringCol varchar(30)
);

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

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

select cos(stringCol) from myTable;
Copy
生成されたコード:
 CREATE OR REPLACE TABLE myTable (
    stringCol varchar(30)
)
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "teradata",  "convertedOn": "07/14/2025",  "domain": "no-domain-provided" }}'
;

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

SELECT
    COS('-1236857.45');

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

ベストプラクティス

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

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

SSC-EWI-TD0053

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

注釈

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

注釈

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

生成されるvarchar表現の精度

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

  • PERIOD_UDF の3種類のパラメーターバージョンを使用します。この関数のオーバーロードは PRECISIONDIGITS パラメーターを使用し、0から9までの整数で結果に含まれる時間の小数部の桁数を制御します。Snowflakeが最大9桁の精度をサポートしていても、Teradataでは最大6桁であることに注意してください。例:

呼び出し

結果

PUBLIC.PERIOD_UDF(time '13:30:45.870556', time '15:35:20.344891', 0)

'13:30:45*15:35:20'

PUBLIC.PERIOD_UDF(time '13:30:45.870556', time '15:35:20.344891', 2)

'13:30:45.87*15:35:20.34'

PUBLIC.PERIOD_UDF(time '13:30:45.870556', time '15:35:20.344891', 5)

'13:30:45.87055*15:35:20.34489'

  • セッションパラメーター TIMESTAMP_NTZ_OUTPUT_FORMATTIME_OUTPUT_FORMAT を次のように変更します。コマンド ALTER SESSION SET TIMESTAMP_NTZ_OUTPUT_FORMAT = <format> および ALTER SESSION SET TIME_OUTPUT_FORMAT = <format>

    を使用して、現在のセッションにSnowflakeがデフォルトで使用する形式を変更できます。それらを変更して、現在のセッションについて PERIOD_UDF の今後の実行の結果に、望ましい精度の桁数の変更が含まれるようにします。

コード例

入力コード:
 create table vacations (
    employeeName varchar(50),
    duration period(date)
);

insert into vacations values ('Richard', period(date '2021-05-15', date '2021-06-15'));

select end(duration) from vacations;
Copy
生成されたコード:
 CREATE OR REPLACE TABLE vacations (
    employeeName varchar(50),
    duration VARCHAR(24) /*** SSC-FDM-TD0036 - SNOWFLAKE DOES NOT SUPPORT THE PERIOD DATATYPE, ALL PERIODS ARE HANDLED AS VARCHAR INSTEAD ***/
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"teradata"}}'
;

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

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

ベストプラクティス

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

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

SSC-EWI-TD0055

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

注釈

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

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

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

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

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

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

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

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

TO_CHAR(Numeric) の場合、Snowflakeは TM9 または TME 形式のいずれかを使用してvarchar表現を生成し、数値のコンパクトな表現を取得します。Teradataは、数値のコンパクトな表現も生成するため、アクションは不要です。

コード例

入力コード:
 select to_char(date '2008-09-13', 'DD/RM/YYYY');

select to_char(date '2010-10-20', 'DS');

select to_char(1255.495, 'SC9999.9999', 'nls_iso_currency = ''EUR''');

select to_char(45620);
Copy
生成されたコード:
 SELECT
TO_CHAR(date '2008-09-13', 'DD/') || PUBLIC.ROMAN_NUMERALS_MONTH_UDF(date '2008-09-13') || TO_CHAR(date '2008-09-13', '/YYYY') !!!RESOLVE EWI!!! /*** SSC-EWI-TD0055 - SNOWFLAKE SUPPORTED FORMATS FOR TO_CHAR DIFFER FROM TERADATA AND MAY FAIL OR HAVE DIFFERENT BEHAVIOR ***/!!!;

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

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

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

ベストプラクティス

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

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

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

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

SSC-EWI-TD0057

NEW JSON のバイナリデータはサポートされていません。

重大性

説明

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

コード例

入力コード

 SELECT NEW JSON ('160000000268656C6C6F0006000000776F726C640000'xb, BSON);
Copy
生成されたコード
 SELECT
!!!RESOLVE EWI!!! /*** SSC-EWI-TD0057 - NEW JSON FUNCTION WITH BINARY DATA IS NOT SUPPORTED ***/!!!!!!RESOLVE EWI!!! /*** SSC-EWI-TD0039 - INPUT FORMAT 'BSON' NOT SUPPORTED ***/!!!
NEW JSON (TO_BINARY('160000000268656C6C6F0006000000776F726C640000'), BSON);
Copy

ベストプラクティス

SSC-EWI-TD0059

Snowflakeユーザーのデフォルトタイムゾーンは、Teradataの値と一致させるための設定が必要な場合があります。

重大性

説明

Teradataと同じように、ユーザーにデフォルトのタイムゾーン値を設定すると、セッションに新しい値が定義されるまで、そのタイムゾーンを使用してセッションが開始されます。

この警告は、Teradataでユーザーに定義されたものと同じタイムゾーンをSnowflakeユーザーにも設定する必要があることを思い出させるために生成されます。これを行うには、Snowflakeで次のクエリを使用してください。 ALTER SESSION SET TIMEZONE = 'equivalent_timezone' Snowflakeが受け入れるのは IANA タイムゾーンデータベース 標準タイムゾーンのみであることを覚えておいてください。

コード例

入力コード:
 SET TIME ZONE USER;
Copy
生成されたコード:
 !!!RESOLVE EWI!!! /*** SSC-EWI-TD0059 - SNOWFLAKE USER DEFAULT TIME ZONE MAY REQUIRE CONFIGURATION TO MATCH TERADATA VALUE ***/!!!
ALTER SESSION UNSET TIMEZONE;
Copy

ベストプラクティス

  • ユーザーのデフォルトタイムゾーンを、Teradataユーザーに設定したタイムゾーンと同じタイムゾーンに設定することを忘れないでください。

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

SSC-EWI-TD0060

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

注釈

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

重大性

説明

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

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

JSON データをテーブルにロードする方法については、こちらの ページ をご参照ください。

コード例

入力コード:
 CREATE TABLE demo.Train (
    firstCol INT,
    jsonCol JSON(400),
    thirdCol VARCHAR(30)
);

SELECT * FROM JSON_TABLE 
(ON (SELECT T.*
           FROM demo.Train T)
USING rowexpr('$.schools[*]')
               colexpr('[ {"jsonpath" : "$.name",
                           "type" : "CHAR(20)"},
                          {"jsonpath" : "$.type",
                           "type" : "VARCHAR(20)"}]')
)
AS JT;

SELECT * FROM JSON_TABLE 
(ON (SELECT T.*
           FROM demo.missingTable T)
USING rowexpr('$.schools[*]')
               colexpr('[ {"jsonpath" : "$.name",
                           "type" : "CHAR(20)"},
                          {"jsonpath" : "$.type",
                           "type" : "VARCHAR(20)"}]')
)
AS JT;
Copy
生成されたコード:
 CREATE OR REPLACE TABLE demo.Train (
    firstCol INT,
    jsonCol VARIANT,
    thirdCol VARCHAR(30)
)
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "teradata",  "convertedOn": "12/16/2024",  "domain": "test" }}'
;

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

    SELECT
    * FROM
    !!!RESOLVE EWI!!! /*** SSC-EWI-TD0060 - JSON_TABLE NOT TRANSFORMED, COLUMN NAMES COULD NOT BE RETRIEVED FROM SEMANTIC INFORMATION ***/!!! JSON_TABLE
   (ON (
        SELECT
            T.*
                  FROM
            demo.missingTable T)
   USING rowexpr('$.schools[*]')
                  colexpr('[ {"jsonpath" : "$.name",
                           "type" : "CHAR(20)"},
                          {"jsonpath" : "$.type",
                           "type" : "VARCHAR(20)"}]')
   )
   AS JT;
Copy

ベストプラクティス

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

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

SSC-EWI-TD0061

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

重大性

説明

SnowConvert AI はサポートされていません。 TD_UNPIVOT 関数を変換します。これは、テーブルの列を行として表現するために使用できます。

しかし、この変換を行うには、テーブル列に関する情報(より具体的には列の名前)が必要です。この情報が存在しない場合、変換は、列が結果から欠落した不完全な状態のままになることがあります。このような場合にこの EWI が生成されます。

コード例

入力コード:
 CREATE TABLE unpivotTable  (
	myKey INTEGER NOT NULL PRIMARY KEY,
	firstSemesterIncome DECIMAL(10,2),
	secondSemesterIncome DECIMAL(10,2),
	firstSemesterExpenses DECIMAL(10,2),
	secondSemesterExpenses DECIMAL(10,2)
);

SELECT * FROM
 TD_UNPIVOT(
 	ON unpivotTable 
 	USING
 	VALUE_COLUMNS('Income', 'Expenses')
 	UNPIVOT_COLUMN('Semester')
 	COLUMN_LIST('firstSemesterIncome, firstSemesterExpenses', 'secondSemesterIncome, secondSemesterExpenses')
 	COLUMN_ALIAS_LIST('First', 'Second')
 )X ORDER BY mykey;

SELECT * FROM
 TD_UNPIVOT(
 	ON unknownTable
 	USING
 	VALUE_COLUMNS('MonthIncome')
 	UNPIVOT_COLUMN('Months')
 	COLUMN_LIST('januaryIncome', 'februaryIncome', 'marchIncome', 'aprilIncome')
 	COLUMN_ALIAS_LIST('January', 'February', 'March', 'April')
 )X ORDER BY yearKey;
Copy
生成されたコード:
 CREATE OR REPLACE TABLE unpivotTable (
	myKey INTEGER NOT NULL PRIMARY KEY,
	firstSemesterIncome DECIMAL(10,2),
	secondSemesterIncome DECIMAL(10,2),
	firstSemesterExpenses DECIMAL(10,2),
	secondSemesterExpenses DECIMAL(10,2)
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"teradata"}}'
;

--** SSC-FDM-0007 - MISSING DEPENDENT OBJECTS "VALUE_COLUMNS", "UNPIVOT_COLUMN", "COLUMN_LIST", "COLUMN_ALIAS_LIST" **
SELECT
	* FROM
	(
		SELECT
			myKey,
			TRIM(GET_IGNORE_CASE(OBJECT_CONSTRUCT('FIRSTSEMESTERINCOME', 'First', 'FIRSTSEMESTEREXPENSES', 'First', 'SECONDSEMESTERINCOME', 'Second', 'SECONDSEMESTEREXPENSES', 'Second'), Semester), '"') AS Semester,
			Income,
			Expenses
		FROM
			unpivotTable UNPIVOT(Income FOR Semester IN (
				firstSemesterIncome,
				secondSemesterIncome
			)) UNPIVOT(Expenses FOR Semester1 IN (
				firstSemesterExpenses,
				secondSemesterExpenses
			))
		WHERE
			Semester = 'FIRSTSEMESTERINCOME'
			AND Semester1 = 'FIRSTSEMESTEREXPENSES'
			OR Semester = 'SECONDSEMESTERINCOME'
			AND Semester1 = 'SECONDSEMESTEREXPENSES'
	) X ORDER BY mykey;

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

ベストプラクティス

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

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

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

SSC-EWI-TD0063

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

注釈

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

重大性

説明

このメッセージは、文字列が期待される JSON 形式を持たないため、 SnowConvert AI が JSON パスをデシリアライズできない場合に表示されます。

コード例

入力コード:
 SELECT
    *
FROM
JSON_TABLE (
    ON (
        SELECT
            id,
            trainSchedule as ts
        FROM
            demo.PUBLIC.Train T
    ) USING rowexpr('$weekShedule.Monday[*]') colexpr(
        '[{"jsonpath"  "$.time",
              "type"" : "CHAR ( 12 )"}]'
    )
) AS JT(Id, Ordinal, Time, City);
Copy
生成されたコード:
 SELECT
    *
FROM
    !!!RESOLVE EWI!!! /*** SSC-EWI-TD0063 - UNRECOGNIZED JSON PATH $weekShedule.Monday[*] ***/!!!
JSON_TABLE (
    ON
       !!!RESOLVE EWI!!! /*** SSC-EWI-0108 - THE FOLLOWING SUBQUERY MATCHES AT LEAST ONE OF THE PATTERNS CONSIDERED INVALID AND MAY PRODUCE COMPILATION ERRORS ***/!!! (
           SELECT
               id,
               trainSchedule as ts
FROM
               demo.PUBLIC.Train T
    ) USING rowexpr('$weekShedule.Monday[*]') colexpr(
        '[{"jsonpath"  "$.time",
              "type"" : "CHAR ( 12 )"}]'
    )
) AS JT(Id, Ordinal, Time, City);
Copy

ベストプラクティス

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

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

SSC-EWI-TD0066

次の識別子には、Snowflakeでは無効なUnicodeエスケープ文字が1つ以上あります。

注釈

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

重大性

説明

このメッセージは、 SnowConvert AI がTeradata Unicode区切り識別子 をSnowflakeで無効な文字で変換した場合に表示されます。

コード例

入力コード:
 SELECT * FROM U&"#000f#ffff" UESCAPE '#';
Copy
生成されたコード:
 // SnowConvert AI Helpers Code section is omitted.
SELECT
* FROM
!!!RESOLVE EWI!!! /*** SSC-EWI-TD0066 - THE FOLLOWING IDENTIFIER HAS ONE OR MORE UNICODE ESCAPE CHARACTERS THAT ARE INVALID IN SNOWFLAKE ***/!!!
"\u000f\uffff";
Copy

ベストプラクティス

  • Snowflakeで有効なUnicode文字を含む識別子を使用してください。

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

SSC-EWI-TD0068

Snowflakeはプロファイルをサポートしておらず、代わりにロールを参照します

重大性

説明

Teradataプロファイルは、ストレージスペースとパスワード制約管理に関連する複数の共通パラメーターを定義することを許可します。

しかし、 Snowflakeはクラウドアーキテクチャと連携し、ストレージを自動的に管理・最適化します 。つまり、ユーザー側でストレージのカスタマイズは行われません。また、 Snowflakeには現在、すべてのユーザーパスワードに適用され、変更できないパスワードポリシーが定義されています。

このエラーは、Teradataプロファイルへの参照が、ユーザーロールへの参照に変更されたことを示すことが判明した場合に生成されます。ユーザーロールはSnowflakeでのプロファイルに最も近いものですが、ユーザのプロファイルとロール名が同じでない限り、クエリ結果に違いが生じる可能性があります。

コード例

入力コード:
 SELECT PROFILE;
Copy
生成されたコード:
 SELECT
CURRENT_ROLE() !!!RESOLVE EWI!!! /*** SSC-EWI-TD0068 - SNOWFLAKE DOES NOT SUPPORT PROFILES, REFERENCING ROLE INSTEAD ***/!!!;
Copy

ベストプラクティス

  • ユーザープロファイルを参照することは避けてください。それらはサポートされておらず、ユーザーのプロファイルとロールの両方が同じ名前でない限り、クエリ結果は異なります。

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

SSC-EWI-TD0069

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

注釈

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

重大性

説明

Teradataの関数 ST_SPHERICALDISTANCE は、地球上の2つの球面座標間の距離をハバーサイン公式を用いて計算します。一方、Snowflakeの ST_DISTANCE 関数は、2つの地理的な点の間の最小距離を計算するためにハバーサイン公式を利用しません。

コード例

入力コード:
 --The distance between New York and Los Angeles
Select Cast('POINT(-73.989308 40.741895)' As ST_GEOMETRY) As location1,
	Cast('POINT(40.741895 34.053691)' As ST_GEOMETRY) As location2,
	location1.ST_SPHERICALDISTANCE(location2) As Distance_In_km;
Copy
生成されたコード
 --The distance between New York and Los Angeles
SELECT
	Cast('POINT(-73.989308 40.741895)' As GEOGRAPHY) As location1,
	Cast('POINT(40.741895 34.053691)' As GEOGRAPHY) As location2,
	!!!RESOLVE EWI!!! /*** SSC-EWI-TD0069 - ST_DISTANCE RESULTS ARE SLIGHTLY DIFFERENT FROM ST_SPHERICALDISTANCE ***/!!!
	ST_DISTANCE(
	location1, location2) As Distance_In_km;
Copy

ベストプラクティス

SSC-EWI-TD0070

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

注釈

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

重大性

説明

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

Gotoコマンドの後に BTEQ が実行されると、gotoコマンドとlabelコマンドの間にある同名のステートメントは無視されます。そのため、これらのステートメントが実行されるのを避けるために、Labelセクションにはreturnステートメントを含める必要があります。

加えて、Gotoコマンドは同名のLabelを除き、他のすべてのステートメントをスキップします。この時、実行が再開されます。したがって、Gotoコマンド以前に定義されたLabelセクションで実行が再開されることはありません。

コード例

入力コード:
 -- Additional Params: --scriptsTargetLanguage SnowScript
.LOGON dbc,dbc;
select 'STATEMENTS';
.GOTO LABEL_B
select 'IGNORED STATEMENTS';
.label LABEL_B
select 'LABEL_B STATEMENTS';
Copy
生成されたコード
 EXECUTE IMMEDIATE
$$
  DECLARE
    STATUS_OBJECT OBJECT := OBJECT_CONSTRUCT('SQLCODE', 0);
  BEGIN
    --.LOGON dbc,dbc
    !!!RESOLVE EWI!!! /*** SSC-EWI-0073 - PENDING FUNCTIONAL EQUIVALENCE REVIEW FOR 'BTLogOn' NODE ***/!!!
    null;
    BEGIN
      SELECT
        'STATEMENTS';
      STATUS_OBJECT := OBJECT_CONSTRUCT('SQLROWCOUNT', SQLROWCOUNT);
    EXCEPTION
      WHEN OTHER THEN
        STATUS_OBJECT := OBJECT_CONSTRUCT('SQLCODE', SQLCODE, 'SQLERRM', SQLERRM, 'SQLSTATE', SQLSTATE);
    END;
     
    /*.label LABEL_B*/
     
    BEGIN
      SELECT
        'LABEL_B STATEMENTS';
      STATUS_OBJECT := OBJECT_CONSTRUCT('SQLROWCOUNT', SQLROWCOUNT);
    EXCEPTION
      WHEN OTHER THEN
        STATUS_OBJECT := OBJECT_CONSTRUCT('SQLCODE', SQLCODE, 'SQLERRM', SQLERRM, 'SQLSTATE', SQLSTATE);
    END;
    !!!RESOLVE EWI!!! /*** SSC-EWI-TD0070 - A RETURN STATEMENT WAS ADDED AT THE END OF THE LABEL SECTION LABEL_B TO ENSURE THE SAME EXECUTION FLOW ***/!!!
    RETURN 0;
    BEGIN
      SELECT
        'IGNORED STATEMENTS';
      STATUS_OBJECT := OBJECT_CONSTRUCT('SQLROWCOUNT', SQLROWCOUNT);
    EXCEPTION
      WHEN OTHER THEN
        STATUS_OBJECT := OBJECT_CONSTRUCT('SQLCODE', SQLCODE, 'SQLERRM', SQLERRM, 'SQLSTATE', SQLSTATE);
    END;
    /*.label LABEL_B*/
    --** SSC-FDM-0027 - REMOVED NEXT STATEMENT, NOT APPLICABLE IN SNOWFLAKE.  **
     
    BEGIN
      SELECT
        'LABEL_B STATEMENTS';
      STATUS_OBJECT := OBJECT_CONSTRUCT('SQLROWCOUNT', SQLROWCOUNT);
    EXCEPTION
      WHEN OTHER THEN
        STATUS_OBJECT := OBJECT_CONSTRUCT('SQLCODE', SQLCODE, 'SQLERRM', SQLERRM, 'SQLSTATE', SQLSTATE);
    END;
  END
$$
Copy

ベストプラクティス

SSC-EWI-TD0076

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

重大性

説明

外部テーブル は、Amazon S3、Azure Blob storage、Google Cloud Storageの半構造化データや非構造化データなど、外部オブジェクトストレージ内のデータへのアクセスを可能にします。この構文はSnowflakeではサポートされていません。しかし、Snowflakeには外部テーブル、icebergテーブル、標準テーブルなど、代わりに使用できるものがあります。

コード例

入力コード:
 SELECT cust_id, income, age FROM 
FOREIGN TABLE (SELECT cust_id, income, age FROM twm_customer)@hadoop1 T1;
Copy
生成されたコード:
 SELECT
cust_id,
income,
age FROM
!!!RESOLVE EWI!!! /*** SSC-EWI-TD0076 - THE USE OF FOREIGN TABLES IS NOT SUPPORTED IN SNOWFLAKE. ***/!!!
 FOREIGN TABLE (SELECT cust_id, income, age FROM twm_customer)@hadoop1 T1;
Copy

ベストプラクティス

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

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

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

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

SSC-EWI-TD0077

RESET WHEN 句は、その条件により、このシナリオではサポートされていません。

注釈

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

重大性

説明

SnowConvert AI は現在、バイナリ条件(<=, >= または =)を持つ RESETWHEN 句のみをサポートしています。IS NOT NULL のような他のタイプの条件は、Snowflakeではサポートされていないため、 RESETWHEN 句は削除され、エラーメッセージが追加されます。

このエラーメッセージは、 RESET WHEN 条件が、移行ツールによって定義が見つからなかった式を参照している場合にも表示されます。現在、このツールは同じクエリで定義された列へのエイリアス参照をサポートしています。

コード例

Condition is not binary
入力コード:
 SELECT
    account_id,
    month_id,
    balance,
    ROW_NUMBER() OVER (
        PARTITION BY account_id
        ORDER BY month_id
        RESET WHEN balance IS NOT NULL
        ROWS UNBOUNDED PRECEDING
    ) as balance_increase
FROM account_balance
ORDER BY 1,2;
Copy
生成されたコード
 // SnowConvert AI Helpers Code section is omitted.
SELECT
    account_id,
    month_id,
    balance,
    ROW_NUMBER() OVER (
        PARTITION BY account_id
    !!!RESOLVE EWI!!! /*** SSC-EWI-TD0077 - RESET WHEN CLAUSE IS NOT SUPPORTED IN THIS SCENARIO DUE TO ITS CONDITION ***/!!!
        ORDER BY month_id
        ROWS UNBOUNDED PRECEDING
    ) as balance_increase
FROM
    account_balance
ORDER BY 1,2;
Copy
Condition expression was not found
入力コード:
 SELECT
    account_id,
    month_id,
    balance,
    ROW_NUMBER() OVER (
        PARTITION BY account_id
        ORDER BY month_id
        RESET WHEN balance <= not_found_expresion
    ) as balance_increase
FROM account_balance
ORDER BY 1,2;
Copy
生成されたコード
 // SnowConvert AI Helpers Code section is omitted.
SELECT
    account_id,
    month_id,
    balance,
    ROW_NUMBER() OVER (
        PARTITION BY account_id
    !!!RESOLVE EWI!!! /*** SSC-EWI-TD0077 - RESET WHEN CLAUSE IS NOT SUPPORTED IN THIS SCENARIO DUE TO ITS CONDITION ***/!!!
        ORDER BY month_id
    ) as balance_increase
FROM
    account_balance
ORDER BY 1,2;
Copy

ベストプラクティス

SSC-EWI-TD0079

必要なPeriod型列が見つかりませんでした

注釈

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

重大性

説明

この警告が表示されるのは、Normalize句の機能を複製するために必要なPeriod列が見つからなかったためです。

コード例

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

ベストプラクティス

  • この警告を手動で修正するには、最初のPeriod列がどれであったかを調べ、定義されている場合を除いて参照をすべて削除し、 PeriodColumn を見つかった列で置き換えます。

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

SSC-EWI-TD0082

現在のエンコーディングを使用したTranslate関数はサポートされていません

重大性

説明

現在のエンコーディング引数を使用したTranslate関数の使用は、Snowflakeではサポートされていません。この関数は翻訳中にコメントアウトされます。

コード例

入力コード:
 SELECT Translate('abc' USING KANJISJIS_TO_LATIN);
Copy
生成されたコード
 SELECT
!!!RESOLVE EWI!!! /*** SSC-EWI-TD0082 - TRANSLATE FUNCTION USING KANJISJIS_TO_LATIN ENCODING IS NOT SUPPORTED ***/!!!
Translate('abc' USING KANJISJIS_TO_LATIN);
Copy

ベストプラクティス

SSC-EWI-TD0083

一度に2つ以上の複雑なSelect句を変換できません

注釈

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

重大性

説明

SnowConvert AI は、2つ以上の複雑な SELECT 句を変換することができません。 CTE または複合 FROM 句にマップする必要があるため、マップされたコードはコンパイルできないか、論理サイクルに入りません。

複雑な SELECT 句とは

NORMALIZE 、 EXPAND ON 、 RESET WHEN など、 CTE または複合 FROM 句へのマッピングが必要なもの。

コード例

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

ベストプラクティス

SSC-EWI-TD0087

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

注釈

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

注釈

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

重大性

説明

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

ベストプラクティス

SSC-EWI-TD0091

式がキャストとして変換され、依存関係の欠落によるエラーが発生する可能性があります。

注釈

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

重大性

説明

Teradataスクリプトでは、 CAST 式に次の構文を使用できます。

<expression> ( <DataType> )

Copy

残念ながら、この構文は、 CAST を DATETIME に変換しようとするときに曖昧さが生じます。これらのキーワードは、それぞれ CURRENT_DATECURRENT_TIME 関数としても動作するためです。

したがって、 CAST になる式に関するコンテキストがないと、 CAST の実際のケースを処理しているのか、 DATE や TIME をパラメーターとして受け入れる関数を処理しているのかを区別する確実な方法はありません。

つまり、 <expression> が列なのか、ユーザー定義関数( UDF )なのかを知る必要があります。そのためには、コードを変換する際に、 が依存する CREATE TABLE または CREATE FUNCTION を追加する必要があります。

たとえば、次の SELECT ステートメントを確認します。AMBIGUOUS_EXPR に関するコンテキストがないため、関数の呼び出しなのか、 CAST から DATE に変換しているかのかを判断する方法がありません。しかし、 COL1 は テーブル TAB の列であるため、 COL1 (DATE) は実際には CAST であることがわかっています。

CREATE TABLE TAB (
    COL1 VARCHAR(23)
)

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

Copy

コード例

入力コード:
 CREATE TABLE TAB (
    COL1 VARCHAR(23)
)

SELECT 
    COL1 (DATE),
    AMBIGUOUS_EXPR (DATE)
FROM TAB;
Copy
生成されたコード
 CREATE OR REPLACE TABLE TAB (
    COL1 VARCHAR(23)
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"teradata"}}'
;

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

ベストプラクティス

SSC-EWI-TD0092

Teradataの組み込みテーブル/ビューの翻訳は現在サポートされていません

重大性

説明

この EWI は、 SnowConvert AI が現在翻訳されていないTeradataシステムテーブルを検出した時に追加されます。

コード例

入力コード:
 SELECT
  CRLF || 
  TRIM(em.ErrorText) INTO :MsgText
FROM
  DBC.ErrorMsgs em
WHERE
  em.ErrorCode = SUBSTR(:SqlStateCode, 2, 4)
Copy
生成されたコード
 SELECT
  CRLF ||
  TRIM(em.ErrorText) INTO :MsgText
FROM
  !!!RESOLVE EWI!!! /*** SSC-EWI-TD0092 - TRANSLATION FOR TERADATA BUILT-IN TABLE/VIEW DBC.ErrorMsgs IS NOT CURRENTLY SUPPORTED. ***/!!!
  DBC.ErrorMsgs em
WHERE
  UPPER(RTRIM(
  em.ErrorCode)) = UPPER(RTRIM(SUBSTR(:SqlStateCode, 2, 4)));
Copy

ベストプラクティス

  • Information_SchemaSNOWFLAKE.ACCOUNT_USAGE など、Snowflakeの内部テーブルで同等のものを探します。

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

SSC-EWI-TD0093

形式はサポートされていないため、varcharキャストのすべての使用で更新する必要があります。

重大性

説明

この EWI は、 CAST 関数を使用して数値式を指定された形式を持つ別の数値型にキャストする際に追加されます。形式は数値そのものには影響しませんが、その後に結果を文字列にキャストすると、意図した形式が正しく適用されません。したがって、結果が VARCHAR にキャストされるすべてのインスタンスを更新し、 EWI で定義されている形式が使用されるようにする必要があります。

コード例

入力コード:
SELECT
   CAST(245222.32 AS FORMAT '-(10)9.9(4)') AS FormattedAmount,
   CAST(FormattedAmount AS VARCHAR(30));
Copy
生成されたコード
SELECT
   245222.32 !!!RESOLVE EWI!!! /*** SSC-EWI-TD0093 - FORMAT '-(10)9.9(4)' IS NOT SUPPORTED AND MUST BE UPDATED TO THE FOLLOWING FORMAT 'S9999999999.0000' IN ALL VARCHAR CAST USAGES. ***/!!! AS FormattedAmount,
   LEFT(LTRIM(TO_VARCHAR(FormattedAmount, 'MI0.00000000000000EEEEE')), 10);
Copy

ベストプラクティス

SSC-EWI-TD0094

The IMPORT command was not converted.

重大性

説明

This issue indicates that an .IMPORT command was not converted because it uses unsupported features. The original MLoad layout, DML, and import statements are commented out and each line is annotated with this EWI.

Features pending translation:

  • BINARY format

  • FASTLOAD format

  • .TABLE type layout

  • INMOD option

  • AXSMOD option

  • Non INSERT-VALUES DML statements

Missing required definitions:

  • .LAYOUT definition was not found in the script

  • .DML LABEL was not found in the script

コード例

Teradata:
.LAYOUT employee_layout;
.FIELD employee_id * CHAR(10);
.FIELD first_name * CHAR(50);

.DML LABEL insert_employees;
INSERT INTO employees (employee_id, first_name) VALUES (:employee_id, :first_name);

.IMPORT INFILE employees.dat FORMAT BINARY LAYOUT employee_layout APPLY insert_employees;
Copy
Snowflake Scripting:
CREATE TEMPORARY STAGE IF NOT EXISTS sc_import_stage;

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

EXECUTE IMMEDIATE
$$
  DECLARE
    STATUS_OBJECT OBJECT := OBJECT_CONSTRUCT('SQLCODE', 0);
  BEGIN
    !!!RESOLVE EWI!!! /*** SSC-EWI-TD0094 - THE IMPORT COMMAND WAS NOT CONVERTED: BINARY FORMAT IS PENDING TRANSLATION. ***/!!!
    -- .LAYOUT employee_layout;
    !!!RESOLVE EWI!!! /*** SSC-EWI-TD0094 - THE IMPORT COMMAND WAS NOT CONVERTED: BINARY FORMAT IS PENDING TRANSLATION. ***/!!!
    -- .FIELD employee_id * CHAR(10) ;
    !!!RESOLVE EWI!!! /*** SSC-EWI-TD0094 - THE IMPORT COMMAND WAS NOT CONVERTED: BINARY FORMAT IS PENDING TRANSLATION. ***/!!!
    -- .FIELD first_name * CHAR(50) ;
    !!!RESOLVE EWI!!! /*** SSC-EWI-TD0094 - THE IMPORT COMMAND WAS NOT CONVERTED: BINARY FORMAT IS PENDING TRANSLATION. ***/!!!
    -- .DML LABEL insert_employees ;
    !!!RESOLVE EWI!!! /*** SSC-EWI-TD0094 - THE IMPORT COMMAND WAS NOT CONVERTED: BINARY FORMAT IS PENDING TRANSLATION. ***/!!!
    -- INSERT INTO employees (employee_id, first_name) VALUES (:employee_id, :first_name);
    !!!RESOLVE EWI!!! /*** SSC-EWI-TD0094 - THE IMPORT COMMAND WAS NOT CONVERTED: BINARY FORMAT IS PENDING TRANSLATION. ***/!!!
    -- .IMPORT INFILE employees.dat FORMAT BINARY LAYOUT employee_layout APPLY insert_employees;
  EXCEPTION
    WHEN OTHER CONTINUE THEN
      STATUS_OBJECT := OBJECT_CONSTRUCT('SQLCODE', SQLCODE, 'SQLERRM', SQLERRM, 'SQLSTATE', SQLSTATE);
  END
$$
Copy

ベストプラクティス

  • Convert the source file to a supported format (VARTEXT, TEXT, or UNFORMAT) before running SnowConvert AI.

  • Manually rewrite the load using Snowflake stages and COPY INTO.

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

SSC-EWI-TD0095

DML statement in IMPORT command is pending translation.

重大性

説明

This issue happens when a .IMPORT command uses a DML label that includes statements other than a basic INSERT ... VALUES (for example, UPDATE, DELETE, or more complex INSERT logic). In these cases, the converter will only transform the simple INSERT ... VALUES part into a COPY INTO statement for Snowflake. Any other DML statements are left in the output with a warning annotation, and are not automatically converted. This means that important logic—like updates or deletes—will not be migrated, which can affect your results. Please review and update your script to handle these cases, such as by using a MERGE statement for upserts.

コード例

Teradata:
.LAYOUT employee_layout;
.FIELD employee_id * VARCHAR(10);
.FIELD first_name * VARCHAR(50);
.FIELD salary * VARCHAR(10);

.DML LABEL upsert_employees;
UPDATE employees SET salary = :salary WHERE employee_id = :employee_id;
INSERT INTO employees (employee_id, first_name, salary) VALUES (:employee_id, :first_name, :salary);

.IMPORT INFILE employees.csv FORMAT VARTEXT ',' LAYOUT employee_layout APPLY upsert_employees;
Copy
Snowflake Scripting:
CREATE TEMPORARY STAGE IF NOT EXISTS sc_import_stage;

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

EXECUTE IMMEDIATE
$$
  DECLARE
    STATUS_OBJECT OBJECT := OBJECT_CONSTRUCT('SQLCODE', 0);
  BEGIN
    BEGIN
      !!!RESOLVE EWI!!! /*** SSC-EWI-TD0095 - THE DML 'UPDATE STATEMENT' USED IN THE IMPORT COMMAND IS PENDING TRANSLATION. ***/!!!
      UPDATE employees SET
        salary = :salary WHERE
        employee_id = :employee_id;

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

ベストプラクティス

  • Implement the equivalent upsert logic in Snowflake using MERGE.

  • Load data into a staging table first, then merge into the target table.

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

SSC-EWI-TD0096

COPY INTO requires an explicit target file name.

重大性

説明

When the .IMPORT INFILE path consists solely of a bash variable (e.g., ${FILE_PATH}) and no explicit file name can be inferred, this EWI is raised for the COPY INTO source. The converter cannot determine the file name to use in the stage path.

コード例

Teradata:
.LAYOUT employee_layout;
.FIELD employee_id * VARCHAR(10);
.FIELD first_name * VARCHAR(50);

.DML LABEL insert_employees;
INSERT INTO employees (employee_id, first_name) VALUES (:employee_id, :first_name);

.IMPORT INFILE ${FILE_PATH} FORMAT VARTEXT '|' LAYOUT employee_layout APPLY insert_employees;
Copy
Snowflake Scripting:
--** SSC-FDM-TD0003 - BASH VARIABLES FOUND, USING SNOWSQL WITH VARIABLE SUBSTITUTION ENABLED IS REQUIRED TO RUN THIS SCRIPT **
CREATE TEMPORARY STAGE IF NOT EXISTS sc_import_stage;

--** SSC-FDM-TD0038 - PUT COMMAND REQUIRES EXECUTION THROUGH SNOWSQL. **
PUT file://&{FILE_PATH} @sc_import_stage;

EXECUTE IMMEDIATE
$$
  DECLARE
    STATUS_OBJECT OBJECT := OBJECT_CONSTRUCT('SQLCODE', 0);
  BEGIN
    BEGIN
      COPY INTO employees (
        employee_id,
        first_name
      )
      FROM
      (
        SELECT
          $1,
          $2
        FROM
          !!!RESOLVE EWI!!! /*** SSC-EWI-TD0096 - COPY INTO REQUIRES AN EXPLICIT TARGET FILE NAME. ***/!!!
          @sc_import_stage/&{FILE_PATH}
      )
      FILE_FORMAT = (TYPE = CSV FIELD_DELIMITER = '|')
      ON_ERROR = 'CONTINUE';
    END;
  EXCEPTION
    WHEN OTHER CONTINUE THEN
      STATUS_OBJECT := OBJECT_CONSTRUCT('SQLCODE', SQLCODE, 'SQLERRM', SQLERRM, 'SQLSTATE', SQLSTATE);
  END
$$
Copy

ベストプラクティス

  • Adjust the original MLoad script so that the file name is explicit (separate directory and file name).

  • Use a literal file name with variable directory, e.g., .IMPORT INFILE ${DATA_DIR}/employees.csv ...

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

SSC-EWI-TD0097

Local variables not supported in PUT or COPY INTO.

重大性

説明

This issue indicates the use of local MLoad variables (e.g., &FILE_NAME defined with .SET) in INFILE paths. These cannot be resolved in the generated PUT or COPY INTO statements because Snowflake's PUT command only supports literal paths or SnowSQL session variables (&{VAR}), not Snowflake Scripting variables (:var).

コード例

Teradata:
.SET FILE_NAME TO 'employees.csv';

.LAYOUT employee_layout;
.FIELD employee_id * VARCHAR(10);
.FIELD first_name * VARCHAR(50);

.DML LABEL insert_employees;
INSERT INTO employees (employee_id, first_name) VALUES (:employee_id, :first_name);

.IMPORT INFILE &FILE_NAME FORMAT VARTEXT '|' LAYOUT employee_layout APPLY insert_employees;
Copy
Snowflake Scripting:
CREATE TEMPORARY STAGE IF NOT EXISTS sc_import_stage;

!!!RESOLVE EWI!!! /*** SSC-EWI-TD0097 - LOCAL VARIABLES ARE CURRENTLY NOT SUPPORTED IN THE PUT STATEMENT. ***/!!!
--** SSC-FDM-TD0038 - PUT COMMAND REQUIRES EXECUTION THROUGH SNOWSQL. **
PUT file://&FILE_NAME @sc_import_stage;

EXECUTE IMMEDIATE
$$
  DECLARE
    STATUS_OBJECT OBJECT := OBJECT_CONSTRUCT('SQLCODE', 0);
    FILE_NAME STRING := 'employees.csv';
  BEGIN
    BEGIN
      COPY INTO employees (
        employee_id,
        first_name
      )
      FROM
      (
        SELECT
          $1,
          $2
        FROM
          !!!RESOLVE EWI!!! /*** SSC-EWI-TD0097 - LOCAL VARIABLES ARE CURRENTLY NOT SUPPORTED IN THE COPY INTO STATEMENT. ***/!!!
          @sc_import_stage/&FILE_NAME
      )
      FILE_FORMAT = (TYPE = CSV FIELD_DELIMITER = '|')
      ON_ERROR = 'CONTINUE';
    END;
  EXCEPTION
    WHEN OTHER CONTINUE THEN
      STATUS_OBJECT := OBJECT_CONSTRUCT('SQLCODE', SQLCODE, 'SQLERRM', SQLERRM, 'SQLSTATE', SQLSTATE);
  END
$$
Copy

ベストプラクティス

  • Replace local variables with bash variables (resolved by SnowSQL before execution).

  • Alternatively, hard-code the file name directly.

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