SnowConvert AI :一般的な機能の違い

SSC-FDM-0001

単一テーブルからすべての列を選択するビューは、Snowflakeでは必要ありません

注釈

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

説明

単一テーブルのすべての列のみを選択し、フィルタリング句を持たないビューは、Snowflakeでは必須ではなく、パフォーマンスに影響を与える可能性があります。

コード例

入力コード(Oracle):
 CREATE OR REPLACE VIEW simpleView1
AS
SELECT
*
FROM
simpleTable;

CREATE OR REPLACE VIEW simpleView2
AS
SELECT
*
FROM
simpleTable GROUP BY col1;
Copy
生成されたコード:
 CREATE OR REPLACE VIEW simpleView1
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
AS
--** SSC-FDM-0001 - VIEWS SELECTING ALL COLUMNS FROM A SINGLE TABLE ARE NOT REQUIRED IN SNOWFLAKE AND MAY IMPACT PERFORMANCE. **
SELECT
*
FROM
simpleTable;

CREATE OR REPLACE VIEW simpleView2
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
AS
--** SSC-FDM-0001 - VIEWS SELECTING ALL COLUMNS FROM A SINGLE TABLE ARE NOT REQUIRED IN SNOWFLAKE AND MAY IMPACT PERFORMANCE. **
SELECT
*
FROM
simpleTable
GROUP BY col1;
Copy

ベストプラクティス

SSC-FDM-0002

相関サブクエリには機能的な違いがある可能性があります

説明

このメッセージは、Correlated Subquery (外部クエリの列を参照するサブクエリ)がある場合に報告されます。この型のサブクエリは、場合によっては、Snowflakeでいくつかの機能的な違いを示すことがあります([サブクエリの操作](https://docs.snowflake.com/ja/user-guide/querying-subqueries#correlated-vs-uncorrelated-subqueries))

コード例

入力コード:
 CREATE TABLE schema1.table1(column1 NVARCHAR(50), column2 NVARCHAR(50));
CREATE TABLE schemaA.tableA(columnA NVARCHAR(50), columnB NVARCHAR(50));

--Correlated Subquery
SELECT columnA FROM schemaA.tableA ta WHERE columnA = (SELECT SUM(column1) FROM schema1.table1 t1 WHERE t1.column1 = ta.columnA);
Copy
生成されたコード:
 CREATE OR REPLACE TABLE schema1.table1 (
column1 VARCHAR(50),
column2 VARCHAR(50))
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "transact",  "convertedOn": "10/11/2024",  "domain": "test" }}'
;

CREATE OR REPLACE TABLE schemaA.tableA (
columnA VARCHAR(50),
columnB VARCHAR(50))
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "transact",  "convertedOn": "10/11/2024",  "domain": "test" }}'
;

--Correlated Subquery
SELECT
columnA
FROM
schemaA.tableA ta
WHERE
columnA =
          --** SSC-FDM-0002 - CORRELATED SUBQUERIES MAY HAVE SOME FUNCTIONAL DIFFERENCES. **
          (SELECT
          SUM(column1) FROM
          schema1.table1 t1
          WHERE
          t1.column1 = ta.columnA
          );
Copy

ベストプラクティス

SSC-FDM-0003

変換率の不一致

説明

このメッセージは、指定された評価フィールドで変換率の不整合が見つかった場合に報告されます。このような状況は SnowConvert AI によって自動的に解決されるので、これは単なる情報提供のための警告に過ぎません。

注釈

この情報提供のための警告は、評価文書にのみ表示され、出力コードには表示されません

ベストプラクティス

  • SnowConvert AI は自動的に問題を修正することができますが、[snowconvert-support@snowflake.com](mailto:snowconvert-support@snowflake.com)に電子メールを送り、問題を指定することで、SnowConvert AI サポートチームに通知することができます。

SSC-FDM-0004

外部テーブルを通常のテーブルに変換

説明

この警告は、外部処理に関連する句に追加されます。これは、Snowflakeではデータストレージは関係なく、外部テーブルを必要としないためです。代わりに、すべてのデータはSnowflakeデータストレージ内で管理する必要があります。この件に関する詳しい情報は、[こちら](https://docs.snowflake.com/ja/user-guide/tables-storage-considerations.html#data-storage-considerations)のデータストレージに関するSnowflakeの考慮事項を参照してください。

コード例

入力コード:
 CREATE EXTERNAL TABLE ext_csv_file (
    id INT,
    name TEXT,
    age INT,
    city TEXT
)
LOCATION (
    'gpfdist://192.168.1.100:8080/data/my_data.csv'
)
FORMAT 'CSV' (DELIMITER ',' HEADER);
Copy
生成されたコード:
 --** SSC-FDM-0004 - EXTERNAL TABLE TRANSLATED TO REGULAR TABLE **
CREATE TABLE ext_csv_file (
       id INT,
       name TEXT,
       age INT,
       city TEXT
   )
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "greenplum",  "convertedOn": "07/09/2025",  "domain": "no-domain-provided" }}'
;
Copy

ベストプラクティス

  • 外部テーブルのファイルに保存されているデータを、何らかの方法でSnowflakeデータベースに移動する必要があります。

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

SSC-FDM-0005

時刻データ型でTIME ZONE はサポートされていません

説明

Snowflakeの時刻データ型は、タイムゾーン値を格納しません

TIME は「wallclock」時間を内部的に保存し、 TIME 値に対するすべての操作はタイムゾーンを考慮せずに実行されます。詳細は[こちら](https://docs.snowflake.com/ja/sql-reference/data-types-datetime#time)を参照してください。

コード例

入力コード:
 CREATE TABLE TABLE_TIME_TYPE (
    COLNAME TIME (9) WITH TIME ZONE
);
Copy
生成されたコード:
 CREATE OR REPLACE TABLE TABLE_TIME_TYPE (
    COLNAME TIME(9) /*** SSC-FDM-0005 - TIME ZONE NOT SUPPORTED FOR TIME DATA TYPE ***/
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"teradata"}}'
;
Copy

ベストプラクティス

  • エンドユーザーによる操作は必要ありません。

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

SSC-FDM-0006

数値型の列はSnowflakeでは同様の動作をしない場合があります。

説明

この機能差メッセージは、NUMBER 型列をテーブル内に作成する際に表示されます。この理由は、Snowflakeで中間値のスケールに関連する演算を実行する際の算術的な違いによるもので、一部の演算が失敗する可能性があります。詳細については、[Snowflakeの中間値に関する投稿](https://community.snowflake.com/s/question/0D50Z00008HhSHCSA3/sql-compilation-error-invalid-intermediate-datatype-number7148)および[表現可能な範囲外の数値](https://community.snowflake.com/s/article/Number-out-of-representable-range-error-occurs-during-the-multiplication-of-numeric-values)を参照してください。

このような算術上の問題を避けるために、データサンプリングを実行して、これらの演算に必要な精度とスケールを検証することができます。

コード例

Number列を持つ単純なテーブル

入力コード(Oracle):
 CREATE TABLE table1
(
column1 NUMBER,
column2 NUMBER (20, 4)
);
Copy
生成されたコード:
 CREATE OR REPLACE TABLE table1
(
column1 NUMBER(38, 18) /*** SSC-FDM-0006 - NUMBER TYPE COLUMN MAY NOT BEHAVE SIMILARLY IN SNOWFLAKE. ***/,
column2 NUMBER(20, 4) /*** SSC-FDM-0006 - NUMBER TYPE COLUMN MAY NOT BEHAVE SIMILARLY IN SNOWFLAKE. ***/
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
;
Copy

算術上の問題の例

次の例では、数値列を使用した場合にどのような算術上の問題が発生するかを示しています。

除算エラーのあるSnowflakeコード:
 CREATE OR REPLACE TABLE number_table( column1 NUMBER(38, 19) );

INSERT INTO number_table VALUES (1);

SELECT column1 / column1 FROM number_table;
Copy
乗算エラーのあるSnowflakeコード:
 CREATE OR REPLACE TABLE number_table( column1 NUMBER(38, 20) );

INSERT INTO number_table VALUES (1);

SELECT column1 * column1 FROM number_table;
Copy

どちらかの SELECT ステートメントを実行すると、Snowflakeはエラーを返します。

表現可能な範囲外の数値: FIXEDSB16 {nullable}、値1.0000000000000000000

これは、中間演算の結果がSnowflakeの最大容量をオーバーフローしているためです。各例で数値スケールを1減らすとエラーが修正され、正常に動作します。

除算のあるSnowflakeコード:
 CREATE OR REPLACE TABLE number_table( column1 NUMBER(38, 18) );

INSERT INTO number_table VALUES (1);

SELECT column1 / column1 FROM number_table;
Copy
乗算のあるSnowflakeコード:
 CREATE OR REPLACE TABLE numbertable( column1 NUMBER(38, 19) );

INSERT INTO number_table VALUES (1);

SELECT column1 * column1 FROM number_table;
Copy

このため、SnowConvert AI はNumbersのデフォルトスケールを18に設定し、移行時のエラー数を最小限に抑えます。

ベストプラクティス

  • 操作の中間値が、Snowflakeの最大値である37を超えないことを確認します。

  • データサンプリングを実行し、必要な精度とスケールがあることを確認してから、操作を実行してください。

  • ほとんどの場合、データをサンプリングしたり、事業者と話し合ったりした結果、精度が異なる可能性があるという結論に達するかもしれません。例えば、MONEY 列の場合、一般的な精度は NUMBER(20,4) となります。snowflakeでは、列のデータ型を簡単に変更することはできません。列のデータ型を変更してデータを保持する方法については、こちらの[フォーラムへの投稿](https://www.mobilize.net/blog/how-to-alter-column-datatype-in-snowflake)を参照してください。

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

SSC-FDM-0007

依存関係が欠落している要素

注釈

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

説明

オブジェクトの依存関係がありません。Snow Convert は一部のデータ型を解決できませんでした。また、依存関係がソースコードにない場合、デプロイエラーが発生する可能性もあります。

コード例

入力コード:
 CREATE VIEW VIEW01 AS SELECT * FROM TABLE1;
Copy
生成されたコード:
 --** SSC-FDM-0007 - MISSING DEPENDENT OBJECT "TABLE1" **
CREATE OR REPLACE VIEW VIEW01
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"teradata"}}'
AS
--** SSC-FDM-0001 - VIEWS SELECTING ALL COLUMNS FROM A SINGLE TABLE ARE NOT REQUIRED IN SNOWFLAKE AND MAY IMPACT PERFORMANCE. **
SELECT
* FROM
TABLE1;
Copy

注釈

TABLE1 の定義が欠けていることに注意してください。

ベストプラクティス

  • オブジェクトの依存関係がすべてソースコードにあることを確認します。

  • そうでない場合は、コード内のオブジェクトへの参照を見つけ、操作が適切に管理されているかどうかを確認します。

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

SSC-FDM-0008

オンコミットはサポートされていません

注釈

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

説明

CREATE TABLE ステートメントのON COMMIT 句はコメントアウトされています。Snowflakeは ON COMMIT 句をサポートしていません。これは、他のSQL 方言で一時テーブルに使用されるのが一般的だからです。トランザクション固有の動作を管理する必要がある場合は、代わりにSnowflakeのトランザクションまたは明示的なTRUNCATE 、DROP ステートメントを使用した一時テーブルの使用を検討してください。

コード例

入力コード
CREATE TEMPORARY TABLE TABLE02 (COLNAME VARCHAR(20)) ON COMMIT DELETE ROWS
Copy
生成されたコード
CREATE OR REPLACE TEMPORARY TABLE TABLE02 (
COLNAME VARCHAR(20))
----** SSC-FDM-0008 - ON COMMIT (DELETE ROWS) IS NOT SUPPORTED **
--ON COMMIT DELETE ROWS
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "teradata",  "convertedOn": "09/22/2025",  "domain": "no-domain-provided" }}'
;
Copy

SSC-FDM-0009

GLOBAL TEMPORARY TABLE 機能はサポートされていません。

説明

グローバル一時テーブルは、[Snowflakeのドキュメント](https://docs.snowflake.com/ja/sql-reference/sql/create-table#variant-syntax)に示されているように、いくつかのバリエーションがあるため、複雑なパターンと考えられています。

コード例

入力コード
 CREATE OR REPLACE GLOBAL TEMPORARY TABLE GLOBAL_TEMP_TABLE
(
    col3 INTEGER,
    col4 VARCHAR(50)
);
Copy
生成されたコード
 --** SSC-FDM-0009 - GLOBAL TEMPORARY TABLE FUNCTIONALITY NOT SUPPORTED. **
CREATE OR REPLACE TABLE GLOBAL_TEMP_TABLE
    (
        col3 INTEGER,
        col4 VARCHAR(50)
    )
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
;
Copy

ベストプラクティス

SSC-FDM-0010

型を日付に変更します。

説明

このメッセージは、SnowConvert AI が DEFAULT SYSDATE を見つけ、データ型が NOT DATE または TIMESTAMP の場合に表示されます。この場合、データ型は DATE に変更されます。

コード例

入力コード
 CREATE TABLE "SYSDATE_DEFAULT_TEST_TABLE_1"( 
 "COLUMN1" VARCHAR2(30 BYTE) DEFAULT SYSDATE
);
Copy
生成されたコード
 CREATE OR REPLACE TABLE "SYSDATE_DEFAULT_TEST_TABLE_1" (
  "COLUMN1" TIMESTAMP DEFAULT CURRENT_TIMESTAMP() /*** SSC-FDM-0010 - CONVERTED FROM VARCHAR2 TO DATE FOR CURRENT_DATE DEFAULT ***/
 )
 COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
 ;
Copy

ベストプラクティス

SSC-FDM-0011

列名はSnowflake予約キーワードです。

注釈

このFDM は非推奨です。[SSC-EWI-0045](../conversion-issues/generalEWI.md#ssc-ewi-0045)のドキュメントを参照してください。

説明

ソース言語では有効だが、Snowflakeでは予約キーワードとなる列名。

コード例

入力コード(Oracle):
 CREATE TABLE T1
(
    LOCALTIME VARCHAR,
    CURRENT_USER VARCHAR
);
Copy
生成されたコード:
 CREATE OR REPLACE TABLE T1
    (
    --** SSC-FDM-0011 - COLUMN NAME 'LOCALTIME' IS A SNOWFLAKE RESERVED KEYWORD **
    "LOCALTIME" VARCHAR,
    --** SSC-FDM-0011 - COLUMN NAME 'CURRENT_USER' IS A SNOWFLAKE RESERVED KEYWORD **
    "CURRENT_USER" VARCHAR
    )
    COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
    ;
Copy

ベストプラクティス

  • Snowflakeでサポートされていない名前を使用している列名の変更を検討してください。

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

SSC-FDM-0012

一部の制約の制約名がサポートされていません。

説明

このメッセージは、制約の型がNull、Not Null、またはdefaultであり、名前で定義されている場合に追加されます。Snowflakeはこれらの制約の名前をサポートしていません。そのため、SnowConvert AI はそれを削除してコメントを追加します。

コード例

入力コード
 CREATE TABLE TABLE1 ( 
COL1 VARCHAR (10) CONSTRAINT constraintName DEFAULT ('0') NOT NULL 
);
Copy
生成されたコード
 CREATE OR REPLACE TABLE TABLE1 (
COL1 VARCHAR(10) DEFAULT ('0') /*** SSC-FDM-0012 - CONSTRAINT NAME 'constraintName' IN DEFAULT EXPRESSION CONSTRAINT IS NOT SUPPORTED IN SNOWFLAKE ***/ NOT NULL
)
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "transact",  "convertedOn": "07/02/2025",  "domain": "no-domain-provided" }}'
;
Copy

ベストプラクティス

  • エンドユーザーによる操作は必要ありません。

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

SSC-FDM-0013

タイムゾーン式がマッピングできませんでした

説明

この FMD メッセージは、タイムゾーン式の実際の値を特定できず、したがって変換結果が異なる可能性があるシナリオを示すために追加されます。使用されるタイムゾーン値がリテラル文字列である場合、SnowConvert AI は、それを受け取り、Snowflakeの対応するタイムゾーン値にマッピングすることができます。しかし、この値が式で指定されている場合、SnowConvert AI は実行時に使用されるタイムゾーン値を取得できないため、この値を対応するSnowflakeの同等の値にマッピングすることができません。

コード例

入力コード(Oracle)
 SELECT TIMESTAMP '1998-12-25 09:26:50.12' AT TIME ZONE SESSIONTIMEZONE FROM DUAL;
SELECT TIMESTAMP '1998-12-25 09:26:50.12' AT TIME ZONE Expression FROM DUAL;
Copy
生成されたコード
 SELECT
--** SSC-FDM-0013 - TIMEZONE EXPRESSION COULD NOT BE MAPPED, RESULTS MAY BE DIFFERENT **
TO_TIMESTAMP_LTZ( TIMESTAMP '1998-12-25 09:26:50.12')
FROM DUAL;

SELECT
--** SSC-FDM-0013 - TIMEZONE EXPRESSION COULD NOT BE MAPPED, RESULTS MAY BE DIFFERENT **
CONVERT_TIMEZONE(Expression, TIMESTAMP '1998-12-25 09:26:50.12')
FROM DUAL;
Copy
入力コード(Teradata)
 select TIMESTAMP '1998-12-25 09:26:50.12' AT TIME ZONE SESSIONTIMEZONE;
select current_timestamp at time zone CONCAT(' America ', ' Pacific'); 
select current_timestamp at time zone (SELECT COL1 FROM TABLE1 WHERE COL2 = 2);
Copy
生成されたコード
 SELECT
CONVERT_TIMEZONE(SESSIONTIMEZONE, TIMESTAMP '1998-12-25 09:26:50.12') /*** SSC-FDM-0013 - TIMEZONE EXPRESSION COULD NOT BE MAPPED, RESULTS MAY BE DIFFERENT ***/;

SELECT
CONVERT_TIMEZONE(CONCAT(' America ', ' Pacific'), CURRENT_TIMESTAMP) /*** SSC-FDM-0013 - TIMEZONE EXPRESSION COULD NOT BE MAPPED, RESULTS MAY BE DIFFERENT ***/;

SELECT
CONVERT_TIMEZONE((
SELECT
COL1 FROM
TABLE1
WHERE COL2 = 2), CURRENT_TIMESTAMP) /*** SSC-FDM-0013 - TIMEZONE EXPRESSION COULD NOT BE MAPPED, RESULTS MAY BE DIFFERENT ***/;
Copy

注釈

Oracleにおけるタイムゾーンの互換性

Oracleのタイムゾーン名式の大部分はSnowflakeで直接サポートされており、この場合、移行は問題なく実行されます。さらに、現時点ではSnowflakeでサポートされていないため、機能差のメッセージが表示されるもののリストを以下に示します。

  • アフリカ/ドゥアラ

  • アジア/ウランバートル

  • アジア/エカテリンブルグ

  • カナダ/東サスカチュワン州

  • CST

  • PST

  • US /パシフィックニュー

ベストプラクティス

  • エンドユーザーによる操作は必要ありません。

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

SSC-FDM-0014

チェックステートメントはサポートされていません。

注釈

このFDM は非推奨です。[SSC-EWI-0035](../conversion-issues/generalEWI.md#ssc-ewi-0035)のドキュメントを参照してください。

説明

CHECK 制約はSnowflakeではサポートされていませんが、機能的には影響ありません。

コード例

入力コードOracle:
 CREATE TABLE "Schema"."BaseTable"(
  "COLUMN1" VARCHAR2(255),
  CHECK ( COLUMN1 IS NOT NULL )
);
Copy
生成コード:
 CREATE OR REPLACE TABLE "Schema"."BaseTable" (
    "COLUMN1" VARCHAR(255)
--                          ,
--    --** SSC-FDM-0014 - CHECK STATEMENT NOT SUPPORTED **
--    CHECK ( COLUMN1 IS NOT NULL )
  )
  COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"oracle"}}'
  ;
Copy
入力コードTeradata:
 CREATE TABLE TABLE1,
    NO FALLBACK,
    NO BEFORE JOURNAL,
    NO AFTER JOURNAL
(
    COL0 BYTEINT,
    CONSTRAINT constraint_name CHECK (COL1 < COL2)
)
Copy
生成コード:
 CREATE TABLE TABLE1
(
    COL0 BYTEINT
--                ,
--    --** SSC-FDM-0014 - CHECK STATEMENT NOT SUPPORTED **
--    CONSTRAINT constraint_name CHECK (COL1 < COL2)
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"teradata"}}'
;
Copy
入力コード SqlServer
 ALTER TABLE table_name2
ADD column_name VARCHAR(255)
CONSTRAINT constraint_name 
CHECK NOT FOR REPLICATION (column_name > 1);
Copy
生成されたコード:
 ALTER TABLE IF EXISTS table_name2
ADD column_name VARCHAR(255)
----** SSC-FDM-0014 - CHECK STATEMENT NOT SUPPORTED **
--CONSTRAINT constraint_name
--CHECK NOT FOR REPLICATION (column_name > 1)
                                           ;
Copy

ベストプラクティス

SSC-FDM-0015

​クエリで参照されているカスタム型が見つかりません。

説明

このエラーは、カスタム型の定義が見つからなかったか、Oracleの組み込みデータ型が SnowConvert で認識されなかった場合に発生します。

コード例

入力コード(Oracle):
 --Type was never defined
--CREATE TYPE type1;

CREATE TABLE table1
(
column1 type1
);
Copy
生成されたコード:
 --Type was never defined
--CREATE TYPE type1;

CREATE OR REPLACE TABLE table1
(
column1 VARIANT !!!RESOLVE EWI!!! /*** SSC-EWI-TS0015 - DATA TYPE TYPE1 IS NOT SUPPORTED IN SNOWFLAKE ***/!!! NOT NULL
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"transact"}}}'
;
Copy

ベストプラクティス

  • 参照されたデータ型が入力コードで定義されていることを確認します。

  • Snowflakeのデータ型の[ドキュメント](https://docs.snowflake.com/ja/sql-reference/data-types.html)で、同等のデータ型をご確認ください。

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

SSC-FDM-0016

定数はSnowflakeスクリプトではサポートされていません。変数に変換されました。

説明

Snowflakeスクリプトは定数をサポートしていません。 したがって、Snowflake スクリプトフラグが有効な場合、プロシージャー内の定数はすべて変数に変換されます。

コード例

Oracle:
 CREATE OR REPLACE PROCEDURE p_constants
AS
my_const1 CONSTANT NUMBER := 40;
my_const2 CONSTANT NUMBER NOT NULL := 40;
BEGIN
NULL;
END;
Copy
Snowflakeスクリプト:
 CREATE OR REPLACE PROCEDURE p_constants ()
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"oracle"}}'
EXECUTE AS CALLER
AS
$$
DECLARE
--** SSC-FDM-0016 - CONSTANTS ARE NOT SUPPORTED BY SNOWFLAKE SCRIPTING. IT WAS TRANSFORMED TO A VARIABLE **
my_const1 NUMBER(38, 18) := 40;
--** SSC-FDM-0016 - CONSTANTS ARE NOT SUPPORTED BY SNOWFLAKE SCRIPTING. IT WAS TRANSFORMED TO A VARIABLE **
--** SSC-FDM-OR0025 - NOT NULL CONSTRAINT IS NOT SUPPORTED BY SNOWFLAKE **
my_const2 NUMBER(38, 18) := 40;
BEGIN
NULL;
END;
$$;
Copy

ベストプラクティス

  • エンドユーザーの操作は必要ありません。

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

SSC-FDM-0017

WITH SYSTEM VERSIONING 句はSnowflakeではサポートされていません

説明

ANSI SQL のWITH SYSTEM VERSIONING 句は、テーブルのシステムバージョニングを有効にするために使用され、テーブルのデータに対する変更の履歴を保持することができます。この句はSnowflakeではサポートされていません。

コード例

入力コード:
 CREATE TABLE t1 (
    ID INT PRIMARY KEY,
    Name VARCHAR(50),
    SysStartTime TIMESTAMP,
    SysEndTime TIMESTAMP
) WITH SYSTEM VERSIONING;
Copy
生成されたコード:
 CREATE TABLE t1 (
    ID INT PRIMARY KEY,
    Name VARCHAR(50),
    SysStartTime TIMESTAMP,
    SysEndTime TIMESTAMP
)
----** SSC-FDM-0017 - WITH SYSTEM VERSIONING CLAUSE IS NOT SUPPORTED BY SNOWFLAKE. **
--WITH SYSTEM VERSIONING
                      ;
Copy

ベストプラクティス

  • Snowflakeでは[Time Travel](https://docs.snowflake.com/ja/user-guide/data-time-travel)を使用することができます。Time Travelを使用すると、定義された期間内の任意の時点で履歴データ(変更または削除されたデータなど)にアクセスすることができます。Time Travelは、次のタスクを実行するための強力なツールとして機能します。

    • 誤ってまたは意図的に削除された可能性のあるデータ関連オブジェクト(テーブル、スキーマ、およびデータベース)の復元。

    • 過去の重要なポイントからのデータの複製とバックアップ。

    • 指定された期間のデータ使用量/操作の分析。

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

SSC-FDM-0018

CHARACTER SET 句はSnowflakeではサポートされていません。

説明

列オプション CHARACTER SET は、列に格納できる文字の許容セットを決定します。この句はSnowflakeではサポートされていません。

コード例

入力コード:
 CREATE TABLE TABLE01(
    COLNAME VARCHAR(20) CHARACTER SET character_specification
);
Copy
生成されたコード:
 CREATE TABLE TABLE01 (
    COLNAME VARCHAR(20)
--                        --** SSC-FDM-0018 - CHARACTER SET CLAUSE IS NOT SUPPORTED BY SNOWFLAKE. **
--                        CHARACTER SET character_specification
);
Copy

ベストプラクティス

SSC-FDM-0019

セマティック情報をロードできませんでした。

説明

この警告は、SnowConvert AI が特定のオブジェクトのセマンティック情報をロードできなかったことをユーザーに知らせます。これは、同じ名前のオブジェクトが重複している場合、SnowConvert AI がこのオブジェクトのセマンティック情報をロードできず、分析を完了できないために発生すると考えられます。

コード例

入力コード:
 CREATE TABLE T1
(
    COL1 INTEGER
);


CREATE TABLE T1
(
    COL2 INTEGER
);
Copy
生成コード:
 CREATE OR REPLACE TABLE T1
(
    COL1 INTEGER
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"teradata"}}'
;

--** SSC-FDM-0019 - SEMANTIC INFORMATION COULD NOT BE LOADED FOR T1. CHECK IF THE NAME IS INVALID OR DUPLICATED. **
CREATE TABLE T1
(
    COL2 INTEGER
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"teradata"}}'
;
Copy

ベストプラクティス

  • セマンティック情報の読み込みに影響を与える可能性があるため、入力コードに重複したオブジェクトがないか確認します。

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

SSC-FDM-0020

複数の結果セットが仮テーブルに返されます

説明

Snowflakeスクリプトプロシージャでは、1つのプロシージャにつき1つの結果セットしか返すことができません。

Teradataの動作を再現するために、返す結果セットが2つ以上ある場合、それらは仮テーブルに格納されます。Snowflakeスクリプトプロシージャは、仮テーブルの名前を含む配列を返します。

コード例

入力コード(Teradata):
 REPLACE MACRO sampleMacro AS 
(
    SELECT CURRENT_DATE AS DT;
    SELECT CURRENT_DATE AS DT_TWO;
);
Copy
生成されたコード:
 CREATE OR REPLACE PROCEDURE sampleMacro ()
RETURNS ARRAY
LANGUAGE SQL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"teradata"}}'
EXECUTE AS CALLER
AS
$$
    DECLARE
        return_arr ARRAY := array_construct();
        tbl_nm VARCHAR;
    BEGIN
        tbl_nm := 'RESULTSET_' || REPLACE(UPPER(UUID_STRING()), '-', '_');
        CREATE OR REPLACE TEMPORARY TABLE IDENTIFIER(:tbl_nm) AS
            SELECT
                CURRENT_DATE() AS DT;
        return_arr := array_append(return_arr, :tbl_nm);
        tbl_nm := 'RESULTSET_' || REPLACE(UPPER(UUID_STRING()), '-', '_');
        CREATE OR REPLACE TEMPORARY TABLE IDENTIFIER(:tbl_nm) AS
            SELECT
                CURRENT_DATE() AS DT_TWO;
        return_arr := array_append(return_arr, :tbl_nm);
        --** SSC-FDM-0020 - MULTIPLE RESULT SETS ARE RETURNED IN TEMPORARY TABLES **
        RETURN return_arr;
    END;
$$;
Copy

ベストプラクティス

  • 結果セットを取得するには、プロシージャが返した仮テーブルの名前でSELECT クエリを実行する必要があります。

  • 複数の結果セットを返すようなプロシージャは可能な限り避け、より直接的な結果を得るために単一の責任を持つプロシージャにします。

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

SSC-FDM-0021

インデックス作成はサポートされていません

説明

アーキテクチャ上の理由により、Snowflakeはインデックスをサポートしていないため、SnowConvert AI はインデックスの作成に関連するすべてのコードをコメントアウトします。Snowflakeは、各テーブルに、 DML 操作のパフォーマンスを高速化するマイクロパーティションを自動的に作成します。ユーザーはこれらのマイクロパーティションの作成や管理を心配する必要はありません。

通常、これだけで非常に優れたクエリパフォーマンスが得られますが、データクラスタリングキーを作成することで改善する方法もあります。[Snowflakeの公式ページ](https://docs.snowflake.com/ja/user-guide/tables-clustering-micropartitions.html)には、マイクロパーティションとデータクラスタリングに関する詳細な情報が掲載されています。

コード例

入力コード(Oracle):
 CREATE INDEX index1
ON table1(column1);
Copy
生成されたコード:
 ----** SSC-FDM-0021 - CREATE INDEX IS NOT SUPPORTED BY SNOWFLAKE **
----** SSC-FDM-0007 - MISSING DEPENDENT OBJECT "table1" **
--CREATE INDEX index1
--ON table1(column1)
                  ;
Copy

ベストプラクティス

  • データクラスタリングは、テーブルのクエリパフォーマンスを高速化する方法の1つです。

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

SSC-FDM-0022

ウィンドウフレームユニットが行に変更されました

重大性

説明

この警告は、サポートされていないウィンドウフレームユニットが行に変更され、出力に差異が生じた場合に追加されます。その一例として、GROUPS ユニットはSnowflakeではサポートされていません。

このメッセージは、RANGE ユニットのように、ウィンドウフレームユニットが 部分的に サポートされておらず、変更される場合にも使用されることに注意してください。

コード例

以下のデータを例に挙げて説明します。

C_NAME

C_BIRTH_DAY

USA

1

USA

4

ポーランド

9

カナダ

10

USA

5

カナダ

12

コスタリカ

3

ポーランド

4

USA

2

コスタリカ

7

コスタリカ

10

Oracle:
コード
SELECT
    C_NAME,
    SUM(C_BIRTH_DAY)
    OVER (ORDER BY C_BIRTH_DAY
    RANGE BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING) AS MAX1
FROM WINDOW_TABLE;
結果

C_NAME

MAX1

USA

-

USA

1

コスタリカ

3

USA

6

ポーランド

6

USA

14

コスタリカ

19

ポーランド

26

カナダ

35

コスタリカ

35

カナダ

55

Snowflake:
コード
 SELECT
    C_NAME,
    SUM(C_BIRTH_DAY)
    OVER (ORDER BY C_BIRTH_DAY ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING /*** SSC-FDM-0022 - WINDOW FRAME UNIT 'RANGE' WAS CHANGED TO ROWS ***/) AS MAX1
    FROM
WINDOW_TABLE;
Copy
結果

C_NAME

MAX1

USA

-

USA

1

コスタリカ

3

USA

6

ポーランド

10

USA

14

コスタリカ

19

ポーランド

26

カナダ

35

コスタリカ

45

カナダ

55

ベストプラクティス

  • Snowflakeで実行する場合、決定論的な出力を保証するために、行の決定論的な順序を保証してください。

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

SSC-FDM-0023

グローバル仮テーブルが参照されています。

重大性

説明

SnowConvert AI はグローバル仮テーブルを通常のテーブル作成に変換します。これらのテーブルへの参照は、予想とは異なる動作をする可能性があります。

コード例

入力
 create global temporary table t1 
    (col1 varchar); 
create view view1 as 
    select col1 from t1;
Copy
出力
 --** SSC-FDM-0009 - GLOBAL TEMPORARY TABLE FUNCTIONALITY NOT SUPPORTED. **
CREATE OR REPLACE TABLE t1
    (col1 varchar)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"oracle"}}'
;

CREATE OR REPLACE VIEW view1
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"oracle"}}'
AS
select col1 from
    --** SSC-FDM-0023 - A Global Temporary Table is being referenced **
    t1;
Copy

ベストプラクティス

SSC-FDM-0024

機能は現在、Snowflakeスクリプトではサポートされていません

注釈

このFDM は非推奨です。[SSC-EWI-0058](../conversion-issues/generalEWI.md#ssc-ewi-0058)のドキュメントを参照してください。

説明

このエラーは、作成プロシージャで使用されるステートメントが現在Snowflakeスクリプトでサポートされていない場合に発生します。

コード例

入力コード(Oracle):
 CREATE OR REPLACE PROCEDURE PROC01
IS
  number_variable INTEGER;
BEGIN
  EXECUTE IMMEDIATE 'SELECT 1 FROM DUAL' INTO number_variable;
END;
Copy
生成されたコード:
 CREATE OR REPLACE PROCEDURE PROC01 ()
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
EXECUTE AS CALLER
AS
$$
  DECLARE
    number_variable INTEGER;
  BEGIN
    EXECUTE IMMEDIATE 'SELECT 1 FROM DUAL'
--                                           --** SSC-FDM-0024 - FUNCTIONALITY FOR 'EXECUTE IMMEDIATE RETURNING CLAUSE' IS NOT CURRENTLY SUPPORTED BY SNOWFLAKE SCRIPTING **
--                                           INTO number_variable
                                                               ;
  END;
$$;
Copy

ベストプラクティス

  • エンドユーザーの操作は必要ありません。

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

SSC-FDM-0026

Snowflakeがサポートしていない型

注釈

このFDM は非推奨です。[SSC-EWI-0028](../conversion-issues/generalEWI.md#ssc-ewi-0028)のドキュメントを参照してください。

説明

このメッセージは、型がSnowflakeでサポートされていない場合に表示されます。

入力コード(Oracle):
 CREATE TABLE MYTABLE
(
    COL1 SYS.ANYDATASET
);
Copy
生成されたコード:
 CREATE OR REPLACE TABLE MYTABLE
    (
    --** SSC-FDM-0026 - TYPE NOT SUPPORTED BY SNOWFLAKE **
        COL1 SYS.ANYDATASET
    )
    COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"oracle"}}'
    ;
Copy

ベストプラクティス

SSC-FDM-0027

次のステートメントは SnowFlake では適用されないため、削除しました。

注釈

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

説明

このメッセージは、特定のステートメントがSnowflakeで適用されない場合に表示されます。これは、このステートメントに相当するSnowflakeが存在せず、そのステートメントが不要になったことを意味し、そのためソースコードから削除されます。しかし、SnowConvert AI は最後のコメントの一部として元のステートメントを残しています。

コード例

入力コード:
 .LOGTABLE tduser.Employee_log;  
   .BEGIN MLOAD TABLES Employee_Stg;  
      .LAYOUT Employee;  
      .FIELD in_EmployeeNo * VARCHAR(10);  
      .FIELD in_FirstName * VARCHAR(30); 
      .FIELD in_LastName * VARCHAR(30);  
      .FIELD in_BirthDate * VARCHAR(10); 
      .FIELD in_JoinedDate * VARCHAR(10);  
      .FIELD in_DepartmentNo * VARCHAR(02);

      .dml label EmpLabel
  IGNORE DUPLICATE INSERT ROWS; 
      INSERT INTO Employee_Stg (
         EmployeeNo,
         FirstName,
         LastName,
         BirthDate,
         JoinedDate,
         DepartmentNo
      )  
      VALUES (
         :in_EmployeeNo,
         :in_FirstName,
         :in_Lastname,
         :in_BirthDate,
         :in_JoinedDate,
         :in_DepartmentNo
      );
      .IMPORT INFILE employee.txt  
      FORMAT VARTEXT ','
      LAYOUT Employee
      APPLY EmpLabel;  
   .END MLOAD;  
LOGOFF;
Copy
生成コード:
 #*** Generated code is based on the SnowConvert AI Python Helpers version 2.0.6 ***
// SnowConvert AI Helpers Code section is omitted.
 
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-FDM-0027 - REMOVED NEXT STATEMENT, NOT APPLICABLE IN SNOWFLAKE.  **
  #.LOGTABLE tduser.Employee_log
   
  #** SSC-FDM-0027 - REMOVED NEXT STATEMENT, NOT APPLICABLE IN SNOWFLAKE.  **
  #.BEGIN MLOAD TABLES Employee_Stg
   
  Employee_TableName = "Employee_TEMP_TABLE"
  Employee_Columns = """in_EmployeeNo VARCHAR(10), 
in_FirstName VARCHAR(30), 
in_LastName VARCHAR(30), 
in_BirthDate VARCHAR(10), 
in_JoinedDate VARCHAR(10), 
in_DepartmentNo VARCHAR(02)"""
  Employee_Conditions = """in_EmployeeNo AS in_EmployeeNo, in_FirstName AS in_FirstName, in_LastName AS in_LastName, in_BirthDate AS in_BirthDate, in_JoinedDate AS in_JoinedDate, in_DepartmentNo AS in_DepartmentNo"""
  def EmpLabel(tempTableName, queryConditions = ""):
    exec(f"""INSERT INTO Employee_Stg (EmployeeNo, FirstName, LastName, BirthDate, JoinedDate, DepartmentNo)
SELECT
   SRC.in_EmployeeNo,
   SRC.in_FirstName,
   :in_Lastname,
   SRC.in_BirthDate,
   SRC.in_JoinedDate,
   SRC.in_DepartmentNo
FROM {tempTableName} SRC {queryConditions}""")
  #** SSC-FDM-0027 - REMOVED NEXT STATEMENT, NOT APPLICABLE IN SNOWFLAKE. TRANSLATED BELOW **
  #.IMPORT INFILE employee.txt FORMAT VARTEXT ',' LAYOUT Employee APPLY EmpLabel
   
  snowconvert.helpers.import_file_to_temptable(fr"employee.txt", Employee_TableName, Employee_Columns, Employee_Conditions, ',')
  EmpLabel(Employee_TableName)
  exec(f"""DROP TABLE {Employee_TableName}""")

  if con is not None:
    con.close()
    con = None
  snowconvert.helpers.quit_application()

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

ベストプラクティス

SSC-FDM-0028

サポート対象外です。

注釈

このFDM は非推奨です。[SSC-EWI-0021](../conversion-issues/generalEWI.md#ssc-ewi-0021)ドキュメントを参照してください。

説明

このメッセージは、ソースコードの特定のノードまたはステートメントがSnowflakeサポートされていない場合に表示されます。

コード例

入力コード:
 WITH my_av ANALYTIC VIEW AS
(USING sales_av HIERARCHIES(time_hier) ADD MEASURES(lag_sales AS (LAG(sales) OVER (HIERARCHY time_hier OFFSET 1 )))) 
SELECT aValue from my_av;
Copy
生成されたコード:
 ----** SSC-FDM-0028 - SubavFactoring NOT SUPPORTED IN SNOWFLAKE **
--WITH my_av ANALYTIC VIEW AS
--(USING sales_av HIERARCHIES(time_hier) ADD MEASURES(lag_sales AS (LAG(sales) OVER (HIERARCHY time_hier OFFSET 1 ))))
--SELECT aValue from my_av
                        ;
Copy

ベストプラクティス

  • このエラーが発生するのは、変換されるノードに相当するSnowflakeが存在しないためです。

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

SSC-FDM-0029

ユーザー定義関数がSnowflakeプロシージャに変換されました。

警告

このEWI は非推奨です。[SSC-EWI-0068](../conversion-issues/generalEWI.md#ssc-ewi-0068)ドキュメントを参照してください

重大性

説明

Snowflakeユーザー定義関数は、Oracle や SQL サーバーと同じ機能をサポートしていません。機能の等価性を維持するために、関数はSnowflakeストアドプロシージャに変換されます。これはクエリでの使用にも影響します。

コード例

SQL Server:
入力コード
 CREATE OR ALTER FUNCTION PURCHASING.FOO()
RETURNS INT
AS
BEGIN
    DECLARE @i int = 0, @p int;
    Select @p = COUNT(*) FROM PURCHASING.VENDOR
    
    WHILE (@p < 1000)
    BEGIN
        SET @i = @i + 1
        SET @p = @p + @i
    END
        
    IF (@i = 6)
        RETURN 1
    
    RETURN @p
END;
Copy
生成されたコード
 --** SSC-FDM-0029 - USER DEFINED FUNCTION WAS TRANSFORMED TO SNOWFLAKE PROCEDURE **
CREATE OR REPLACE PROCEDURE PURCHASING.FOO ()
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"transact"}}'
EXECUTE AS CALLER
AS
$$
    DECLARE
        I INT := 0;
        P INT;
    BEGIN
         
        Select
            COUNT(*)
        INTO
            :P
 FROM
            PURCHASING.VENDOR;
        WHILE (:P < 1000) LOOP
            I := :I + 1;
            P := :P + :I;
        END LOOP;
        IF ((:I = 6)) THEN
            RETURN 1;
        END IF;
        RETURN :P;
    END;
$$;
Copy
Oracle:
入力コード
 CREATE FUNCTION employee_function (param1 in NUMBER) RETURN NUMBER is
  var1    employees.employee_ID%TYPE;
  var2    employees.manager_ID%TYPE;
  var3    employees.title%TYPE;
BEGIN
  SELECT employee_ID, manager_ID, title
  INTO var1, var2, var3
  FROM employees
    START WITH manager_ID = param1
    CONNECT BY manager_ID = PRIOR employee_id;
  RETURN var1;
EXCEPTION
   WHEN no_data_found THEN RETURN param1;
END employee_function;
Copy
生成されたコード
 --** SSC-FDM-0029 - USER DEFINED FUNCTION WAS TRANSFORMED TO SNOWFLAKE PROCEDURE **
CREATE OR REPLACE PROCEDURE employee_function (param1 NUMBER(38, 18))
RETURNS NUMBER(38, 18)
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "oracle",  "convertedOn": "11/14/2024",  "domain": "test" }}'
EXECUTE AS CALLER
AS
$$
  DECLARE
    var1    employees.employee_ID%TYPE;
    var2    employees.manager_ID%TYPE;
    var3    employees.title%TYPE;
  BEGIN
    SELECT employee_ID, manager_ID, title
    INTO
      :var1,
      :var2,
      :var3
    FROM
      employees
      START WITH manager_ID = :param1
    CONNECT BY
      manager_ID = PRIOR employee_id;
    RETURN :var1;
  EXCEPTION
     WHEN no_data_found THEN
      RETURN :param1;
  END;
$$;
Copy

ベストプラクティス

  • 同じロジックを維持するために、内部のクエリを分離します。

  • ソースコードは、Snowflakeユーザー定義関数[アプローチ](https://docs.snowflake.com/ja/sql-reference/user-defined-functions.html#udfs-user-defined-functions)に適合するように再構築する必要がある場合があります。

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

SSC-FDM-0030

新しい識別子の無効な文字を置き換えました

説明

指定された識別子は、出力言語に対して無効な文字を持っています。これらの文字は、UTF -8コードに置き換えられました。

コード例

入力コード(Oracle):
 CREATE PROCEDURE PROC1
AS
    "VAR0" INT;
    "VAR`/1ͷ" VARCHAR(20);
    "o*/o" FLOAT;
    " . " INT;
    ". ." INT;
    "123Name" INT;
    "return" INT;
    yield INT;
    ident#10 INT;
BEGIN
    NULL;
END;
Copy
生成されたコード:
 CREATE OR REPLACE PROCEDURE PROC1 ()
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"oracle"}}'
EXECUTE AS CALLER
AS
$$
    DECLARE
        "VAR0" INT;
        --** SSC-FDM-0030 - IDENTIFIER '"VAR`/1ͷ"' HAS INVALID CHARACTERS. CHARACTERS WERE REPLACED WITH THEIR UTF-8 CODES **
        VAR_u60_u2F1_uCD_B7 VARCHAR(20);
        --** SSC-FDM-0030 - IDENTIFIER '"o*/o"' HAS INVALID CHARACTERS. CHARACTERS WERE REPLACED WITH THEIR UTF-8 CODES **
        o_u2A_u2Fo FLOAT;
        --** SSC-FDM-0030 - IDENTIFIER '" . "' HAS INVALID CHARACTERS. CHARACTERS WERE REPLACED WITH THEIR UTF-8 CODES **
        _u20_u2E_u20 INT;
        --** SSC-FDM-0030 - IDENTIFIER '". ."' HAS INVALID CHARACTERS. CHARACTERS WERE REPLACED WITH THEIR UTF-8 CODES **
        _u2E_u20_u2E INT;
        "123Name" INT;
        "return" INT;
        yield INT;
        IDENT_HASHTAG_10 INT;
    BEGIN
        NULL;
    END;
$$;
Copy

ベストプラクティス

  • エンドユーザーの操作は必要ありません。

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

SSC-FDM-0031

デフォルトで設定されている動的テーブルの必須パラメーター

説明

マテリアライズドビュー(およびTeradataの場合は結合インデックスも)は、Snowflakeの動的テーブルに移行されます。動的テーブルには2つのパラメーターを設定する必要があります: TARGET_LAG and WAREHOUSE

これらのパラメータが設定オプションで設定されていない場合、変換時にデフォルトで設定されます。

[動的テーブルの必須パラメータはこちら](https://docs.snowflake.com/ja/sql-reference/sql/create-dynamic-table#required-parameters)をご覧ください。

コード例

入力コード(Oracle):
 CREATE MATERIALIZED VIEW mv1
AS SELECT * FROM table1;
Copy
生成されたコード:
 CREATE OR REPLACE DYNAMIC TABLE mv1
--** SSC-FDM-0031 - DYNAMIC TABLE REQUIRED PARAMETERS SET BY DEFAULT **
TARGET_LAG='1 day'
WAREHOUSE=UPDATE_DUMMY_WAREHOUSE
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"oracle"}}'
AS
--** SSC-FDM-0001 - VIEWS SELECTING ALL COLUMNS FROM A SINGLE TABLE ARE NOT REQUIRED IN SNOWFLAKE AND MAY IMPACT PERFORMANCE. **
SELECT * FROM
table1;
Copy

ベストプラクティス

  • 必要に応じて、動的テーブルの必要なパラメーターを設定します。

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

SSC-FDM-0032

パラメーターがリテラル値でないため、変換を完全に適用できませんでした。

説明

複数の変換を行う場合、SnowConvert AI はパラメーターの内容を検証する必要が生じることがあります。これは、パラメーターがリテラル値である場合にのみ可能です。

このメッセージは、SnowConvert AI がパラメーターが参照によって渡されたため値を取得できず、関数やステートメントの変換が完了しなかったことを警告するために生成されます。

コード例

入力コード(Redshift):
 SELECT TO_CHAR(DATE '2001-01-01', 'YYY/MM/DD'),
TO_CHAR(DATE '2001-01-01', f)
FROM (SELECT 'YYY/MM/DD' as f);
Copy
生成されたコード:
 SELECT
PUBLIC.YEAR_PART_UDF(DATE '2001-01-01', 3) || TO_CHAR(DATE '2001-01-01', '/MM/DD'),
--** SSC-FDM-0032 - PARAMETER 'format_string' IS NOT A LITERAL VALUE, TRANSFORMATION COULD NOT BE FULLY APPLIED **
TO_CHAR(DATE '2001-01-01', f)
FROM (SELECT 'YYY/MM/DD' as f);
Copy

ベストプラクティス

  • 指定されたパラメーターをリテラル値として提供してみてください。

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

SSC-FDM-0033

SnowflakeではSample句の動作が異なります。

説明

このメッセージは、Snowflakeで行をサンプリングする際の機能的な違いを示すために生成されます。この違いは、検索された行の量に関係しています。Teradataでは非決定論的出力に同じ量の行がある場合、Snowflakeではそれが変化し、数行の増減を返すことがあります。これは確率に関連したトピックであり、Snowflakeでも同様に動作することが予想されるためです。

同じ値、同じ量、決定論的な出力を取得する必要がある場合は、Snowflakeクエリでシードを使用することをお勧めします。

コード例

入力コード(Teradata):
 SELECT * FROM Employee SAMPLE 2;
SELECT * FROM Employee SAMPLE 0.25;
Copy
生成されたコード:
 SELECT
    * FROM
    Employee
--** SSC-FDM-0033 - SAMPLE CLAUSE BEHAVES DIFFERENTLY IN SNOWFLAKE **
SAMPLE(2 ROWS);

SELECT
    * FROM
    Employee
--** SSC-FDM-0033 - SAMPLE CLAUSE BEHAVES DIFFERENTLY IN SNOWFLAKE **
SAMPLE(25);
Copy

ベストプラクティス

  • 決定論的な出力が必要な場合は、クエリのシード部分を使用するようにしてください。

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

SSC-FDM-0034

構造体が VARIANT に変換されました。使用方法によっては機能上の違いがある場合があります。

説明

Snowflakeは STRUCT データ型をネイティブにサポートしていません。SnowConvert AI は自動的にSTRUCT をVARIANT に変換します。INSERT ステートメントで使用される場合、STRUCT データは OBJECT_CONSTRUCT を使用して処理されます。この変換は、いくつかのユースケースにおいて機能的な違いをもたらす可能性があることに注意してください。

コード例

入力コード:
BigQuery
 CREATE OR REPLACE TABLE test.structTypes
(
  COL1 STRUCT<sc1 INT64>,
  COL2 STRUCT<sc2 STRING(10)>,
  COL3 STRUCT<sc3 STRUCT<sc31 INT64, sc32 INT64>>,
  COL4 STRUCT<sc4 ARRAY<INT64>>,
  COL5 STRUCT<sc5 INT64, sc51 INT64>,
  COL7 STRUCT<sc7 INT64 OPTIONS(description = "A repeated STRING field"), sc71 BOOL>,
  COL8 STRUCT<sc8 INT64 NOT NULL, sc81 BOOL NOT NULL OPTIONS(description = "A repeated STRING field")>
);
Copy
生成されたコード:
Snowflake
 CREATE OR REPLACE TABLE test.structTypes
(
  COL1 VARIANT /*** SSC-FDM-0034 - STRUCT<INT64> CONVERTED TO VARIANT. SOME OF ITS USAGES MIGHT HAVE FUNCTIONAL DIFFERENCES. ***/,
    COL2 VARIANT /*** SSC-FDM-0034 - STRUCT<STRING(10)> CONVERTED TO VARIANT. SOME OF ITS USAGES MIGHT HAVE FUNCTIONAL DIFFERENCES. ***/,
    COL3 VARIANT /*** SSC-FDM-0034 - STRUCT<STRUCT<INT64, INT64>> CONVERTED TO VARIANT. SOME OF ITS USAGES MIGHT HAVE FUNCTIONAL DIFFERENCES. ***/,
    COL4 VARIANT /*** SSC-FDM-0034 - STRUCT<ARRAY<INT64>> CONVERTED TO VARIANT. SOME OF ITS USAGES MIGHT HAVE FUNCTIONAL DIFFERENCES. ***/,
    COL5 VARIANT /*** SSC-FDM-0034 - STRUCT<INT64, INT64> CONVERTED TO VARIANT. SOME OF ITS USAGES MIGHT HAVE FUNCTIONAL DIFFERENCES. ***/,
    COL7 VARIANT /*** SSC-FDM-0034 - STRUCT<INT, BOOL> CONVERTED TO VARIANT. SOME OF ITS USAGES MIGHT HAVE FUNCTIONAL DIFFERENCES. ***/,
    COL8 VARIANT /*** SSC-FDM-0034 - STRUCT<INT64, BOOLEAN> CONVERTED TO VARIANT. SOME OF ITS USAGES MIGHT HAVE FUNCTIONAL DIFFERENCES. ***/
  )
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "bigquery",  "convertedOn": "05/30/2025",  "domain": "no-domain-provided" }}';
Copy

ベストプラクティス

SSC-FDM-0035

INFER_SCHEMA 関数は、テーブルテンプレートを生成するためにワイルドカードを含まないファイルパスを必要とするので、FILE_PATH プレースホルダーをそれに置き換えます

説明

[INFER_SCHEMA](https://docs.snowflake.com/ja/sql-reference/functions/infer_schema)関数は、ファイルの構造に基づいてテーブルの列定義を生成するためにSnowflakeで使用されます。この関数は、テーブルの列を構築するために使用されるファイルまたはフォルダーのパスを指定する LOCATION パラメーターを必要とします。ただし、このパスは正規表現に対応していないため、ワイルドカード* 文字はサポートされません。

テーブルに列がない場合、SnowConvert AI はすべてのURIS をチェックして、ワイルドカードを使用していないものを見つけ、INFER _SCHEMA 関数で使用する。このような条件を満たすURI がない場合、このFDM と、FILE_PATH プレースホルダーが生成されます。このプレースホルダーは、テーブルの列を生成するために、外部テーブルによって参照されるいずれかのファイルのパスに置き換える必要があります。

コード例

入力コード:
BigQuery
 CREATE OR REPLACE EXTERNAL TABLE test.my_external_table_json2
OPTIONS(
  FORMAT='JSON',
  URIS=['gs://sc_external_table_bucket/folder_with_json/*']
);
Copy
生成されたコード:
Snowflake
 CREATE OR REPLACE TEMPORARY FILE FORMAT SC_TEST_MY_EXTERNAL_TABLE_JSON2_FORMAT
TYPE = JSON;


CREATE OR REPLACE EXTERNAL TABLE test.my_external_table_json2 USING TEMPLATE (
SELECT
  ARRAY_AGG(OBJECT_CONSTRUCT('COLUMN_NAME', COLUMN_NAME, 'TYPE', TYPE, 'NULLABLE', NULLABLE, 'EXPRESSION', EXPRESSION))
FROM
  --** SSC-FDM-0035 - THE INFER_SCHEMA FUNCTION REQUIRES A FILE PATH WITHOUT WILDCARDS TO GENERATE THE TABLE TEMPLATE, REPLACE THE FILE_PATH PLACEHOLDER WITH IT **
  TABLE(INFER_SCHEMA(LOCATION => '@EXTERNAL_STAGE/FILE_PATH', FILE_FORMAT => 'SC_TEST_MY_EXTERNAL_TABLE_JSON2_FORMAT'))
)
!!!RESOLVE EWI!!! /*** SSC-EWI-0032 - EXTERNAL TABLE REQUIRES AN EXTERNAL STAGE TO ACCESS gs://sc_external_table_bucket, DEFINE AND REPLACE THE EXTERNAL_STAGE PLACEHOLDER ***/!!!
LOCATION = @EXTERNAL_STAGE
AUTO_REFRESH = false
PATTERN = 'folder_with_json/.*'
FILE_FORMAT = (TYPE = JSON);
Copy

ベストプラクティス

SSC-FDM-0036

変換された数値/日付形式は、Snowflakeでは異なる動作をする可能性があります。

説明

Snowflake に変換された数値形式は 固定位置フォーマット を使用します。数値の整数部分の桁数がフォーマット内の桁位置の数より多い場合、変換されたフォーマットは失敗し、異なる出力を生成する可能性があります。その場合、すべての桁はオーバーフローを示す#として印刷されます。

コード例

入力コード:
SQL サーバー
SELECT
 FORMAT(value, '00.00') as formatted, 
 FORMAT(value, '#,##0') as formatSource
 FROM MY_TABLE;
Copy
生成されたコード:
Snowflake
SELECT
 TO_CHAR(value, 'FM9999999999900.00') /*** SSC-FDM-0036 - TRANSFORMATION OF '00.00' FORMAT MAY HAVE A DIFFERENT BEHAVIOR IN SNOWFLAKE. ***/ as formatted,
 TO_CHAR(value, 'FM9,999,999,999,990') /*** SSC-FDM-0036 - TRANSFORMATION OF '#,##0' FORMAT MAY HAVE A DIFFERENT BEHAVIOR IN SNOWFLAKE. ***/ as formatSource
 FROM
 MY_TABLE;
Copy
結果
#############
Copy

ベストプラクティス

  • 数値の桁数が形式に収まらない場合は、入力可能なデータ値に基づいて桁数を追加して形式を更新してください。

SSC-FDM-0037

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

説明

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

コード例

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

ベストプラクティス

SSC-FDM-0038

すべてのSnowflakeテーブルでマイクロパーティションが自動的に実行されます。

説明

このメッセージは、PARTITION BY 句がある場合、CREATE TABLE ステートメントに追加されます。一部のデータベースでテーブルのパーティショニングを制御するPARTITION BY 句は、Snowflakeではサポートされていません。

Snowflakeでは、すべてのテーブルが自動的にマイクロパーティション(50MB から500MB の非圧縮データの範囲のストレージの連続単位)に分割されます。このアーキテクチャは、数百万のマイクロパーティションで構成されるような大規模なテーブルを、非常にきめ細かく刈り込むことを可能にします。

Snowflakeは、次のような各マイクロパーティションのメタデータを自動的に保存します。

  • マイクロパーティションの各列の値の範囲。

  • 個別の値の数。

  • 最適化と効率的なクエリ処理の両方に使用される追加のプロパティ。

テーブルのパーティショニングは、データの挿入やロードの順序に基づいて透過的に行われます。詳しくは[マイクロパーティショニングの利点](https://docs.snowflake.com/ja/user-guide/tables-clustering-micropartitions#benefits-of-micro-partitioning)を参照してください。

コード例

入力コード:
 CREATE TABLE orders 
    (
      storeid INTEGER NOT NULL,
      productid INTEGER NOT NULL,
      orderdate DATE FORMAT 'yyyy-mm-dd' NOT NULL,
      totalorders INTEGER NOT NULL)
      PRIMARY INDEX (storeid, productid) 
      PARTITION BY (RANGE_N(totalorders BETWEEN *, 100, 1000 AND *),RANGE_N(orderdate BETWEEN *, '2005-12-31' AND *) );
Copy
生成されたコード
CREATE OR REPLACE TABLE orders
(
 storeid INTEGER NOT NULL,
 productid INTEGER NOT NULL,
 orderdate DATE NOT NULL,
 totalorders INTEGER NOT NULL)
-- --** SSC-FDM-0038 - MICRO-PARTITIONING IS AUTOMATICALLY HANDLED ON ALL SNOWFLAKE TABLES **
-- PARTITION BY (RANGE_N(totalorders BETWEEN *, 100, 1000 AND *)
--              ,RANGE_N(orderdate BETWEEN *, '2005-12-31' AND *) )
 COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "teradata",  "convertedOn": "09/17/2025",  "domain": "no-domain-provided" }}'
;
Copy

ベストプラクティス