SnowConvert AI:一般的な問題¶
SSC-EWI-0001¶
ソースコードの行で認識できないトークン。
注釈
わかりやすくするため、出力コードの一部を省略しています。
重大性¶
重大
説明¶
この問題は、変換中のソースコードの解析中にエラーが発生した場合に発生します。ソースコードの構文エラーがあるか、コードの特定のステートメントがまだ認識されていないことを意味します。
コード例¶
次の例は、入力に無効な構文が置かれた場合のさまざまな解析エラーシナリオを示しています。メッセージがシナリオごとにどのように異なるかに注意してください。これらの内容は、問題を特定して解決するのに役立つ場合があります。詳しくは下記の「メッセージの内容」をご覧ください。
入力コード: ¶
CRATE;
CREATE TABLE someTable(col1 INTEGER, !);
CREATE TABRE badTable(col1 INTEGER);
CREATE PROCEDURE proc1()
BEGIN
CREATE TABLE badEmbeddedTable(col1 INTEGER);
END;
生成コード: ¶
-- ** SSC-EWI-0001 - UNRECOGNIZED TOKEN ON LINE '1' COLUMN '1' OF THE SOURCE CODE STARTING AT 'CRATE'. EXPECTED 'STATEMENT' GRAMMAR. LAST MATCHING TOKEN WAS 'CRATE' ON LINE '1' COLUMN '1'. **
--CRATE
;
CREATE OR REPLACE TABLE someTable (
col1 INTEGER
-- ,
-- ** SSC-EWI-0001 - UNRECOGNIZED TOKEN ON LINE '3' COLUMN '37' OF THE SOURCE CODE STARTING AT '!'. EXPECTED 'Column Definition' GRAMMAR. LAST MATCHING TOKEN WAS ',' ON LINE '3' COLUMN '35'. FAILED TOKEN WAS '!' ON LINE '3' COLUMN '37'. **
-- !
)
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "teradata", "convertedOn": "07/04/2024" }}'
;
-- ** SSC-EWI-0001 - UNRECOGNIZED TOKEN ON LINE '5' COLUMN '1' OF THE SOURCE CODE STARTING AT 'CREATE'. EXPECTED 'STATEMENT' GRAMMAR. LAST MATCHING TOKEN WAS 'CREATE' ON LINE '5' COLUMN '1'. **
--CREATE TABRE badTable(col1 INTEGER)
;
CREATE OR REPLACE PROCEDURE proc1 ()
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
$$
BEGIN
CREATE OR REPLACE TABLE badEmbeddedTable (
col1 INTEGER);
END;
$$;
メッセージコンテンツ¶
開始句:認識できないコードの開始位置(行、列、「テキスト」)を指定します。コードは、パーサーが回復可能なポイントを見つけるまで、認識できない要素ごとに「テキスト」要素からコメントされます。
予期される文法句:パーサーが予期していた文法の型を指定します。コメントされたコードに、期待される文法と一致する型があるかどうかをチェックします。
最後に一致するトークン句(OPTIONAL):未認識のコードが部分的に認識された場合に表示されることがあります。これは、パーサーが有効な要素を認識するまでのポイントを示すため、コメント付きコード内の次のトークンをチェックして、有効であることを確認します。
失敗したトークン句(OPTIONAL):「最後に一致するトークン句」が存在する場合のみ表示される可能性があります。これは、パーサーが最終的にコードが無効または認識されないと判断したポイントを表します。この要素がこの構文上の場所に配置できることを確認してください。
非推奨メッセージ内容¶
注釈
このリストの項目は現在は使用されていないため、履歴を残す目的でここに残されています。
復旧コード(DEPRECATED):これはエラーコードとして使われることを意図しており、パーサーのアップグレードリクエスト時に、より良いサポートのために提供される場合があります。パーサーがどのように復旧メカニズムを起動させたかを表します。
ベストプラクティス¶
ソースコードの構文が正しいかどうかをチェックします。
このメッセージは、問題の切り分けと解決に利用できます。
構文がサポートされていない場合は、サポートされている構文に手動で変更することができます。
さらにサポートが必要な場合は、[snowconvert-support@snowflake.com](mailto:snowconvert-support@snowflake.com)までメールでお問い合わせください。
SSC-EWI-0002¶
デフォルトパラメーターの並び替えが必要な場合があります
重大性¶
中
説明¶
デフォルトパラメーターの並び替えが必要な場合があります。Snowflakeは、パラメーター宣言の末尾にあるデフォルトパラメーターのみをサポートしています。
コード例¶
入力コード:¶
CREATE PROCEDURE MySampleProc
@Param1 NVARCHAR(50) = NULL,
@Param2 NVARCHAR(10),
@Param3 NVARCHAR(10) = NULL,
@Param4 NVARCHAR(10)
AS
SELECT 1;
生成されたコード:¶
CREATE OR REPLACE PROCEDURE MySampleProc
!!!RESOLVE EWI!!! /*** SSC-EWI-0002 - DEFAULT PARAMETERS MAY NEED TO BE REORDERED. SNOWFLAKE ONLY SUPPORTS DEFAULT PARAMETERS AT THE END OF THE PARAMETERS DECLARATIONS ***/!!!
(PARAM1 STRING DEFAULT NULL, PARAM2 STRING, PARAM3 STRING DEFAULT NULL, PARAM4 STRING)
RETURNS TABLE()
LANGUAGE SQL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"transact"}}'
EXECUTE AS CALLER
AS
$$
DECLARE
ProcedureResultSet RESULTSET;
BEGIN
ProcedureResultSet := (
SELECT 1);
RETURN TABLE(ProcedureResultSet);
END;
$$;
ベストプラクティス¶
さらにサポートが必要な場合は、[snowconvert-support@snowflake.com](mailto:snowconvert-support@snowflake.com)までメールでお問い合わせください。
SSC-EWI-0003¶
組み込みオブジェクトのシステム列が変換されていません。
重大度¶
中
説明¶
このEWI は、SnowConvert AI が組み込みシステムオブジェクト(テーブル、ビュー)をSnowflakeと同等のオブジェクトにマップしたが、その内部列の1つにマップがない場合に生成されます。
コード例 ¶
入力コード:
select name,
parent_object_id
from sys.tables;
出力コード:
Snowflake¶
select
TABLE_NAME,
parent_object_id !!!RESOLVE EWI!!! /*** SSC-EWI-0003 - SYSTEM COLUMN 'parent_object_id' FOR BUILT-IN OBJECT 'SYS.TABLES' HAS NOT BEEN TRANSLATED. ***/!!!
from
INFORMATION_SCHEMA.TABLES;
SSC-EWI-0005¶
重大性¶
重大
説明¶
この問題は、ソースコードを変換しようとすると予期しない変換エラーが発生し、出力コードファイルを生成できない場合に発生します。
ベストプラクティス¶
問題の詳細については、エラーログファイルを確認してください。
さらにサポートが必要な場合は、[snowconvert-support@snowflake.com](mailto:snowconvert-support@snowflake.com)までメールでお問い合わせください。
SSC-EWI-0006¶
現在の日付/数値形式は、Snowflakeでは異なる動作をする可能性があります。
重大性¶
中
説明¶
このエラーは、Snowflakeがソース言語でサポートされている日付/数値形式を一部の関数でサポートしていないために追加されました。
以下の形式要素は、[Snowflake](https://docs.snowflake.com/ja/sql-reference/functions-conversion#label-date-time-format-conversion)で異なる動作をする可能性があります。
レッドシフト日時¶
| Format Element | Description |
|---|---|
| HH | Hour of day (01–12). |
| MS | Millisecond (000–999). |
| US | Microsecond (000000–999999). |
| SSSS, SSSSS | Seconds past midnight (0–86399). |
| Y,YYY | Year (4 or more digits) with comma. |
| YYY | Last 3 digits of year. |
| Y | Last digit of year. |
| IYYY | ISO 8601 week-numbering year(4 or more digits). |
| IYY | Last 3 digits of ISO 8601 week-numbering year. |
| IY | Last 2 digits of ISO 8601 week-numbering year. |
| I | Last digit of ISO 8601 week-numbering year. |
| BC, bc, AD or ad | Era indicator (without periods). |
| B.C., b.c., A.D. or a.d. | Era indicator (with periods). |
| MONTH | Full upper case month name (blank-padded to 9 chars). |
| Month | Full capitalized month name (blank-padded to 9 chars). |
| month | Full lower case month name (blank-padded to 9 chars). |
| DAY | Full upper case day name (blank-padded to 9 chars). |
| Day | Full capitalized day name (blank-padded to 9 chars). |
| day | Full lower case day name (blank-padded to 9 chars). |
| DDD | Day of year (001–366). |
| IDDD | Day of ISO 8601 week-numbering year (001–371; day 1 of the year is Monday of the first ISO week). |
| D | Day of the week, Sunday (1) to Saturday (7). |
| ID | ISO 8601 day of the week, Monday (1) to Sunday (7). |
| W | Week of month (1–5) (the first week starts on the first day of the month). |
| WW | Week number of year (1–53) (the first week starts on the first day of the year). |
| IW | Week number of ISO 8601 week-numbering year (01–53; the first Thursday of the year is in week 1). |
| CC | Century (2 digits) (the twenty-first century starts on 2001-01-01). |
| J | Julian Date. |
| Q | Quarter. |
| RM | Month in upper case Roman numerals (I–XII; I=January). |
| rm | Month in lower case Roman numerals (i–xii; i=January). |
| TZ | Upper case time-zone abbreviation (only supported in to_char). |
| tz | Lower case time-zone abbreviation (only supported in to_char). |
| TZH | Time-zone hours. |
| TZM | Time-zone minutes. |
| OF | Time-zone offset from UTC (only supported in to_char). |
| FM prefix | Fill mode (suppress leading zeroes and padding blanks). |
| TH suffix | Upper case ordinal number suffix. |
| th suffix | Lower case ordinal number suffix. |
| FX prefix | Fixed format global option (see usage notes). |
| TM prefix | Translation mode (use localized day and month names based on lc_time). |
| SP suffix | Spell mode. |
注釈
詳しくは[PostgreSQL 日付/時刻形式](https://www.postgresql.org/docs/current/functions-formatting.html#FUNCTIONS-FORMATTING-DATETIME-TABLE)をご参照ください。
注釈
TO_CHAR 関数の変換は、この形式要素のほとんどをサポートしています。 サポートされている形式要素の完全なリストと同等のマッピングについては、[変換仕様書](../../../../translation-references/redshift/redshift-functions.md#for-datetime-values)を参照してください。
BigQuery 形式 ¶
詳しいリストは[こちら](https://cloud.google.com/bigquery/docs/reference/standard-sql/format-elements)をご覧ください。
数値 ¶
パターン |
説明 |
|---|---|
PR |
角括弧内の負の値 |
RN |
ローマ数字(1~3999の間で入力) |
TH またはth |
序数のサフィックス |
V |
シフト指定桁数(ノート参照) |
EEEE |
科学的記数法の指数 |
注釈
詳しくは[PostgreSQL 数値形式](https://www.postgresql.org/docs/current/functions-formatting.html#FUNCTIONS-FORMATTING-NUMERIC-TABLE)をご参照ください。
コード例¶
入力コード:¶
PostgreSQL¶
SELECT
DATE_TRUNC('decade', TIMESTAMP '2017-03-17 02:09:30'),
DATE_TRUNC('century', TIMESTAMP '2017-03-17 02:09:30'),
DATE_TRUNC('millennium', TIMESTAMP '2017-03-17 02:09:30');
生成されたコード:¶
Snowflake¶
SELECT
!!!RESOLVE EWI!!! /*** SSC-EWI-PG0005 - DECADE FORMAT IS NOT SUPPORTED IN SNOWFLAKE. ***/!!!
DATE_TRUNC('decade', TIMESTAMP '2017-03-17 02:09:30'),
!!!RESOLVE EWI!!! /*** SSC-EWI-PG0005 - CENTURY FORMAT IS NOT SUPPORTED IN SNOWFLAKE. ***/!!!
DATE_TRUNC('century', TIMESTAMP '2017-03-17 02:09:30'),
!!!RESOLVE EWI!!! /*** SSC-EWI-PG0005 - MILLENNIUM FORMAT IS NOT SUPPORTED IN SNOWFLAKE. ***/!!!
DATE_TRUNC('millennium', TIMESTAMP '2017-03-17 02:09:30');
ベストプラクティス¶
さらにサポートが必要な場合は、[snowconvert-support@snowflake.com](mailto:snowconvert-support@snowflake.com)までメールでお問い合わせください。
SSC-EWI-0007¶
重大性¶
重大
説明¶
このエラーは、出力ファイルの書き込みにエラーが発生した場合に表示されます。
ベストプラクティス¶
さらにサポートが必要な場合は、[snowconvert-support@snowflake.com](mailto:snowconvert-support@snowflake.com)までメールでお問い合わせください。
SSC-EWI-0008¶
COLLATE 句は、Snowflakeでは異なる動作をする可能性があります。
重大性¶
中
説明¶
この警告は、collate句が列オプションとして使用される場合に追加されます。これは、Snowflakeではサポートされていますが、collate仕様では異なる動作をする可能性があるためです。Snowflakeでサポートされている指定子を確認するには、[collateドキュメント](https://docs.snowflake.com/ja/sql-reference/collation#label-collation-specification)を確認してください。
コード例¶
入力コード:¶
CREATE TABLE TABLE01 (
col1 text COLLATE "C"
);
生成コード: ¶
CREATE TABLE TABLE01 (
col1 text
!!!RESOLVE EWI!!! /*** SSC-EWI-0008 - COLLATE CLAUSE MAY HAVE A DIFFERENT BEHAVIOR IN SNOWFLAKE. ***/!!! COLLATE "C"
);
ベストプラクティス¶
さらにサポートが必要な場合は、[snowconvert-support@snowflake.com](mailto:snowconvert-support@snowflake.com)までメールでお問い合わせください。
SSC-EWI-0009¶
Regexp_Substr関数は POSIX 正規表現のみをサポートしています。
重大性¶
低
説明¶
現在、Snowflakeでは[POSIX 基本正規表現構文](https://en.wikipedia.org/wiki/Regular_expression#POSIX_basic_and_extended)を超える拡張正規表現はサポートされていません。
この EWI は、 REGEX_SUBSTR、REGEX_REPLACE、 または REGEX_INSTR への関数呼び出しが SnowFlake に変換されるたびに追加され、サポートされていない可能性のある正規表現についてユーザーに警告します。サポートされていない 関数には、先読み、後読み、非キャプチャグループがあります。
コード例¶
入力コード: ¶
SELECT REGEXP_SUBSTR('qaqequ','q(?=u)', 1, 1);
生成されたコード:¶
SELECT
!!!RESOLVE EWI!!! /*** SSC-EWI-0009 - REGEXP_SUBSTR FUNCTION ONLY SUPPORTS POSIX REGULAR EXPRESSIONS ***/!!!
REGEXP_SUBSTR('qaqequ','q(?=u)', 1, 1);
ベストプラクティス¶
それぞれのケースで使われている正規表現をチェックし、手作業が必要かどうかを判断します。SnowFlake の拡張正規表現サポートとその代替についての詳細は、[こちら](https://community.snowflake.com/s/question/0D50Z00007ENLKsSAP/expanded-support-for-regular-expressions-regex)を参照してください。
さらにサポートが必要な場合は、[snowconvert-support@snowflake.com](mailto:snowconvert-support@snowflake.com)までメールでお問い合わせください。
SSC-EWI-0010¶
重大性¶
重大
説明¶
このエラーは、特定のプロシージャステートメントに対する変換ルールが存在しない場合に表示されます。
ベストプラクティス¶
プロシージャステートメントが正しいかどうかをチェックします。
さらにサポートが必要な場合は、[snowconvert-support@snowflake.com](mailto:snowconvert-support@snowflake.com)までメールでお問い合わせください。
SSC-EWI-0011¶
重大性¶
高
説明¶
このエラーは、ソースコード中に予期せぬステートメントの終了があり、そのエラーを正しく処理できない場合に表示されます。
ベストプラクティス¶
ソースコードが不完全でないか、変換されるステートメントが正しく終了しているかをチェックします。
さらにサポートが必要な場合は、[snowconvert-support@snowflake.com](mailto:snowconvert-support@snowflake.com)までメールでお問い合わせください。
SSC-EWI-0012¶
重大性¶
高
説明¶
このエラーは、ソースコード中に予期せぬステートメントの終了がある場合に表示されます
コード例¶
入力コード:¶
CREATE VOLATILE SET TABLE VOLATILETABLE
(
COL1 INTEGER,
COL2 INTEGER,
COL3 INTEGER
)
ON COMMIT PRESERVE ROWS;
UPDATE TABLE2 as T2
SET T2.COL1 + VOLATILETABLE.COL1
WHERE T2.COL2 = VOLATILETABLE.COL2
AND T2.COL3 = VOLATILETABLE.COL3
AND T2.COL4 = ( SELECT MAX(T3.COL1)
FROM
TABLE3 T3
WHERE T3.COL1 = T2.COL1);
生成コード: ¶
--** SSC-FDM-TD0024 - SET TABLE FUNCTIONALITY NOT SUPPORTED. TABLE MIGHT HAVE DUPLICATE ROWS **
CREATE OR REPLACE TEMPORARY TABLE VOLATILETABLE
(
COL1 INTEGER,
COL2 INTEGER,
COL3 INTEGER
)
-- --** SSC-FDM-0008 - ON COMMIT NOT SUPPORTED **
--ON COMMIT PRESERVE ROWS
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"teradata"}}'
;
--** SSC-FDM-0007 - MISSING DEPENDENT OBJECTS "TABLE2", "TABLE3" **
UPDATE TABLE2 AS T2
SET
--** SSC-FDM-0025 - UNEXPECTED END OF STATEMENT. PLEASE CHECK THE LINE 9 OF ORIGINAL SOURCE CODE. **
T2.COL1 + VOLATILETABLE.COL1
FROM
VOLATILETABLE
WHERE T2.COL2 = _VOLATILETABLE.COL2
AND T2.COL3 = _VOLATILETABLE.COL3
AND T2.COL4 = (
SELECT
MAX(T3.COL1)
FROM
TABLE3 T3
WHERE T3.COL1 = T2.COL1);
推奨¶
ソースコードが不完全でないか、変換されるステートメントが正しく終了しているかをチェックします。
さらにサポートが必要な場合は、[snowconvert-support@snowflake.com](mailto:snowconvert-support@snowflake.com)までメールでお問い合わせください。
SSC-EWI-0013¶
重大性¶
重大
説明¶
このエラーは、ソースコードから項目を変換する際に例外が発生した場合に表示されます。
推奨¶
さらにサポートが必要な場合は、[snowconvert-support@snowflake.com](mailto:snowconvert-support@snowflake.com)までメールでお問い合わせください。
SSC-EWI-0014¶
重大性¶
重大
説明¶
このエラーは、特定のプロシージャステートメントの本文が生成されない場合に表示されます。
ベストプラクティス¶
さらにサポートが必要な場合は、[snowconvert-support@snowflake.com](mailto:snowconvert-support@snowflake.com)までメールでお問い合わせください。
SSC-EWI-0015¶
ピボット/アンピボットマルチプル機能はサポートされていません。
注釈
わかりやすくするため、出力コードの一部を省略しています。
重大性¶
中
説明¶
このセクションでは、PIVOT およびUNPIVOT 句によって引き起こされる可能性のあるさまざまな問題について説明します。サポートされていないシナリオを以下の表に示します。
PIVOT |
UNPIVOT |
ORACLE |
TERADATA |
|
|---|---|---|---|---|
MULTIPLE COLUMN |
X |
X |
X |
X |
RENAME COLUMN |
X |
X |
X |
X |
MULTIPLE FUNCTION |
X |
X |
X |
|
WITH CLAUSE |
X |
X |
||
XML OUTPUT FORMAT |
X |
X |
||
IN CLAUSE SUBQUERY |
X |
X |
X |
|
IN CLAUSE ANY SEQUENCE |
X |
X |
||
INCLUDE/EXCLUDE NULLS |
X |
X |
X |
MULTIPLE COLUMN¶
複数列は、PIVOT および UNPIVOT 句ではサポートされていません。
コード例¶
入力コード:¶
SELECT * FROM star1p UNPIVOT ((sales,cogs) FOR yr_qtr
IN ((Q101Sales, Q101Cogs) AS 'Q101A',
(Q201Sales, Q201Cogs) AS 'Q201A',
(Q301Sales, Q301Cogs) AS 'Q301A')) AS Tmp;
生成されたコード:¶
// SnowConvert AI Helpers Code section is omitted.
SELECT * FROM
star1p
!!!RESOLVE EWI!!! /*** SSC-EWI-0015 - PIVOT/UNPIVOT MULTIPLE COLUMN NOT SUPPORTED ***/!!!
UNPIVOT ((sales,cogs) FOR yr_qtr
!!!RESOLVE EWI!!! /*** SSC-EWI-0015 - PIVOT/UNPIVOT MULTIPLE COLUMN NOT SUPPORTED ***/!!!
IN ((Q101Sales, Q101Cogs) AS 'Q101A',
(Q201Sales, Q201Cogs) AS 'Q201A',
(Q301Sales, Q301Cogs) AS 'Q301A')) AS Tmp;
RENAME COLUMN¶
エイリアスによる列名の変更は、snowflake UNPIVOT 句ではサポートされていません。Snow Convertは、有有効なクエリを作成し、この変更が元の機能に影響を与えないことを確認するために、関数または列のエイリアスを削除します。
PIVOT の場合、列エイリアスの使用は、次の2つの条件が満たされる場合にのみ、SnowConvert AI for Teradataでサポートされます。IN 句内のすべての式にエイリアスが関連付けられ、テーブル定義を提供するか、明示的な列リストを含むサブクエリを句への入力として使用することによって、結果として生成される列に関する情報が SnowConvert AI にあること。
コード例¶
入力コード:¶
CREATE TABLE star1(
country VARCHAR(20),
state VARCHAR(10),
yr INTEGER,
qtr VARCHAR(3),
sales INTEGER,
cogs INTEGER
);
--SAMPLE 1
SELECT * FROM db1.star1p UNPIVOT (column1 FOR for_column
IN (col1 AS 'as_col1', col2 AS 'as_col2')) Tmp;
--SAMPLE 2
SELECT *
FROM star1 PIVOT (
SUM(sales) as ss1 FOR qtr
IN ('Q1' AS Quarter1,
'Q2' AS Quarter2,
'Q3' AS Quarter3)
)Tmp;
--SAMPLE 3
SELECT
*
FROM (
SELECT
country,
state,
yr,
qtr,
sales,
cogs
FROM star1 ) A
PIVOT (
SUM(sales) as ss1 FOR qtr
IN ('Q1' AS Quarter1,
'Q2' AS Quarter2,
'Q3' AS Quarter3)
)Tmp;
生成されたコード:¶
CREATE OR REPLACE TABLE star1 (
country VARCHAR(20),
state VARCHAR(10),
yr INTEGER,
qtr VARCHAR(3),
sales INTEGER,
cogs INTEGER
)
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "teradata", "convertedOn": "08/14/2024" }}'
;
--SAMPLE 1
--** SSC-FDM-0007 - MISSING DEPENDENT OBJECT "db1.star1p" **
SELECT
* FROM db1.star1p UNPIVOT (column1 FOR for_column
IN (col1 AS 'as_col1', col2 AS 'as_col2')) Tmp !!!RESOLVE EWI!!! /*** SSC-EWI-0073 - PENDING FUNCTIONAL EQUIVALENCE REVIEW FOR 'PivotUnpivotTableReference' NODE ***/!!!;
--SAMPLE 2
SELECT
*
FROM
star1 PIVOT (
SUM(sales) FOR qtr IN ('Q1',
'Q2',
'Q3')) Tmp (
country,
state,
yr,
cogs,
Quarter1_ss1,
Quarter2_ss1,
Quarter3_ss1
);
--SAMPLE 3
SELECT
*
FROM (
SELECT
country,
state,
yr,
qtr,
sales,
cogs
FROM
star1
) A
PIVOT (
SUM(sales) FOR qtr IN ('Q1',
'Q2',
'Q3')) Tmp (
country,
state,
yr,
cogs,
Quarter1_ss1,
Quarter2_ss1,
Quarter3_ss1
);
MULTIPLE FUNCTION¶
PIVOT 節では複数の関数はサポートされていません。caseステートメントを使用して書き直すことができる場合があります。詳しくは以下のTeradataサンプルを参照してください。[https://docs.teradata.com/r/756LNiPSFdY~4JcCCcR5Cw/L0kKSOrOeu_68mcW3o8ilw](https://docs.teradata.com/r/756LNiPSFdY~4JcCCcR5Cw/L0kKSOrOeu_68mcW3o8ilw)
コード例¶
入力コード:¶
SELECT *
FROM STAR1 PIVOT(SUM(COL1), SUM(COL2) FOR YR IN ('Y1', 'Y2', 'Y3'))TMP;
生成されたコード:¶
// SnowConvert AI Helpers Code section is omitted.
SELECT
*
FROM
STAR1
!!!RESOLVE EWI!!! /*** SSC-EWI-0015 - PIVOT/UNPIVOT MULTIPLE FUNCTION NOT SUPPORTED ***/!!!
PIVOT(SUM(COL1), SUM(COL2) FOR YR IN ('Y1', 'Y2', 'Y3'))TMP;
WITH CLAUSE¶
Teradata PIVOT にはオプションのWITH 句がありますが、これはSnowflakeの PIVOT では許可されていません。
コード例¶
入力コード:¶
SELECT *
FROM STAR1 PIVOT(SUM(COL1) FOR YR IN ('Y1', 'Y2', 'Y3') WITH SUM(*) AS withalias)TMP;
生成されたコード:¶
// SnowConvert AI Helpers Code section is omitted.
SELECT
*
FROM
STAR1 PIVOT(SUM(COL1) FOR YR IN ('Y1', 'Y2', 'Y3')
!!!RESOLVE EWI!!! /*** SSC-EWI-0015 - PIVOT/UNPIVOT WITH CLAUSE NOT SUPPORTED ***/!!!
WITH SUM(*) AS withalias)TMP;
XML OUTPUT FORMAT¶
PIVOT 句の XML 出力は、Snowflakeではサポートされていません。
コード例¶
入力コード:¶
SELECT * FROM (SELECT product_code, quantity FROM pivot_test)
PIVOT XML (SUM(quantity)
FOR (product_code) IN ('A','B','C'));
生成されたコード:¶
// SnowConvert AI Helpers Code section is omitted.
SELECT * FROM
(
SELECT product_code, quantity FROM
pivot_test)
!!!RESOLVE EWI!!! /*** SSC-EWI-0015 - PIVOT/UNPIVOT XML OUTPUT FORMAT NOT SUPPORTED ***/!!!
PIVOT (SUM(quantity) FOR product_code IN ( 'A', 'B', 'C'));
IN CLAUSE SUBQUERY¶
IN 句のサブクエリはサポートされていません。
コード例¶
入力コード:¶
SELECT * FROM s1 PIVOT(SUM(COL1) FOR FORCOL IN (SELECT SELCOL FROM S2))DT;
生成されたコード:¶
// SnowConvert AI Helpers Code section is omitted.
SELECT * FROM
s1 PIVOT (SUM(COL1) FOR FORCOL
!!!RESOLVE EWI!!! /*** SSC-EWI-0015 - PIVOT/UNPIVOT IN CLAUSE SUBQUERY NOT SUPPORTED ***/!!! IN (SELECT SELCOL FROM
S2));
IN CLAUSE ANY SEQUENCE¶
このエラーは、IN 句で ANY キーワードが使用されている場合に発生します。これは現在サポートされていません。
コード例¶
入力コード:¶
SELECT * FROM (SELECT product_code, quantity FROM pivot_test)
PIVOT (SUM(quantity)
FOR product_code IN (ANY, ANY, ANY));
生成されたコード:¶
// SnowConvert AI Helpers Code section is omitted.
SELECT * FROM (SELECT product_code, quantity FROM
pivot_test)
PIVOT (SUM(quantity)
FOR product_code
!!!RESOLVE EWI!!! /*** SSC-EWI-0015 - PIVOT/UNPIVOT IN CLAUSE ANY SEQUENCE NOT SUPPORTED ***/!!!
IN (ANY, ANY, ANY));
INCLUDE/EXCLUDE NULLS¶
INCLUDE NULLS やEXCLUDE NULLS は、SnowflakeのUNPIVOT 句では有効なオプションではありません。
コード例¶
入力コード:¶
SELECT * FROM db1.star1p UNPIVOT INCLUDE NULLS (column1 FOR for_column IN (col1, col2)) Tmp;
生成されたコード:¶
// SnowConvert AI Helpers Code section is omitted.
SELECT * FROM
db1.star1p
!!!RESOLVE EWI!!! /*** SSC-EWI-0015 - PIVOT/UNPIVOT INCLUDE NULLS NOT SUPPORTED ***/!!!
UNPIVOT ( column1 FOR for_column IN (
col1,
col2)) Tmp;
ベストプラクティス¶
可能であればクエリを書き直してください。それ以外の場合は、追加のユーザーアクションは必要ありません。
さらにサポートが必要な場合は、[snowconvert-support@snowflake.com](mailto:snowconvert-support@snowflake.com)までメールでお問い合わせください。
SSC-EWI-0016¶
Snowflakeはオプション句をサポートしていません。
重大度¶
中
説明¶
この EWI は、OPTIONS にSnowflakeがサポートしていないオプションがある場合に、DDLs ステートメントに追加されます。
コード例 ¶
入力コード:
BigQuery¶
CREATE VIEW my_view
OPTIONS (
expiration_timestamp=TIMESTAMP "2026-01-01 00:00:00 UTC",
privacy_policy='{"aggregation_threshold_policy": {"threshold": 50, "privacy_unit_columns": "ID"}}'
) AS
SELECT column1, column2
FROM my_table;
出力コード:
Snowflake¶
CREATE VIEW my_view
!!!RESOLVE EWI!!! /*** SSC-EWI-0016 - SNOWFLAKE DOES NOT SUPPORT THE OPTIONS: EXPIRATION_TIMESTAMP, PRIVACY_POLICY. ***/!!!
OPTIONS(
expiration_timestamp=TIMESTAMP "2026-01-01 00:00:00 UTC",
privacy_policy='{"aggregation_threshold_policy": {"threshold": 50, "privacy_unit_columns": "ID"}}'
)
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "bigquery", "convertedOn": "07/10/2025", "domain": "no-domain-provided" }}'
AS
SELECT column1, column2
FROM
my_table;
SSC-EWI-0020¶
CUSTOM UDF INSERTED。
重大性¶
低
概要¶
Snowflakeではサポートされていないソース言語の動作を再現するために使用される、SnowConvert AIによって提供されるユーザー定義関数(UDF)がいくつかあり、その機能と説明については以下に詳細に記載されています。
UDFs は、移行後に出力パスに作成される「UDF Helpers」フォルダーにあります。
ベストプラクティス¶
UDF Helpersフォルダーが作成され、その中にファイルが含まれているかどうかを確認します。
さらにサポートが必要な場合は、[snowconvert-support@snowflake.com](mailto:snowconvert-support@snowflake.com)までメールでお問い合わせください。
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;
生成されたコード:¶
!!!RESOLVE EWI!!! /*** SSC-EWI-0021 - 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;
ベストプラクティス¶
このエラーが発生するのは、変換されるノードに相当するSnowflakeが存在しないためです。
さらにサポートが必要な場合は、[snowconvert-support@snowflake.com](mailto:snowconvert-support@snowflake.com)までメールでお問い合わせください。
SSC-EWI-0022¶
特定のステートメント内の1つ以上の識別子は、デフォルトでパラメーターとみなされます。
警告
EWI は、Javascriptがストアドプロシージャのターゲット言語である場合にのみ生成されます。ストアドプロシージャの推奨ターゲット言語はSnowflakeスクリプトであるため、これは非推奨の変換機能です。
注釈
わかりやすくするため、出力コードの一部を省略しています。
重大性¶
中
説明¶
このエラーは、特定のステートメント内の1つ以上の識別子がデフォルトでパラメーターとみなされていることを報告するために使用されます。
コード例¶
入力コード: ¶
-- Additional Params: -t javascript
CREATE MACRO SAME_MACRO_COLUMN_AND_PARAMATERS (
LOAD_USER_ID (VARCHAR (32), CHARACTER SET LATIN),
UPDATE_USER_ID (VARCHAR (32), CHARACTER SET LATIN)
) AS (
UPDATE TABLE1 SET LOAD_USER_ID = :LOAD_USER_ID, UPDATE_USER_ID = :UPDATE_USER_ID;
INSERT INTO TABLE1 (LOAD_USER_ID, UPDATE_USER_ID) VALUES (:LOAD_USER_ID, :UPDATE_USER_ID);
DELETE FROM TABLE1 WHERE :LOAD_USER_ID = LOAD_USER_ID;
);
生成されたコード:¶
-- Additional Params: -t javascript
--** SSC-FDM-0007 - MISSING DEPENDENT OBJECT "TABLE1" **
CREATE OR REPLACE PROCEDURE SAME_MACRO_COLUMN_AND_PARAMATERS (LOAD_USER_ID VARCHAR (32), UPDATE_USER_ID VARCHAR (32))
RETURNS STRING
LANGUAGE JAVASCRIPT
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "teradata", "convertedOn": "07/16/2025", "domain": "no-domain-provided" }}'
EXECUTE AS CALLER
AS
$$
// REGION SnowConvert AI Helpers Code
var HANDLE_NOTFOUND;
var _RS, ROW_COUNT, _ROWS, MESSAGE_TEXT, SQLCODE = 0, SQLSTATE = '00000', ERROR_HANDLERS, ACTIVITY_COUNT = 0, INTO, _OUTQUERIES = [], DYNAMIC_RESULTS = -1;
var formatDate = (arg) => (new Date(arg - (arg.getTimezoneOffset() * 60000))).toISOString().slice(0,-1);
var fixBind = function (arg) {
arg = arg == undefined ? null : arg instanceof Date ? formatDate(arg) : arg;
return arg;
};
var EXEC = function (stmt,binds,noCatch,catchFunction,opts) {
try {
binds = binds ? binds.map(fixBind) : binds;
_RS = snowflake.createStatement({
sqlText : stmt,
binds : binds
});
_ROWS = _RS.execute();
ROW_COUNT = _RS.getRowCount();
ACTIVITY_COUNT = _RS.getNumRowsAffected();
HANDLE_NOTFOUND && HANDLE_NOTFOUND(_RS);
if (INTO) return {
INTO : function () {
return INTO();
}
};
if (_OUTQUERIES.length < DYNAMIC_RESULTS) _OUTQUERIES.push(_ROWS.getQueryId());
if (opts && opts.temp) return _ROWS.getQueryId();
} catch(error) {
MESSAGE_TEXT = error.message;
SQLCODE = error.code;
SQLSTATE = error.state;
var msg = `ERROR CODE: ${SQLCODE} SQLSTATE: ${SQLSTATE} MESSAGE: ${MESSAGE_TEXT}`;
if (catchFunction) catchFunction(error);
if (!noCatch && ERROR_HANDLERS) ERROR_HANDLERS(error); else throw new Error(msg);
}
};
// END REGION
EXEC(`UPDATE TABLE1
SET
LOAD_USER_ID = :1,
UPDATE_USER_ID = :2`,[LOAD_USER_ID,UPDATE_USER_ID]);
// ** SSC-EWI-0022 - ONE OR MORE IDENTIFIERS IN THIS STATEMENT WERE CONSIDERED PARAMETERS BY DEFAULT. REFERENCED TABLE NOT FOUND. **
EXEC(`INSERT INTO TABLE1 (LOAD_USER_ID, UPDATE_USER_ID)
VALUES (:1, :2)`,[LOAD_USER_ID,UPDATE_USER_ID]);
!!!RESOLVE EWI!!! /*** SSC-EWI-0073 - PENDING FUNCTIONAL EQUIVALENCE REVIEW FOR 'Delete' NODE ***/!!!
//DELETE FROM
// TABLE1
//WHERE
// UPPER(RTRIM(:LOAD_USER_ID)) = UPPER(RTRIM(LOAD_USER_ID))
null
$$;
ベストプラクティス¶
プロシージャステートメントに関連するすべての依存関係(テーブルとビュー)が移行されていることを確認してください。
さらにサポートが必要な場合は、[snowconvert-support@snowflake.com](mailto:snowconvert-support@snowflake.com)までメールでお問い合わせください。
SSC-EWI-0023¶
パフォーマンスレビュー:ループには、挿入、削除、更新ステートメントが含まれます。
警告
EWI は、Javascriptがストアドプロシージャのターゲット言語である場合にのみ生成されます。ストアドプロシージャの推奨ターゲット言語はSnowflakeスクリプトであるため、これは非推奨の変換機能です。
注釈
わかりやすくするため、出力コードの一部を省略しています。
重大性¶
低
説明¶
この警告は、パフォーマンスに関してユーザーが考慮すべき可能性を示しています。
コード例¶
入力コード: ¶
-- Additional Params: -t javascript
REPLACE PROCEDURE Database1.Proc1()
BEGIN
DECLARE lNumber INTEGER DEFAULT 1;
FOR class1 AS class2 CURSOR FOR
SELECT COL0,
TRIM(COL1) AS COL1ALIAS,
TRIM(COL2),
COL3
FROM someDb.prefixCol
DO
INSERT INTO TempDB.Table1 (:lgNumber, :lNumber, (',' || :class1.ClassCD || '_Ind CHAR(1) NOT NULL'));
SET lNumber = lNumber + 1;
END FOR;
END;
生成されたコード:¶
CREATE OR REPLACE PROCEDURE Database1.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 LNUMBER = 1;
/*** SSC-EWI-0023 - PERFORMANCE REVIEW - THIS LOOP CONTAINS AN INSERT, DELETE OR UPDATE STATEMENT ***/
for(var CLASS2 = new CURSOR(`SELECT
COL0,
TRIM(COL1) AS COL1ALIAS,
TRIM(COL2),
COL3
FROM
someDb.prefixCol`,[],false).OPEN();CLASS2.NEXT();) {
let CLASS1 = CLASS2.CURRENT;
EXEC(`INSERT INTO TempDB.Table1
VALUES (:lgNumber, :1, (',' || :
!!!RESOLVE EWI!!! /*** SSC-EWI-0026 - THE VARIABLE class1.ClassCD MAY REQUIRE A CAST TO DATE, TIME OR TIMESTAMP ***/!!!
:2 || '_Ind CHAR(1) NOT NULL'))`,[LNUMBER,CLASS1.CLASSCD]);
LNUMBER = LNUMBER + 1;
}
CLASS2.CLOSE();
$$;
ベストプラクティス¶
さらにサポートが必要な場合は、[snowconvert-support@snowflake.com](mailto:snowconvert-support@snowflake.com)までメールでお問い合わせください。
SSC-EWI-0025¶
時間変数をバインドするには、クエリの変更が必要になる場合があります。
警告
EWI は、Javascriptがストアドプロシージャのターゲット言語である場合にのみ生成されます。ストアドプロシージャの推奨ターゲット言語はSnowflakeスクリプトであるため、これは非推奨の変換機能です。
注釈
わかりやすくするため、出力コードの一部を省略しています。
重大性¶
低
説明¶
時間変数をバインドするアクションは、その変数を含むクエリの変更が必要になる場合があります。
コード例¶
入力コード: ¶
-- Additional Params: -t javascript
CREATE PROCEDURE P_1025()
BEGIN
DECLARE LN_EMP_KEY_NO_PARAM NUMERIC DEFAULT -1;
DECLARE FLOATVARNAME FLOAT DEFAULT 12.1;
DECLARE hErrorMsg CHARACTER(30) DEFAULT 'NO ERROR';
DECLARE CurrTs TIME DEFAULT CURRENT_TIME;
DECLARE CurrTs2 TIME DEFAULT CURRENT_TIMESTAMP;
END;
生成されたコード:¶
CREATE OR REPLACE PROCEDURE P_1025 ()
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 LN_EMP_KEY_NO_PARAM = -1;
var FLOATVARNAME = 12.1;
var HERRORMSG = `NO ERROR`;
var CURRTS = new Date() /*** SSC-EWI-0025 - BINDING TIME VARIABLE MIGHT REQUIRE CHANGE IN QUERY. ***/;
var CURRTS2 = new Date();
$$;
ベストプラクティス¶
ユーザーによる追加のアクションは必要ありません。
さらにサポートが必要な場合は、[snowconvert-support@snowflake.com](mailto:snowconvert-support@snowflake.com)までメールでお問い合わせください。
SSC-EWI-0026¶
修飾された変数はキャストを必要とする場合があります。
警告
EWI は、Javascriptがストアドプロシージャのターゲット言語である場合にのみ生成されます。ストアドプロシージャの推奨ターゲット言語はSnowflakeスクリプトであるため、これは非推奨の変換機能です。
注釈
わかりやすくするため、出力コードの一部を省略しています。
重大性¶
低
説明¶
この警告は、OracleレコードやTeradata for loop変数などの修飾メンバーを持つ変数を含むクエリがある場合に追加されます。変数が使用される場所や値の型によっては、正しく動作させるためにキャストが必要な場合があります。
コード例¶
入力コード: ¶
CREATE TABLE TABLE1 (COL1 DATE);
CREATE TABLE TABLE2 (COL1 VARCHAR(25));
CREATE OR REPLACE PROCEDURE EXAMPLE
IS
CURSOR C1 IS SELECT * FROM TABLE1;
BEGIN
FOR REC1 IN C1 LOOP
insert into TABLE2 values (TO_CHAR(REC1.COL1, 'DD-MM-YYYY'));
END LOOP;
END;
生成されたコード:¶
-- Additional Params: -t javascript
CREATE OR REPLACE TABLE TABLE1 (COL1 TIMESTAMP /*** SSC-FDM-OR0042 - DATE TYPE COLUMN HAS A DIFFERENT BEHAVIOR IN SNOWFLAKE. ***/
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"oracle"}}'
;
CREATE OR REPLACE TABLE TABLE2 (COL1 VARCHAR(25))
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"oracle"}}'
;
CREATE OR REPLACE PROCEDURE EXAMPLE ()
RETURNS STRING
LANGUAGE JAVASCRIPT
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"oracle"}}'
EXECUTE AS CALLER
AS
$$
// SnowConvert AI Helpers Code section is omitted.
let C1 = new CURSOR(`SELECT * FROM
TABLE1`,() => []);
C1.OPEN();
// ** SSC-EWI-0023 - PERFORMANCE REVIEW - THIS LOOP CONTAINS AN INSERT, DELETE OR UPDATE STATEMENT **
while ( C1.NEXT() ) {
let REC1 = C1.CURRENT;
EXEC(`insert into TABLE2
values (TO_CHAR(
!!!RESOLVE EWI!!! /*** SSC-EWI-0026 - THE VARIABLE REC1.COL1 MAY REQUIRE A CAST TO DATE, TIME OR TIMESTAMP ***/!!!
?, 'DD-MM-YYYY'))`,[REC1.COL1]);
}
C1.CLOSE();
$$;
調整後の生成コード: ¶
CREATE OR REPLACE TABLE TABLE1 (COL1 TIMESTAMP
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
;
CREATE OR REPLACE TABLE TABLE2 (COL1 VARCHAR(25))
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
;
CREATE OR REPLACE PROCEDURE EXAMPLE ()
RETURNS STRING
LANGUAGE JAVASCRIPT
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
EXECUTE AS CALLER
AS
$$
// SnowConvert AI Helpers Code section is omitted.
let C1 = new CURSOR(`SELECT * FROM
TABLE1`,() => []);
C1.OPEN();
// ** SSC-EWI-0023 - PERFORMANCE REVIEW - THIS LOOP CONTAINS AN INSERT, DELETE OR UPDATE STATEMENT **
while ( C1.NEXT() ) {
let REC1 = C1.CURRENT;
EXEC(`insert into TABLE2
values (TO_CHAR(REC1.COL1::DATE, 'DD-MM-YYYY'))`,[REC1.COL1]);
}
C1.CLOSE();
$$;
ベストプラクティス¶
バインディングに日付、時刻、またはタイムスタンプへのキャストが必要かどうかを確認します。値に対して暗黙的な変換が行われるため、必要ないケースもあります。
さらにサポートが必要な場合は、[snowconvert-support@snowflake.com](mailto:snowconvert-support@snowflake.com)までメールでお問い合わせください。
SSC-EWI-0027¶
次のステートメントでは、無効なクエリで変数/リテラルを使用しているため、実行されません。
注釈
わかりやすくするため、出力コードの一部を省略しています。
重大性¶
中
説明¶
この警告は、特定のステートメントが無効なクエリで変数またはリテラルを使用しており、そのために実行されないことを報告するために使用されます。
コード例¶
入力コード: ¶
REPLACE PROCEDURE TEST.COLLECT_STATS ()
BEGIN
COLLECT STATS ON DBC.AccessRights COLUMN(COLNAME);
SET STATS_STATEMENT = 'COLLECT STATS ON ' || OUT_DB || '.' || OUT_TBL || ' COLUMN(' || C4.ColumnName || ');';
EXECUTE IMMEDIATE STATS_STATEMENT;
EXECUTE IMMEDIATE 'COLLECT STATS ON DBC.AccessRights COLUMN(COLNAME);';
SET STATS_STATEMENT_NOT_DYNAMIC = 'COLLECT STATS ON DBC.AccessRights COLUMN(COLNAME);';
EXECUTE IMMEDIATE STATS_STATEMENT_NOT_DYNAMIC;
END;
;
生成されたコード:¶
CREATE OR REPLACE PROCEDURE TEST.COLLECT_STATS ()
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"teradata"}}'
EXECUTE AS CALLER
AS
$$
BEGIN
-- --** SSC-FDM-0027 - REMOVED NEXT STATEMENT, NOT APPLICABLE IN SNOWFLAKE. COLLECT **
-- COLLECT STATS ON DBC.AccessRights COLUMN(COLNAME);
STATS_STATEMENT := 'COLLECT STATS ON ' || OUT_DB || '.' || OUT_TBL || ' COLUMN(' || C4.ColumnName || ')';
!!!RESOLVE EWI!!! /*** SSC-EWI-0027 - THE FOLLOWING STATEMENT USES A VARIABLE/LITERAL WITH AN INVALID QUERY AND IT WILL NOT BE EXECUTED ***/!!!!!!RESOLVE EWI!!! /*** SSC-EWI-0030 - THE STATEMENT BELOW HAS USAGES OF DYNAMIC SQL. ***/!!!
EXECUTE IMMEDIATE STATS_STATEMENT;
!!!RESOLVE EWI!!! /*** SSC-EWI-0027 - THE FOLLOWING STATEMENT USES A VARIABLE/LITERAL WITH AN INVALID QUERY AND IT WILL NOT BE EXECUTED ***/!!!!!!RESOLVE EWI!!! /*** SSC-EWI-0030 - THE STATEMENT BELOW HAS USAGES OF DYNAMIC SQL. ***/!!!
EXECUTE IMMEDIATE 'COLLECT STATS ON DBC.AccessRights COLUMN(COLNAME)';
STATS_STATEMENT_NOT_DYNAMIC := 'COLLECT STATS ON DBC.AccessRights COLUMN(COLNAME)';
!!!RESOLVE EWI!!! /*** SSC-EWI-0027 - THE FOLLOWING STATEMENT USES A VARIABLE/LITERAL WITH AN INVALID QUERY AND IT WILL NOT BE EXECUTED ***/!!!!!!RESOLVE EWI!!! /*** SSC-EWI-0030 - THE STATEMENT BELOW HAS USAGES OF DYNAMIC SQL. ***/!!!
EXECUTE IMMEDIATE STATS_STATEMENT_NOT_DYNAMIC;
END;
$$;
ベストプラクティス¶
バインディングに日付、時刻、またはタイムスタンプへのキャストが必要かどうかを確認します。値に対して暗黙的な変換が行われるため、必要ないケースもあります。
さらにサポートが必要な場合は、[snowconvert-support@snowflake.com](mailto:snowconvert-support@snowflake.com)までメールでお問い合わせください。
SSC-EWI-0028¶
Snowflakeがサポートしていない型
重大性¶
中
説明¶
このメッセージは、型がSnowflakeでサポートされていない場合に表示されます。
例¶
入力コード(Oracle):¶
CREATE TABLE MYTABLE
(
COL1 SYS.ANYDATASET
);
生成されたコード:¶
CREATE OR REPLACE TABLE MYTABLE
(
!!!RESOLVE EWI!!! /*** SSC-EWI-0028 - TYPE NOT SUPPORTED BY SNOWFLAKE ***/!!!
COL1 SYS.ANYDATASET
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"oracle"}}'
;
ベストプラクティス¶
さらにサポートが必要な場合は、[snowconvert-support@snowflake.com](mailto:snowconvert-support@snowflake.com)までメールでお問い合わせください。
SSC-EWI-0029¶
snowflakeでサポートされていない外部テーブルデータ形式
重大性¶
中
説明¶
Snowflakeは以下の外部テーブル形式をサポートしています。
BigQuery |
Snowflake |
|---|---|
AVRO |
AVRO |
CSV |
CSV |
NEWLINE_DELIMITED_JSON |
JSON |
ORC |
ORC |
PARQUET |
PARQUET |
外部テーブルが上記の表で指定されていない他のFORMAT を持つ場合、このEWI が生成され、FORMAT がサポートされていないことをユーザーに通知します。
コード例¶
入力コード:¶
BigQuery¶
CREATE OR REPLACE EXTERNAL TABLE test.backup_restore_table
OPTIONS (
format = 'DATASTORE_BACKUP',
uris = ['gs://backup_bucket/backup_folder/*']
);
生成されたコード:¶
Snowflake¶
!!!RESOLVE EWI!!! /*** SSC-EWI-0029 - EXTERNAL TABLE DATA FORMAT NOT SUPPORTED IN SNOWFLAKE ***/!!!
CREATE OR REPLACE EXTERNAL TABLE test.backup_restore_table 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_BACKUP_RESTORE_TABLE_FORMAT'))
)
!!!RESOLVE EWI!!! /*** SSC-EWI-0032 - EXTERNAL TABLE REQUIRES AN EXTERNAL STAGE TO ACCESS gs://backup_bucket, DEFINE AND REPLACE THE EXTERNAL_STAGE PLACEHOLDER ***/!!!
LOCATION = @EXTERNAL_STAGE
AUTO_REFRESH = false
PATTERN = 'backup_folder/.*'
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "bigquery", "convertedOn": "07/16/2025", "domain": "no-domain-provided" }}';
ベストプラクティス¶
さらにサポートが必要な場合は、[snowconvert-support@snowflake.com](mailto:snowconvert-support@snowflake.com)までメールでお問い合わせください。
SSC-EWI-0030¶
以下のステートメントには、動的 SQL を使用しています
注釈
わかりやすくするため、出力コードの一部を省略しています。
重大性¶
中
説明¶
このエラーは、ステートメントが動的 SQL を使用していることを示すために使用されます。特定のソース言語にはそれぞれ、動的 SQL を実行できるステートメントのセットがあります。動的 SQL とは、データベースエンジン言語が提供する文字列操作ツールを使ってテキストとして構築されるコードを指します。
このシナリオは、動的 SQL が実行時に構築および実行されるため、エラーの追跡やデバッグが難しくなり、複雑なパターンであると考えられます。このエラーは、Snow Convertのような静的コード解析ツールでは発見できない問題を発見するための補助的なものです。
コード例¶
Teradata¶
入力¶
REPLACE PROCEDURE teradata_dynamic_sql()
BEGIN
DECLARE str_sql VARCHAR(20);
SET str_sql = 'UPDATE TABLE
SET COLA = 0,
COLB = ''test''';
EXECUTE IMMEDIATE str_sql;
EXECUTE IMMEDIATE 'INSERT INTO TABLE1(COL1) VALUES(1)';
EXECUTE str_sql;
CALL DBC.SysExecSQL('INSERT INTO TABLE1(COL1) VALUES(1)');
END;
出力¶
CREATE OR REPLACE PROCEDURE teradata_dynamic_sql ()
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
str_sql VARCHAR(20);
BEGIN
str_sql := 'UPDATE "TABLE"
SET COLA = 0,
COLB = ''test''';
!!!RESOLVE EWI!!! /*** SSC-EWI-0030 - THE STATEMENT BELOW HAS USAGES OF DYNAMIC SQL. ***/!!!
EXECUTE IMMEDIATE str_sql;
!!!RESOLVE EWI!!! /*** SSC-EWI-0030 - THE STATEMENT BELOW HAS USAGES OF DYNAMIC SQL. ***/!!!
EXECUTE IMMEDIATE 'INSERT INTO TABLE1 (COL1)
VALUES (1);';
!!!RESOLVE EWI!!! /*** SSC-EWI-0030 - THE STATEMENT BELOW HAS USAGES OF DYNAMIC SQL. ***/!!!
EXECUTE IMMEDIATE str_sql;
!!!RESOLVE EWI!!! /*** SSC-EWI-0030 - THE STATEMENT BELOW HAS USAGES OF DYNAMIC SQL. ***/!!!
EXECUTE IMMEDIATE 'INSERT INTO TABLE1 (COL1)
VALUES (1);';
END;
$$;
Oracle¶
入力¶
CREATE OR REPLACE PROCEDURE oracle_dynamic_sql
AS
dynamic_statement VARCHAR(100);
numeric_variable INTEGER;
dynamic_statement VARCHAR(100);
column_variable VARCHAR(100);
cursor_variable SYS_REFCURSOR;
c INTEGER;
dynamic_statement VARCHAR(100);
BEGIN
dynamic_statement := 'INSERT INTO sample_table(col1) VALUES(1)';
numeric_variable := 3;
column_variable := 'col1';
EXECUTE IMMEDIATE dynamic_statement;
EXECUTE IMMEDIATE 'INSERT INTO sample_table(col1) VALUES(' || numeric_variable || ')';
OPEN cursor_variable FOR dynamic_statement;
OPEN cursor_variable FOR 'SELECT ' || column_variable || ' FROM sample_table';
OPEN cursor_variable FOR 'SELECT col1 FROM sample_table';
c := DBMS_SQL.OPEN_CURSOR;
dynamic_statement := 'SELECT * FROM sample_table';
DBMS_SQL.PARSE(c, dynamic_statement);
END;
出力¶
CREATE OR REPLACE PROCEDURE oracle_dynamic_sql ()
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"oracle"}}'
EXECUTE AS CALLER
AS
$$
DECLARE
dynamic_statement VARCHAR(100);
numeric_variable INTEGER;
dynamic_statement VARCHAR(100);
column_variable VARCHAR(100);
cursor_variable_res RESULTSET;
c INTEGER;
dynamic_statement VARCHAR(100);
BEGIN
dynamic_statement := 'INSERT INTO sample_table(col1) VALUES(1)';
numeric_variable := 3;
column_variable := 'col1';
!!!RESOLVE EWI!!! /*** SSC-EWI-0030 - THE STATEMENT BELOW HAS USAGES OF DYNAMIC SQL. ***/!!!
EXECUTE IMMEDIATE :dynamic_statement;
!!!RESOLVE EWI!!! /*** SSC-EWI-0030 - THE STATEMENT BELOW HAS USAGES OF DYNAMIC SQL. ***/!!!
EXECUTE IMMEDIATE 'INSERT INTO sample_table(col1) VALUES(' || NVL(:numeric_variable :: STRING, '') || ')';
!!!RESOLVE EWI!!! /*** SSC-EWI-0030 - THE STATEMENT BELOW HAS USAGES OF DYNAMIC SQL. ***/!!!
cursor_variable_res := (
EXECUTE IMMEDIATE :dynamic_statement
);
LET cursor_variable CURSOR
FOR
cursor_variable_res;
OPEN cursor_variable;
!!!RESOLVE EWI!!! /*** SSC-EWI-0030 - THE STATEMENT BELOW HAS USAGES OF DYNAMIC SQL. ***/!!!
cursor_variable_res := (
EXECUTE IMMEDIATE 'SELECT ' || NVL(:column_variable :: STRING, '') || ' FROM
sample_table'
);
!!!RESOLVE EWI!!! /*** SSC-EWI-OR0133 - THE CURSOR VARIABLE NAMED 'cursor_variable' HAS ALREADY BEEN ASSIGNED IN ANOTHER CURSOR ***/!!!
LET cursor_variable CURSOR
FOR
cursor_variable_res;
OPEN cursor_variable;
!!!RESOLVE EWI!!! /*** SSC-EWI-0030 - THE STATEMENT BELOW HAS USAGES OF DYNAMIC SQL. ***/!!!
cursor_variable_res := (
EXECUTE IMMEDIATE 'SELECT col1 FROM
sample_table'
);
!!!RESOLVE EWI!!! /*** SSC-EWI-OR0133 - THE CURSOR VARIABLE NAMED 'cursor_variable' HAS ALREADY BEEN ASSIGNED IN ANOTHER CURSOR ***/!!!
LET cursor_variable CURSOR
FOR
cursor_variable_res;
OPEN cursor_variable;
c :=
!!!RESOLVE EWI!!! /*** SSC-EWI-OR0076 - TRANSLATION FOR BUILT-IN PACKAGE 'DBMS_SQL.OPEN_CURSOR' IS NOT CURRENTLY SUPPORTED. ***/!!!
'' AS OPEN_CURSOR;
dynamic_statement := 'SELECT * FROM
sample_table';
!!!RESOLVE EWI!!! /*** SSC-EWI-OR0076 - TRANSLATION FOR BUILT-IN PACKAGE 'DBMS_SQL.PARSE' IS NOT CURRENTLY SUPPORTED. ***/!!!!!!RESOLVE EWI!!! /*** SSC-EWI-0030 - THE STATEMENT BELOW HAS USAGES OF DYNAMIC SQL. ***/!!!
DBMS_SQL.PARSE(:c, :dynamic_statement);
END;
$$;
SQL Server¶
入力¶
CREATE OR ALTER PROCEDURE transact_dynamic_sql
AS
BEGIN
DECLARE @dynamicStatement AS VARCHAR(200);
DECLARE @numericVariable AS VARCHAR(200);
SET @dynamicStatement = 'INSERT INTO sample_table(col1) VALUES(1);';
SET @numericVariable = '3';
EXECUTE (@dynamicStatement);
EXEC ('INSERT INTO sampleTable(col1) VALUES (' + @numericVariable + ');');
EXECUTE ('INSERT INTO sampleTable(col1) VALUES(10);') AS USER = 'DbAdmin';
INSERT INTO sampleTable EXECUTE sp_executesql @statement = 'SELECT * FROM sampleTable;';
INSERT INTO sampleTable EXECUTE ('SELECT * FROM sampleTable;');
END;
出力¶
CREATE OR REPLACE PROCEDURE transact_dynamic_sql ()
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "transact", "convertedOn": "11/13/2024", "domain": "test" }}'
EXECUTE AS CALLER
AS
$$
DECLARE
DYNAMICSTATEMENT VARCHAR(200);
NUMERICVARIABLE VARCHAR(200);
BEGIN
DYNAMICSTATEMENT := 'INSERT INTO sample_table (col1) VALUES(1);';
NUMERICVARIABLE := '3';
!!!RESOLVE EWI!!! /*** SSC-EWI-0030 - THE STATEMENT BELOW HAS USAGES OF DYNAMIC SQL. ***/!!!
EXECUTE IMMEDIATE :DYNAMICSTATEMENT;
!!!RESOLVE EWI!!! /*** SSC-EWI-0030 - THE STATEMENT BELOW HAS USAGES OF DYNAMIC SQL. ***/!!!
EXECUTE IMMEDIATE 'INSERT INTO sampleTable (col1) VALUES (' || :NUMERICVARIABLE || ');';
!!!RESOLVE EWI!!! /*** SSC-EWI-0030 - THE STATEMENT BELOW HAS USAGES OF DYNAMIC SQL. ***/!!!!!!RESOLVE EWI!!! /*** SSC-EWI-0021 - EXECUTE AS USER/LOGIN NOT SUPPORTED IN SNOWFLAKE ***/!!!
EXECUTE IMMEDIATE 'INSERT INTO sampleTable (col1) VALUES(10);';
!!!RESOLVE EWI!!! /*** SSC-EWI-0030 - THE STATEMENT BELOW HAS USAGES OF DYNAMIC SQL. ***/!!!!!!RESOLVE EWI!!! /*** SSC-EWI-0073 - PENDING FUNCTIONAL EQUIVALENCE REVIEW FOR 'INSERT WITH EXECUTE' NODE ***/!!!
INSERT INTO sampleTable EXECUTE IMMEDIATE 'SELECT
*
FROM
sampleTable;';
!!!RESOLVE EWI!!! /*** SSC-EWI-0030 - THE STATEMENT BELOW HAS USAGES OF DYNAMIC SQL. ***/!!!!!!RESOLVE EWI!!! /*** SSC-EWI-0073 - PENDING FUNCTIONAL EQUIVALENCE REVIEW FOR 'INSERT WITH EXECUTE' NODE ***/!!!
INSERT INTO sampleTable EXECUTE IMMEDIATE 'SELECT
*
FROM
sampleTable;';
END;
$$;
動的 SQL の内部の問題¶
考慮すべき重要な点は、動的 SQL のコードを移行する際、SnowConvert AI は、出力コードや評価レポートにおいて、動的 SQL 内部のいかなるタイプの問題も報告しないということです。問題のドキュメントや変換仕様書に、問題が常に出力コードに追加されることが記載されている場合でも、この問題は発生します。この状況が発生する可能性があるOracleでの移行の例を次に示します。
Oracle¶
SELECT dbms_random.value() FROM dual;
CREATE OR REPLACE PROCEDURE dynamic_sql_procedure
AS
result VARCHAR(100) := 'SELECT dbms_random.value() from dual';
BEGIN
NULL;
END;
Snowflake¶
SELECT
--** SSC-FDM-OR0033 - DBMS_RANDOM.VALUE DIGITS OF PRECISION ARE LOWER IN SNOWFLAKE **
DBMS_RANDOM.VALUE_UDF() FROM dual;
CREATE OR REPLACE PROCEDURE dynamic_sql_procedure ()
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
EXECUTE AS CALLER
AS
$$
DECLARE
result VARCHAR(100) := 'SELECT
DBMS_RANDOM.VALUE_UDF() from dual';
BEGIN
NULL;
END;
$$;
先ほどの例では、クエリとプロシージャ内の変数代入はまったく同じように変換されます。違いは、動的 SQL コードでは、変換の問題が出力コードと評価レポートに表示されないことです。
ベストプラクティス¶
このタグを使用して、動的にビルドされたステートメントをすべて追跡し、トラブルシューティング時にその正確性を確認します。
さらにサポートが必要な場合は、[snowconvert-support@snowflake.com](mailto:snowconvert-support@snowflake.com)までメールでお問い合わせください。
SSC-EWI-0031¶
機能がサポートされていません。
注釈
わかりやすくするため、出力コードの一部を省略しています。
重大度¶
中
説明¶
この警告は、Teradata、Oracle、SQL Server の特定の 組み込み関数 がサポートされていないことを報告するために使用されます。
コード例 ¶
入力コード(オラクル):¶
SELECT VALUE(ST) FROM SampleTable ST;
出力コード: ¶
// SnowConvert AI Helpers Code section is omitted.
SELECT
!!!RESOLVE EWI!!! /*** SSC-EWI-0031 - VALUE FUNCTION NOT SUPPORTED ***/!!!
VALUE(ST) FROM
SampleTable ST;
ベストプラクティス ¶
変換しようとしている特定の関数の現在の変換を確認するには、以下のリンクを参照してください。
[Oracle組み込み関数](../../../../translation-references/oracle/functions/README.md)
[Teradata組み込み関数](../../../../translation-references/teradata/sql-translation-reference/teradata-built-in-functions.md)
[SQL サーバー組み込み関数](../../../../translation-references/transact/transact-built-in-functions.md)
さらにサポートが必要な場合は、[snowconvert-support@snowflake.com](mailto:snowconvert-support@snowflake.com)までメールでお問い合わせください。
SSC-EWI-0032¶
外部テーブルは、外部の場所にアクセスし、EXTERNAL_STAGE プレースホルダーを定義して置き換えるための外部ステージが必要です
説明¶
CREATE EXTERNAL TABLE ステートメントを変換すると、SnowConvert AI は EXTERNAL _STAGE プレースホルダーを生成します。これは、Snowflakeから外部の場所に接続するために作成された外部ステージに置き換える必要があります。
以下のガイドを参照して、Snowflakeアカウントで必要なストレージ統合と外部ステージを設定してください。
[Amazon S3を参照する外部テーブルの場合](https://docs.snowflake.com/ja/user-guide/tables-external-s3)
[Google Cloud Storageを参照する外部テーブルの場合](https://docs.snowflake.com/ja/user-guide/tables-external-gcs)
[Azure Blob Storageを参照する外部テーブルの場合](https://docs.snowflake.com/ja/user-guide/tables-external-azure)
コード例¶
入力コード:¶
BigQuery¶
CREATE OR REPLACE EXTERNAL TABLE test.Employees_test
(
Employee_id INTEGER,
Name STRING,
Mail STRING,
Position STRING,
Salary INTEGER
)
OPTIONS(
FORMAT='CSV',
SKIP_LEADING_ROWS=1,
URIS=['gs://sc_external_table_bucket/folder_with_csv/Employees.csv']
);
生成されたコード:¶
Snowflake¶
CREATE OR REPLACE EXTERNAL TABLE test.Employees_test
(
Employee_id INTEGER AS CAST(GET_IGNORE_CASE($1, 'c1') AS INTEGER),
Name STRING AS CAST(GET_IGNORE_CASE($1, 'c2') AS STRING),
Mail STRING AS CAST(GET_IGNORE_CASE($1, 'c3') AS STRING),
Position STRING AS CAST(GET_IGNORE_CASE($1, 'c4') AS STRING),
Salary INTEGER AS CAST(GET_IGNORE_CASE($1, 'c5') AS INTEGER)
)
!!!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_csv/Employees.csv'
FILE_FORMAT = (TYPE = CSV SKIP_HEADER =1);
ベストプラクティス¶
Snowflakeアカウントで外部接続を設定し、EXTERNAL_STAGE プレースホルダーを置き換えて変換を完了します。
さらにサポートが必要な場合は、[snowconvert-support@snowflake.com](mailto:snowconvert-support@snowflake.com)までメールでお問い合わせください。
SSC-EWI-0033¶
形式が削除され、セマンティック情報が見つかりません。
注釈
わかりやすくするため、出力コードの一部を省略しています。
重大性¶
低
説明¶
この警告は、特定の出力形式を持つ CAST 関数で使用されている列がソースコード内に見つからなかった場合に表示されます。
コード例¶
入力コード(Teradata):¶
CREATE VIEW SampleView AS
SELECT
DAY_DATE(FORMAT 'MMM-YYYY')(CHAR(8))
FROM
SampleTable;
生成コード: ¶
// SnowConvert AI Helpers Code section is omitted.
CREATE OR REPLACE VIEW SampleView
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"teradata"}}'
AS
SELECT
CAST(RPAD(TO_VARCHAR(
DAY_DATE !!!RESOLVE EWI!!! /*** SSC-EWI-0033 - FORMAT 'MMM-YYYY' REMOVED, SEMANTIC INFORMATION NOT FOUND. ***/!!!), 8) AS CHAR(8))
FROM
SampleTable;
ベストプラクティス¶
プロシージャステートメントに関連するすべての依存関係(テーブルとビュー)が移行されていることを確認してください。
さらにサポートが必要な場合は、[snowconvert-support@snowflake.com](mailto:snowconvert-support@snowflake.com)までメールでお問い合わせください。
SSC-EWI-0034¶
形式は削除されました。
注釈
わかりやすくするため、出力コードの一部を省略しています。
重大性¶
低
説明¶
この警告は、CAST 関数で使用されている列の形式が削除された場合に表示されます。
コード例¶
入力コード(Teradata):¶
CREATE VIEW SampleView AS
SELECT
DAY_DATE(FORMAT 'MMM-YYYY') + 1
FROM
SampleTable;
生成コード: ¶
// SnowConvert AI Helpers Code section is omitted.
CREATE OR REPLACE VIEW SampleView
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"teradata"}}'
AS
SELECT
DAY_DATE !!!RESOLVE EWI!!! /*** SSC-EWI-0034 - FORMAT 'MMM-YYYY' REMOVED. ***/!!! + 1
FROM
SampleTable;
ベストプラクティス¶
さらにサポートが必要な場合は、[snowconvert-support@snowflake.com](mailto:snowconvert-support@snowflake.com)までメールでお問い合わせください。
SSC-EWI-0035¶
チェックステートメントはサポートされていません。
注釈
わかりやすくするため、出力コードの一部を省略しています。
重大性¶
低
説明¶
CHECK 制約はSnowflakeではサポートされていませんが、機能的には影響ありません。
コード例¶
入力コードOracle:¶
CREATE TABLE "Schema"."BaseTable"(
"COLUMN1" VARCHAR2(255),
CHECK ( COLUMN1 IS NOT NULL )
);
生成コード: ¶
CREATE OR REPLACE TABLE "Schema"."BaseTable" (
"COLUMN1" VARCHAR(255),
!!!RESOLVE EWI!!! /*** SSC-EWI-0035 - CHECK STATEMENT NOT SUPPORTED ***/!!!
CHECK ( COLUMN1 IS NOT NULL )
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"oracle"}}'
;
入力コードTeradata: ¶
CREATE TABLE TABLE1,
NO FALLBACK,
NO BEFORE JOURNAL,
NO AFTER JOURNAL
(
COL0 BYTEINT,
CONSTRAINT constraint_name CHECK (COL1 < COL2)
)
生成コード: ¶
CREATE OR REPLACE TABLE TABLE1
(
COL0 BYTEINT,
!!!RESOLVE EWI!!! /*** SSC-EWI-0035 - CHECK STATEMENT NOT SUPPORTED ***/!!!
CONSTRAINT constraint_name CHECK (COL1 < COL2)
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"teradata"}}'
;
入力コード SqlServer¶
ALTER TABLE table_name2
ADD column_name VARCHAR(255)
CONSTRAINT constraint_name
CHECK NOT FOR REPLICATION (column_name > 1);
生成されたコード:¶
ALTER TABLE IF EXISTS table_name2
ADD column_name VARCHAR(255)
!!!RESOLVE EWI!!! /*** SSC-EWI-0035 - CHECK STATEMENT NOT SUPPORTED ***/!!!
CONSTRAINT constraint_name
CHECK NOT FOR REPLICATION (column_name > 1);
ベストプラクティス¶
さらにサポートが必要な場合は、[snowconvert-support@snowflake.com](mailto:snowconvert-support@snowflake.com)までメールでお問い合わせください。
SSC-EWI-0036¶
データ型が別のデータ型に変換されました。
重大性¶
低
説明¶
この警告は、あるデータ型が別のデータ型に変更されたときに表示されます。
コード例¶
ソースコード:¶
CREATE TABLE SampleTable (
SampleYear INTERVAL YEAR(2),
SampleMonth INTERVAL MONTH(2)
);
変換コード: ¶
CREATE OR REPLACE TABLE SampleTable (
SampleYear VARCHAR(21) !!!RESOLVE EWI!!! /*** SSC-EWI-0036 - INTERVAL YEAR(2) DATA TYPE CONVERTED TO VARCHAR ***/!!!,
SampleMonth VARCHAR(21) !!!RESOLVE EWI!!! /*** SSC-EWI-0036 - INTERVAL MONTH(2) DATA TYPE CONVERTED TO VARCHAR ***/!!!
)
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "teradata", "convertedOn": "07/23/2024" }}'
;
ベストプラクティス¶
さらにサポートが必要な場合は、[snowconvert-support@snowflake.com](mailto:snowconvert-support@snowflake.com)までメールでお問い合わせください。
SSC-EWI-0040¶
句はサポートされていません。
注釈
わかりやすくするため、出力コードの一部を省略しています。
重大性¶
低
説明¶
この警告は、SnowFlake でサポートされていないステートメントがあるときに追加されます。
コード例¶
以下の例では、SELECT クエリで SQL サーバーのPERCENT 句が使用されていますが、これはSnowflakeではサポートされていません。
入力コード(SQL サーバー):¶
SELECT TOP 1 PERCENT * FROM SampleTable;
ソースコード: ¶
// SnowConvert AI Helpers Code section is omitted.
SELECT
TOP 1 !!!RESOLVE EWI!!! /*** SSC-EWI-0040 - THE 'TOP PERCENT' CLAUSE IS NOT SUPPORTED IN SNOWFLAKE ***/!!!
*
FROM
SampleTable;
ベストプラクティス¶
ステートメントの本来の機能を確認し、Snowflakeの特定のニーズに実際に必要かどうかを確認してください。
さらにサポートが必要な場合は、[snowconvert-support@snowflake.com](mailto:snowconvert-support@snowflake.com)までメールでお問い合わせください。
SSC-EWI-0041¶
ファイルに予期しないエンコードが使用されており、変換されませんでした
注釈
この EWI は非推奨です。[SSC-OOS-0001](../out-of-scope/generalOOS.md#ssc-oos-0001)ドキュメントを参照してください。
説明¶
この問題は、ソースコードファイルのエンコード形式がツールで認識できない場合に発生します。文字エンコーディングは、グラフィカル文字(この文脈では人間の言語で書かれた文字)に数字を割り当てるプロセスであるため、このエラーは変換ツールが特定の文字を認識できなかったことを示しています。
ベストプラクティス¶
このエラーを避けるには、入力フォルダー内のすべてのファイルのエンコードを同じにする必要があります。
適切なエンコードは、変換設定で選択するか、[CLI](./../../user-guide/snowconvert/how-to-use-the-snowconvert-cli)の--encoding変換パラメーターを使用して選択する必要があります。選択するエンコーディングを決定するには、[Free Online Formater](https://freeonlineformatter.com/encoding-string)などのオンラインツールを使用するか、LinuxまたはOS の場合は
file -i *のコマンドを実行します。さらにサポートが必要な場合は、[snowconvert-support@snowflake.com](mailto:snowconvert-support@snowflake.com)までメールでお問い合わせください。
SSC-EWI-0045¶
列名はSnowflake予約キーワードです。
重大性¶
中
説明¶
場合によっては、ソース言語で有効な列名がSnowflakeの予約キーワードと競合することがあります。このような競合は、Snowflakeが特別な処理をしなければ列名として直接使用できないキーワードのセットを予約しているために発生します。詳細については、Snowflakeの公式ドキュメント[予約および制限されたキーワード](https://docs.snowflake.com/ja/sql-reference/reserved-keywords)を参照してください。
コード例¶
入力¶
CREATE TABLE T1
(
LOCALTIME VARCHAR,
CURRENT_USER VARCHAR
);
出力¶
CREATE OR REPLACE TABLE T1
(
!!!RESOLVE EWI!!! /*** SSC-EWI-0045 - COLUMN NAME 'LOCALTIME' IS A SNOWFLAKE RESERVED KEYWORD ***/!!!
"LOCALTIME" VARCHAR,
!!!RESOLVE EWI!!! /*** SSC-EWI-0045 - 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"}}'
;
ベストプラクティス¶
Snowflakeでサポートされていない名前を使用している列名の変更を検討してください。
さらにサポートが必要な場合は、[snowconvert-support@snowflake.com](mailto:snowconvert-support@snowflake.com)までメールでお問い合わせください。
SSC-EWI-0046¶
ネストされた関数/プロシージャの宣言は複雑なパターンとみなされ、snowflakeではサポートされていません。
重大性¶
Critical
説明¶
Snowflakeはネストされた関数/プロシージャの宣言をサポートしていないため、ネストされた宣言が見つかったcreate functionまたはcreate procedureステートメントにこの警告が追加されます。
コード例¶
入力¶
CREATE OR REPLACE FUNCTION myFunction
RETURN INTEGER
IS
total_count INTEGER;
-- Function Declaration
FUNCTION function_declaration(param1 VARCHAR) RETURN INTEGER;
FUNCTION function_definition
RETURN INTEGER
IS
count INTEGER;
PROCEDURE procedure_declaration(param1 INTEGER)
IS
BEGIN
NULL;
END;
BEGIN
RETURN count;
end;
BEGIN
-- Your logic to calculate the total employee count goes here
RETURN total_count;
END;
出力¶
!!!RESOLVE EWI!!! /*** SSC-EWI-0046 - NESTED FUNCTION/PROCEDURE DECLARATIONS ARE NOT SUPPORTED IN SNOWFLAKE. ***/!!!
CREATE OR REPLACE FUNCTION myFunction ()
RETURNS FLOAT
LANGUAGE JAVASCRIPT
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "oracle", "convertedOn": "12/16/2024", "domain": "test" }}'
AS
$$
let TOTAL_COUNT;
!!!RESOLVE EWI!!! /*** SSC-EWI-OR0057 - TRANSFORMATION FOR NESTED FUNCTION IS NOT SUPPORTED IN THIS SCENARIO ***/!!!
/* -- Function Declaration
FUNCTION function_declaration(param1 VARCHAR) RETURN INTEGER; */
// Function Declaration
;
!!!RESOLVE EWI!!! /*** SSC-EWI-OR0057 - TRANSFORMATION FOR NESTED FUNCTION IS NOT SUPPORTED IN THIS SCENARIO ***/!!!
/* FUNCTION function_definition
RETURN INTEGER
IS
count INTEGER;
PROCEDURE procedure_declaration(param1 INTEGER)
IS
BEGIN
NULL;
END;
BEGIN
RETURN count;
end; */
;
// Your logic to calculate the total employee count goes here
return TOTAL_COUNT;
$$;
ベストプラクティス¶
関数/プロシージャからネストされた宣言を削除します。
さらにサポートが必要な場合は、[snowconvert-support@snowflake.com](mailto:snowconvert-support@snowflake.com)までメールでお問い合わせください。
SSC-EWI-0049¶
グローバル仮テーブルが参照されています。
注釈
この EWI は非推奨です。[SSC-FDM-0023](../functional-difference/generalFDM.md#ssc-fdm-0023)ドキュメントを参照してください。
重大性¶
中
説明¶
SnowConvert AI はグローバル仮テーブルを通常のテーブル作成に変換します。これらのテーブルへの参照は、予想とは異なる動作をする可能性があります。
コード例¶
入力¶
create global temporary table t1
(col1 varchar);
create view view1 as
select col1 from t1;
出力¶
--** 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
!!!RESOLVE EWI!!! /*** SSC-EWI-0049 - A Global Temporary Table is being referenced ***/!!!
t1;
ベストプラクティス¶
さらにサポートが必要な場合は、[snowconvert-support@snowflake.com](mailto:snowconvert-support@snowflake.com)までメールでお問い合わせください。
SSC-EWI-0052¶
使用できないオブジェクト
重大性¶
中
説明¶
このエラーは、ソースコードがサポートされていないパラメーターや変数を使用しているか、変換ツールによって認識されなかった場合に発生します。
コード例¶
入力コード(Oracle):¶
-- Additional Params: -t JavaScript
CREATE OR REPLACE PROCEDURE PROCEDURE_PARAMETERS(PARAM SDO_GEOMETRY)
AS
VARIABLE SDO_GEOMETRY;
BEGIN
VARIABLE := PARAM;
END;
生成されたコード:¶
CREATE OR REPLACE PROCEDURE PROCEDURE_PARAMETERS (PARAM GEOMETRY)
RETURNS STRING
LANGUAGE JAVASCRIPT
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"oracle"}}'
EXECUTE AS CALLER
AS
$$
// REGION SnowConvert AI Helpers Code
var formatDate = (arg) => (new Date(arg - (arg.getTimezoneOffset() * 60000))).toISOString().slice(0,-1);
var fixBind = function (arg) {
arg = arg instanceof Date ? formatDate(arg) : IS_NULL(arg) ? null : arg;
return arg;
};
var SQL = {
FOUND : false,
NOTFOUND : false,
ROWCOUNT : 0,
ISOPEN : false
};
var _RS, _ROWS, SQLERRM = "normal, successful completion", SQLCODE = 0;
var getObj = (_rs) => Object.assign(new Object(),_rs);
var getRow = (_rs) => (values = Object.values(_rs)) && (values = values.splice(-1 * _rs.getColumnCount())) && values;
var fetch = (_RS,_ROWS,fmode) => _RS.getRowCount() && _ROWS.next() && (fmode ? getObj : getRow)(_ROWS) || (fmode ? new Object() : []);
var EXEC = function (stmt,binds,opts) {
try {
binds = !(arguments[1] instanceof Array) && ((opts = arguments[1]) && []) || (binds || []);
opts = opts || new Object();
binds = binds ? binds.map(fixBind) : binds;
_RS = snowflake.createStatement({
sqlText : stmt,
binds : binds
});
_ROWS = _RS.execute();
if (opts.sql !== 0) {
var isSelect = stmt.toUpperCase().trimStart().startsWith("SELECT");
var affectedRows = isSelect ? _RS.getRowCount() : _RS.getNumRowsAffected();
SQL.FOUND = affectedRows != 0;
SQL.NOTFOUND = affectedRows == 0;
SQL.ROWCOUNT = affectedRows;
}
if (opts.row === 2) {
return _ROWS;
}
var INTO = function (opts) {
if (opts.vars == 1 && _RS.getColumnCount() == 1 && _ROWS.next()) {
return _ROWS.getColumnValue(1);
}
if (opts.rec instanceof Object && _ROWS.next()) {
var recordKeys = Object.keys(opts.rec);
Object.assign(opts.rec,Object.fromEntries(new Map(getRow(_ROWS).map((element,Index) => [recordKeys[Index],element]))))
return opts.rec;
}
return fetch(_RS,_ROWS,opts.row);
};
var BULK_INTO_COLLECTION = function (into) {
for(let i = 0;i < _RS.getRowCount();i++) {
FETCH_INTO_COLLECTIONS(into,fetch(_RS,_ROWS,opts.row));
}
return into;
};
if (_ROWS.getRowCount() > 0) {
return _ROWS.getRowCount() == 1 ? INTO(opts) : BULK_INTO_COLLECTION(opts);
}
} catch(error) {
RAISE(error.code,error.name,error.message)
}
};
var RAISE = function (code,name,message) {
message === undefined && ([name,message] = [message,name])
var error = new Error(message);
error.name = name
SQLERRM = `${(SQLCODE = (error.code = code))}: ${message}`
throw error;
};
var FETCH_INTO_COLLECTIONS = function (collections,fetchValues) {
for(let i = 0;i < collections.length;i++) {
collections[i].push(fetchValues[i]);
}
};
var IS_NULL = (arg) => !(arg || arg === 0);
// END REGION
let VARIABLE = new SDO_GEOMETRY();
VARIABLE =
!!!RESOLVE EWI!!! /*** SSC-EWI-0052 - UNUSABLE OBJECT PARAM, ITS DATATYPE WAS NOT TRANSFORMED ***/!!!
PARAM;
$$;
ベストプラクティス¶
使用されているデータ型の代替を探します。
さらにサポートが必要な場合は、[snowconvert-support@snowflake.com](mailto:snowconvert-support@snowflake.com)までメールでお問い合わせください。
SSC-EWI-0053¶
オブジェクトが動作しない可能性があります。
重大性¶
低
説明¶
このエラーは、変換ツールが変数のデータ型を決定できなかった場合に発生します。これは、変数の宣言が欠落している可能性があるために起こる可能性があります。
コード例¶
入力コード(Oracle):¶
-- Additional Params: -t javascript
CREATE OR REPLACE PROCEDURE PROCEDURE_VARIABLES
AS
VARIABLE INTEGER;
BEGIN
VARIABLE := ANOTHER_VARIABLE;
END;
生成されたコード:¶
CREATE OR REPLACE PROCEDURE PROCEDURE_VARIABLES ()
RETURNS STRING
LANGUAGE JAVASCRIPT
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"oracle"}}'
EXECUTE AS CALLER
AS
$$
// REGION SnowConvert AI Helpers Code
var formatDate = (arg) => (new Date(arg - (arg.getTimezoneOffset() * 60000))).toISOString().slice(0,-1);
var fixBind = function (arg) {
arg = arg instanceof Date ? formatDate(arg) : IS_NULL(arg) ? null : arg;
return arg;
};
var SQL = {
FOUND : false,
NOTFOUND : false,
ROWCOUNT : 0,
ISOPEN : false
};
var _RS, _ROWS, SQLERRM = "normal, successful completion", SQLCODE = 0;
var getObj = (_rs) => Object.assign(new Object(),_rs);
var getRow = (_rs) => (values = Object.values(_rs)) && (values = values.splice(-1 * _rs.getColumnCount())) && values;
var fetch = (_RS,_ROWS,fmode) => _RS.getRowCount() && _ROWS.next() && (fmode ? getObj : getRow)(_ROWS) || (fmode ? new Object() : []);
var EXEC = function (stmt,binds,opts) {
try {
binds = !(arguments[1] instanceof Array) && ((opts = arguments[1]) && []) || (binds || []);
opts = opts || new Object();
binds = binds ? binds.map(fixBind) : binds;
_RS = snowflake.createStatement({
sqlText : stmt,
binds : binds
});
_ROWS = _RS.execute();
if (opts.sql !== 0) {
var isSelect = stmt.toUpperCase().trimStart().startsWith("SELECT");
var affectedRows = isSelect ? _RS.getRowCount() : _RS.getNumRowsAffected();
SQL.FOUND = affectedRows != 0;
SQL.NOTFOUND = affectedRows == 0;
SQL.ROWCOUNT = affectedRows;
}
if (opts.row === 2) {
return _ROWS;
}
var INTO = function (opts) {
if (opts.vars == 1 && _RS.getColumnCount() == 1 && _ROWS.next()) {
return _ROWS.getColumnValue(1);
}
if (opts.rec instanceof Object && _ROWS.next()) {
var recordKeys = Object.keys(opts.rec);
Object.assign(opts.rec,Object.fromEntries(new Map(getRow(_ROWS).map((element,Index) => [recordKeys[Index],element]))))
return opts.rec;
}
return fetch(_RS,_ROWS,opts.row);
};
var BULK_INTO_COLLECTION = function (into) {
for(let i = 0;i < _RS.getRowCount();i++) {
FETCH_INTO_COLLECTIONS(into,fetch(_RS,_ROWS,opts.row));
}
return into;
};
if (_ROWS.getRowCount() > 0) {
return _ROWS.getRowCount() == 1 ? INTO(opts) : BULK_INTO_COLLECTION(opts);
}
} catch(error) {
RAISE(error.code,error.name,error.message)
}
};
var RAISE = function (code,name,message) {
message === undefined && ([name,message] = [message,name])
var error = new Error(message);
error.name = name
SQLERRM = `${(SQLCODE = (error.code = code))}: ${message}`
throw error;
};
var FETCH_INTO_COLLECTIONS = function (collections,fetchValues) {
for(let i = 0;i < collections.length;i++) {
collections[i].push(fetchValues[i]);
}
};
var IS_NULL = (arg) => !(arg || arg === 0);
// END REGION
let VARIABLE;
VARIABLE =
!!!RESOLVE EWI!!! /*** SSC-EWI-0053 - OBJECT ANOTHER_VARIABLE MAY NOT WORK PROPERLY, ITS DATATYPE WAS NOT RECOGNIZED ***/!!!
ANOTHER_VARIABLE;
$$;
ベストプラクティス¶
入力コードに変数が宣言されていることを確認します。
さらにサポートが必要な場合は、[snowconvert-support@snowflake.com](mailto:snowconvert-support@snowflake.com)までメールでお問い合わせください。
SSC-EWI-0054¶
サポートされていない外部結合サブクエリ
注釈
わかりやすくするため、出力コードの一部を省略しています。
重大性¶
低
説明¶
このエラーは、OUTER JOIN(左、右、完全)の OR 論理式内に相関サブクエリがある場合に発生します。このような場合、一貫性のない結果が出たり、次のようなエラーが発生する可能性があります。
SQL コンパイルエラー。サポートされていないサブクエリ型は評価できません。
サブクエリに関するこれらの制限は、[Snowflakeドキュメント](https://docs.snowflake.com/ja/user-guide/querying-subqueries.html#limitations)で簡単に説明されており、それらに関する情報は[Snowflake フォーラム](https://community.snowflake.com/s/question/0D53r00009mIxwYCAS/sql-compilation-error-unsupported-subquery-type-cannot-be-evaluated)でも確認できます。
コード例¶
入力コード(Teradata):¶
SELECT a.Column1, b.Column2
FROM
TableA a
LEFT JOIN TableB b ON (a.Column1 = b.Column1)
AND (
a.Column2 = b.Column2
OR EXISTS(
SELECT * FROM Table3 c
WHERE c.Column1 = a.Column1
)
);
生成されたコード:¶
// SnowConvert AI Helpers Code section is omitted.
SELECT
a.Column1,
b.Column2
FROM
TableA a
LEFT JOIN
TableB b ON (a.Column1 = b.Column1)
AND (
a.Column2 = b.Column2
OR EXISTS
!!!RESOLVE EWI!!! /*** SSC-EWI-0054 - CORRELATED SUBQUERIES WITHIN AN OR EXPRESSION OF AN OUTER JOIN COULD CAUSE COMPILATION ERRORS ***/!!!(
SELECT
* FROM
Table3 c
WHERE c.Column1 = a.Column1
)
);
ベストプラクティス¶
出力コードがコンパイルエラーが発生しないことを確認します。
出力コードの機能的等価性を検証します。
さらにサポートが必要な場合は、[snowconvert-support@snowflake.com](mailto:snowconvert-support@snowflake.com)までメールでお問い合わせください。
SSC-EWI-0056¶
作成型はサポートされていません
重大性¶
低
説明¶
このメッセージは変換可能なカスタムタイプが定義されているときに表示され、コメントされている変換可能なカスタムタイプに関するフィードバックを追加します。
注釈
型定義はコメントされていますが、使用法の解決には引き続き考慮されます。詳しくは SSC-EWI-0062を参照してください。
コード例¶
入力コード(Oracle):¶
CREATE TYPE type1 AS OBJECT (column1 INT);
CREATE OR REPLACE PROCEDURE record_procedure
IS
TYPE record_typ IS RECORD(col1 INTEGER, col2 FLOAT);
BEGIN
NULL;
END;
生成されたコード:¶
!!!RESOLVE EWI!!! /*** SSC-EWI-0056 - CUSTOM TYPES ARE NOT SUPPORTED IN SNOWFLAKE BUT REFERENCES TO THIS CUSTOM TYPE WERE CHANGED TO VARIANT ***/!!!
CREATE TYPE type1 AS OBJECT (column1 INT)
;
CREATE OR REPLACE PROCEDURE record_procedure ()
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
EXECUTE AS CALLER
AS
$$
DECLARE
!!!RESOLVE EWI!!! /*** SSC-EWI-0056 - CUSTOM TYPES ARE NOT SUPPORTED IN SNOWFLAKE BUT REFERENCES TO THIS CUSTOM TYPE WERE CHANGED TO OBJECT ***/!!!
TYPE record_typ IS RECORD(col1 INTEGER, col2 FLOAT);
BEGIN
NULL;
END;
$$;
ベストプラクティス¶
エンドユーザーによる操作は必要ありません。
さらにサポートが必要な場合は、[snowconvert-support@snowflake.com](mailto:snowconvert-support@snowflake.com)までメールでお問い合わせください。
SSC-EWI-0058¶
機能は現在、Snowflakeスクリプトではサポートされていません
重大性¶
中
説明¶
このエラーは、作成プロシージャで使用されるステートメントが現在Snowflakeスクリプトでサポートされていない場合に発生します。
コード例¶
入力コード(Oracle):¶
CREATE OR REPLACE PROCEDURE PROC01
IS
number_variable INTEGER;
BEGIN
EXECUTE IMMEDIATE 'SELECT 1 FROM DUAL' INTO number_variable;
END;
生成されたコード:¶
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
!!!RESOLVE EWI!!! /*** SSC-EWI-0030 - THE STATEMENT BELOW HAS USAGES OF DYNAMIC SQL. ***/!!!
EXECUTE IMMEDIATE 'SELECT 1 FROM DUAL'
!!!RESOLVE EWI!!! /*** SSC-EWI-0058 - FUNCTIONALITY FOR 'EXECUTE IMMEDIATE RETURNING CLAUSE' IS NOT CURRENTLY SUPPORTED BY SNOWFLAKE SCRIPTING ***/!!!
INTO number_variable;
END;
$$;
ベストプラクティス¶
エンドユーザーの操作は必要ありません。
さらにサポートが必要な場合は、[snowconvert-support@snowflake.com](mailto:snowconvert-support@snowflake.com)までメールでお問い合わせください。
SSC-EWI-0062¶
カスタム型の使用法がバリアントに変更されました
重大性¶
低
説明¶
このメッセージはカスタムタイプが参照され、その使用法がバリアントに変更されたときに表示されます。
注釈
このメッセージは、SSC-EWI-0056 に大きく関連しています。
コード例¶
入力コード(Oracle):¶
CREATE TYPE type1 AS OBJECT(type1_column1 INT);
CREATE TABLE table1
(
column1 type1
);
生成されたコード:¶
!!!RESOLVE EWI!!! /*** SSC-EWI-0056 - CUSTOM TYPES ARE NOT SUPPORTED IN SNOWFLAKE BUT REFERENCES TO THIS CUSTOM TYPE WERE CHANGED TO VARIANT ***/!!!
CREATE TYPE type1 AS OBJECT(type1_column1 INT)
;
CREATE OR REPLACE TABLE table1
(
column1 VARIANT !!!RESOLVE EWI!!! /*** SSC-EWI-0062 - CUSTOM TYPE 'type1' USAGE CHANGED TO VARIANT ***/!!!
)
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "oracle", "convertedOn": "07/14/2025", "domain": "no-domain-provided" }}'
;
CREATE OR REPLACE VIEW table1_view
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "oracle", "convertedOn": "07/14/2025", "domain": "no-domain-provided" }}'
AS
SELECT
column1:type1_column1 :: VARCHAR AS type1_column1
FROM
table1;
ベストプラクティス¶
すべての入力データをバリアント準拠のデータ型に変換することも忘れないでください。
さらにサポートが必要な場合は、 snowconvert-support@snowflake.com までメールでお問い合わせください。
SSC-EWI-0064¶
クエリで参照されているカスタム型が見つかりません
重大性¶
高
説明¶
このエラーは、DML ステートメントのソースでカスタムタイプが定義されていない場合に発生します。たとえば、UDT の可能性があるテーブル列が定義されていない場合などです。
警告
DDL クエリで参照されたSSC-FDM-0015と混同しないでください。
コード例¶
入力コード(Oracle):¶
--Type was never defined
--CREATE TYPE type1;
CREATE TABLE table1
(
--the type will be unresolved
column1 type1
);
SELECT
column1
FROM table1;
生成されたコード:¶
--Type was never defined
--CREATE TYPE type1;
!!!RESOLVE EWI!!! /*** SSC-EWI-0050 - MISSING DEPENDENT OBJECT "type1" ***/!!!!!!RESOLVE EWI!!! /*** SSC-EWI-0063 - 'PUBLIC.table1_view' ADDED BECAUSE 'table1' USED A CUSTOM TYPE ***/!!!
CREATE OR REPLACE TABLE table1
(
--the type will be unresolved
column1 VARIANT !!!RESOLVE EWI!!! /*** SSC-EWI-0064 - REFERENCED CUSTOM TYPE 'type1' IN QUERY NOT FOUND, USAGES MAY BE AFFECTED ***/!!! /*** SSC-FDM-0015 - DATA TYPE 'type1' NOT RECOGNIZED ***/
);
CREATE OR REPLACE VIEW PUBLIC.table1_view
AS
SELECT
column1
FROM
table1;
SELECT
column1 !!!RESOLVE EWI!!! /*** SSC-EWI-0064 - REFERENCED CUSTOM TYPE 'type1' IN QUERY NOT FOUND, USAGES MAY BE AFFECTED ***/!!!
FROM
table1;
ベストプラクティス¶
参照された型が入力コードで定義されていることを確認します。
さらにサポートが必要な場合は、[snowconvert-support@snowflake.com](mailto:snowconvert-support@snowflake.com)までメールでお問い合わせください。
SSC-EWI-0066¶
式はSnowflakeではサポートされていません。
重大度¶
高
説明¶
このエラーは、特定の式がSnowflakeでサポートされていないことを通知するために使用されます。
コード例 ¶
入力コード:¶
SELECT * from T1 where (cast('2016-03-17' as DATE),
cast('2016-03-21' as DATE)) OVERLAPS
(cast('2016-03-20' as DATE), cast('2016-03-22' as DATE));
出力コード: ¶
SELECT * from
T1
where
!!!RESOLVE EWI!!! /*** SSC-EWI-0066 - EXPRESSION 'OVERLAPS' IS NOT SUPPORTED IN SNOWFLAKE. ***/!!! (cast('2016-03-17' as DATE),
cast('2016-03-21' as DATE)) OVERLAPS
(cast('2016-03-20' as DATE), cast('2016-03-22' as DATE));
ベストプラクティス ¶
さらにサポートが必要な場合は、[snowconvert-support@snowflake.com](mailto:snowconvert-support@snowflake.com)までメールでお問い合わせください。
SSC-EWI-0067¶
UDF がSnowflakeプロシージャに変換されたため、クエリ内でのプロシージャの呼び出しはサポートされていません。
重大性¶
高
説明¶
このエラーは、UDF (ユーザー定義関数)への呼び出しがクエリ内で見つかった場合に追加されます。Oracle UDFs および UDFs 内のパッケージと、一部の SQL サーバー UDFs は、Snowflake ストアドプロシージャに変換され、クエリから呼び出すことはできません。
関数は等価性を維持するためにストアドプロシージャに変換され、関数の呼び出しは空のSnowflake UDF 関数に変換されます。
注釈
この EWI は [SSC-EWI-0068](../functional-difference/generalFDM.md#ssc-fdm-0029)に強く関連しています。
コード例¶
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;
GO
SELECT PURCHASING.FOO() AS RESULT;
生成コード¶
!!!RESOLVE EWI!!! /*** SSC-EWI-0068 - USER DEFINED FUNCTION WAS TRANSFORMED TO SNOWFLAKE PROCEDURE ***/!!!
--** SSC-FDM-0007 - MISSING DEPENDENT OBJECT "PURCHASING.VENDOR" **
CREATE OR REPLACE PROCEDURE PURCHASING.FOO ()
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "transact", "convertedOn": "07/16/2025", "domain": "no-domain-provided" }}'
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;
$$;
SELECT
PURCHASING.FOO() !!!RESOLVE EWI!!! /*** SSC-EWI-0067 - UDF WAS TRANSFORMED TO SNOWFLAKE PROCEDURE, CALLING PROCEDURES INSIDE QUERIES IS NOT SUPPORTED ***/!!! AS RESULT;
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;
SELECT employee_function(2) FROM employees;
生成コード¶
!!!RESOLVE EWI!!! /*** SSC-EWI-0068 - USER DEFINED FUNCTION WAS TRANSFORMED TO SNOWFLAKE PROCEDURE ***/!!!
--** SSC-FDM-0007 - MISSING DEPENDENT OBJECT "employees" **
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": "07/10/2025", "domain": "no-domain-provided" }}'
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;
$$;
--** SSC-FDM-0007 - MISSING DEPENDENT OBJECT "employees" **
SELECT
!!!RESOLVE EWI!!! /*** SSC-EWI-0067 - UDF WAS TRANSFORMED TO SNOWFLAKE PROCEDURE, CALLING PROCEDURES INSIDE QUERIES IS NOT SUPPORTED ***/!!! employee_function(2) FROM
employees;
ベストプラクティス¶
ソースコードは、Snowflakeユーザー定義関数[アプローチ](https://docs.snowflake.com/ja/sql-reference/user-defined-functions.html#udfs-user-defined-functions)に適合するように再構築する必要がある場合があります。
さらにサポートが必要な場合は、[snowconvert-support@snowflake.com](mailto:snowconvert-support@snowflake.com)までメールでお問い合わせください。
SSC-EWI-0068¶
ユーザー定義関数がSnowflakeプロシージャに変換されました。
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;
生成コード¶
!!!RESOLVE EWI!!! /*** SSC-EWI-0068 - 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": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "transact", "convertedOn": "06/25/2025", "domain": "no-domain-provided" }}'
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;
$$;
Oracle:¶
入力コード¶
CREATE OR REPLACE FUNCTION FUN1(PAR1 VARCHAR)
RETURN VARCHAR
IS
VAR1 VARCHAR(20);
VAR2 VARCHAR(20);
BEGIN
SELECT COL1 INTO VAR1 FROM TABLE1 where col1 = 1;
VAR2 := PAR1 || VAR1;
RETURN VAR2;
END;
/
生成コード¶
!!!RESOLVE EWI!!! /*** SSC-EWI-0068 - USER DEFINED FUNCTION WAS TRANSFORMED TO SNOWFLAKE PROCEDURE ***/!!!
CREATE OR REPLACE PROCEDURE FUN1(PAR1 VARCHAR)
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
EXECUTE AS CALLER
AS
$$
DECLARE
VAR1 VARCHAR(20);
VAR2 VARCHAR(20);
BEGIN
SELECT COL1 INTO
:VAR1
FROM
TABLE1
where col1 = 1;
VAR2 := NVL(:PAR1 :: STRING, '') || NVL(:VAR1 :: STRING, '');
RETURN :VAR2;
END;
$$;
ベストプラクティス¶
同じロジックを維持するために、内部のクエリを分離します。
ソースコードは、Snowflakeユーザー定義関数[アプローチ](https://docs.snowflake.com/ja/sql-reference/user-defined-functions.html#udfs-user-defined-functions)に適合するように再構築する必要がある場合があります。
さらにサポートが必要な場合は、[snowconvert-support@snowflake.com](mailto:snowconvert-support@snowflake.com)までメールでお問い合わせください。
SSC-EWI-0073¶
機能的同等性レビューを保留中
重大性¶
中
説明¶
この EWI は、SnowConvert AI 開発チームによってまだレビューされていない文法句が入力プラットフォームにある場合に、Snowflakeでサポートを提供するために追加されます。これは、コードはまったく変換されていないことを意味し、手動で修正しなければSnowflakeでは動作しない可能性があります。
コード例¶
SQLServer:¶
入力コード¶
CREATE OR ALTER PROC SampleProcedure
AS
BEGIN
INSERT INTO aTable (columnA = 'varcharValue', columnB = 1);
INSERT exampleTable VALUES ('Hello', 23);
INSERT INTO exampleTable DEFAULT VALUES;
END
生成コード¶
CREATE OR REPLACE PROCEDURE SampleProcedure ()
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"transact"}}'
EXECUTE AS CALLER
AS
$$
BEGIN
INSERT INTO aTable (columnA = 'varcharValue', columnB = 1);
INSERT INTO exampleTable VALUES ('Hello', 23);
!!!RESOLVE EWI!!! /*** SSC-EWI-0073 - PENDING FUNCTIONAL EQUIVALENCE REVIEW FOR 'INSERT WITH DEFAULT VALUES' NODE ***/!!!
INSERT INTO exampleTable DEFAULT VALUES;
END;
$$;
入力コードの6行目に、DEFAULT VALUES を指定した INSERT ステートメントへの参照があることに注目してください。これは現在、SnowConvert AI ではサポートされていないステートメントであり、そのため11行目と12行目でEWI が生成されています。
ベストプラクティス¶
さらにサポートが必要な場合は、[snowconvert-support@snowflake.com](mailto:snowconvert-support@snowflake.com)までメールでお問い合わせください。
SSC-EWI-0077¶
CTE 呼び出しの間にサイクルが見つかりました。CTEs を順序付けることができません。
重大性¶
低
説明¶
この警告は、CTE(共通テーブル式)参照呼び出しが複数あるクエリが、CTEs の呼び出し順序を決定できないサイクルを作成し、CTEs を順序付けることができず、クエリがソースとして残る場合に追加されます。
コード例¶
入力コード(Teradata):¶
WITH t1(c1) as (SELECT c1 FROM t2),
t2(c2) as (SELECT c2 FROM t3),
RECURSIVE t3(c3) as (SELECT c3, someOtherColumn FROM t1, t3)
SELECT * FROM t1;
生成されたコード:¶
!!!RESOLVE EWI!!! /*** SSC-EWI-0077 - CYCLE FOUND BETWEEN CTE REFERENCE CALLS, CTES CANNOT BE ORDERED AND THE QUERY WILL REMAIN AS ORIGINAL ***/!!!
WITH RECURSIVE t1(c1) AS
(
SELECT
c1 FROM t2
),
t2(c2) AS
(
SELECT
c2 FROM t3
),
t3(c3) AS
(
SELECT
c3,
someOtherColumn FROM t1, t3
)
SELECT
* FROM t1;
ベストプラクティス¶
ユーザーによる追加のアクションは必要ありません。
さらにサポートが必要な場合は、[snowconvert-support@snowflake.com](mailto:snowconvert-support@snowflake.com)までメールでお問い合わせください。
SSC-EWI-0080¶
バイナリ列ではデフォルト値は許可されません
重大度¶
低
説明¶
この EWI は、ソースコードに SnowFlake SQL ではサポートされていない BINARY データ型のデフォルト値を持つ場合に追加されます。
コード例 ¶
入力コード(SqlServer):
create table test1345
(
key1 binary default 0
);
出力コード:
CREATE OR REPLACE TABLE test1345
(
key1 BINARY
!!!RESOLVE EWI!!! /*** SSC-EWI-0080 - DEFAULT VALUE IS NOT ALLOWED ON BINARY COLUMNS ***/!!!
default 0
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"transact"}}'
;
ベストプラクティス ¶
さらにサポートが必要な場合は、[snowconvert-support@snowflake.com](mailto:snowconvert-support@snowflake.com)までメールでお問い合わせください。
SSC-EWI-0084¶
XMLTABLE はサポートされていません。
重大性¶
高
説明¶
XMLTABLE 関数は現在サポートされていません。
コード例¶
入力コード(DB2):¶
SELECT
*
FROM
XMLTABLE(
'stringValue' PASSING BY REF passingExpr AS AliasName
) AS XMLTABLENAME
生成されたコード:¶
SELECT
*
FROM
!!!RESOLVE EWI!!! /*** SSC-EWI-0084 - XMLTABLE IS NOT SUPPORTED BY SNOWFLAKE ***/!!!
XMLTABLE(
'stringValue' PASSING BY REF passingExpr AS AliasName
) AS XMLTABLENAME
ベストプラクティス¶
Snowlflakeでの XML 変換については、こちらの[ブログ](https://www.snowflake.com/blog/easily-load-xml-sql/)を確認してください。
さらにサポートが必要な場合は、[snowconvert-support@snowflake.com](mailto:snowconvert-support@snowflake.com)までメールでお問い合わせください。
SSC-EWI-0086¶
新しい識別子の無効な文字を置き換えました
注釈
この EWI は非推奨です。[SSC-FDM-0030](../functional-difference/generalFDM.md#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;
生成されたコード:¶
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;
!!!RESOLVE EWI!!! /*** SSC-EWI-0086 - IDENTIFIER '"VAR`/1ͷ"' HAS INVALID CHARACTERS. CHARACTERS WERE REPLACED WITH THEIR UTF-8 CODES ***/!!!
VAR_u60_u2F1ͷ VARCHAR(20);
!!!RESOLVE EWI!!! /*** SSC-EWI-0086 - IDENTIFIER '"o*/o"' HAS INVALID CHARACTERS. CHARACTERS WERE REPLACED WITH THEIR UTF-8 CODES ***/!!!
o_u2A_u2Fo FLOAT;
!!!RESOLVE EWI!!! /*** SSC-EWI-0086 - IDENTIFIER '" . "' HAS INVALID CHARACTERS. CHARACTERS WERE REPLACED WITH THEIR UTF-8 CODES ***/!!!
_u20_u2E_u20 INT;
!!!RESOLVE EWI!!! /*** SSC-EWI-0086 - 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;
$$;
ベストプラクティス¶
エンドユーザーの操作は必要ありません。
さらにサポートが必要な場合は、[snowconvert-support@snowflake.com](mailto:snowconvert-support@snowflake.com)までメールでお問い合わせください。
SSC-EWI-0092¶
マテリアライズドビューが通常のビューに変換されました。
危険
非推奨
重大性¶
低
説明¶
Snowflakeマテリアライズドビューには、[こちら](https://docs.snowflake.com/ja/user-guide/views-materialized.html#label-limitations-on-creating-materialized-views)に記載されている特定の制限があります。現在、すべてのマテリアライズドビューは、それらが持っていた追加の句なしで通常のビューに変換されています。将来的には、SnowConvert AI はサポートされるケースをSnowflakeマテリアライズドビューに変換する予定です。
コード例¶
入力コード: ¶
CREATE MATERIALIZED VIEW MATERIALIZED_VIEW1
SEGMENT CREATION IMMEDIATE
ORGANIZATION HEAP PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255
PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255
INMEMORY PRIORITY NONE MEMCOMPRESS FOR QUERY LOW DISTRIBUTE AUTO NO DUPLICATE
AS
select
*
from
aTable;
生成されたコード:¶
!!!RESOLVE EWI!!! /*** SSC-EWI-0092 - MATERIALIZED VIEW WAS CONVERTED TO REGULAR VIEW. ***/!!!
CREATE OR REPLACE VIEW MATERIALIZED_VIEW1
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
aTable;
ベストプラクティス¶
ユーザーによる追加のアクションは必要ありません。
さらにサポートが必要な場合は、[snowconvert-support@snowflake.com](mailto:snowconvert-support@snowflake.com)までメールでお問い合わせください。
SSC-EWI-0094¶
ラベル宣言がサポートされていません
重大性¶
低
説明¶
現在、Snowスクリプトにはラベル宣言に相当するものがないため、EWI が追加され、ラベルはコメントアウトされます。
コード例¶
入力コード(Oracle):¶
CREATE OR REPLACE PROCEDURE Example ( grade NUMBER )
IS
BEGIN
<<CASE1>><<CASE2>>
CASE grade
WHEN 10 THEN NULL;
ELSE NULL;
END CASE CASE1;
END;
生成されたコード:¶
CREATE OR REPLACE PROCEDURE Example (grade NUMBER(38, 18))
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"oracle"}}'
EXECUTE AS CALLER
AS
$$
BEGIN
!!!RESOLVE EWI!!! /*** SSC-EWI-0094 - LABEL DECLARATION FOR A STATEMENT IS NOT SUPPORTED BY SNOWFLAKE SCRIPTING <<CASE1>><<CASE2>> ***/!!!
CASE :grade
WHEN 10 THEN
NULL;
ELSE NULL;
END CASE;
END;
$$;
ベストプラクティス¶
エンドユーザーによる操作は必要ありません。
さらにサポートが必要な場合は、[snowconvert-support@snowflake.com](mailto:snowconvert-support@snowflake.com)までメールでお問い合わせください。
SSC-EWI-0101¶
トランザクションラベル名はSnowflakeでは適用されないため、コメントアウトされました
重大性¶
低
説明¶
異なるCOMMIT またはROLLBACK ステートメントで識別するネストされたトランザクションが存在してはならないため、Snowflakeはトランザクションラベル名を操作しません。
コード例¶
入力コード(SQL Server):¶
CREATE PROCEDURE TestTransaction
AS
BEGIN
DROP TABLE IF EXISTS NEWTABLE;
CREATE TABLE NEWTABLE(COL1 INT, COL2 VARCHAR);
BEGIN TRANSACTION LabelA;
INSERT INTO NEWTABLE VALUES (1, 'MICHAEL');
INSERT INTO NEWTABLE VALUES(2, 'JACKSON');
COMMIT TRANSACTION LabelA;
END
生成されたコード:¶
CREATE OR REPLACE PROCEDURE TestTransaction ()
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"transact"}}'
EXECUTE AS CALLER
AS
$$
BEGIN
DROP TABLE IF EXISTS NEWTABLE;
CREATE OR REPLACE TABLE NEWTABLE (
COL1 INT,
COL2 VARCHAR
);
BEGIN TRANSACTION
!!!RESOLVE EWI!!! /*** SSC-EWI-0101 - COMMENTED OUT TRANSACTION LABEL NAME BECAUSE IS NOT APPLICABLE IN SNOWFLAKE ***/!!!
LabelA;
INSERT INTO NEWTABLE VALUES (1, 'MICHAEL');
INSERT INTO NEWTABLE VALUES(2, 'JACKSON');
COMMIT;
END;
$$;
ベストプラクティス¶
エンドユーザーによる操作は必要ありません。
さらにサポートが必要な場合は、[snowconvert-support@snowflake.com](mailto:snowconvert-support@snowflake.com)までメールでお問い合わせください。
SSC-EWI-0102¶
コードからステートメントオプションを削除しました。これは、Snowflakeへの変換時に既に処理されています
注釈
この EWI は非推奨です。
重大性¶
低
説明¶
Snowflakeステートメントでは、変換ルールによって処理されるときに、一部のオプションが削除される可能性があります。そのため、出力コードからは削除されますが、機能は同じです。
コード例¶
入力コード(PostgreSQL):¶
-- Case 1:
TRUNCATE ONLY table_base2 RESTART IDENTITY CASCADE;
-- Case 2:
TRUNCATE TABLE table_inherit_and_generated RESTART IDENTITY CASCADE;
生成されたコード:¶
-- Case 1:
!!!RESOLVE EWI!!! /*** SSC-EWI-0102 - REMOVED ONLY OPTION FROM CODE, ALREADY HANDLED IN CONVERSION TO SNOWFLAKE ***/!!!!!!RESOLVE EWI!!! /*** SSC-EWI-0102 - REMOVED CASCADE OPTION FROM CODE, ALREADY HANDLED IN CONVERSION TO SNOWFLAKE ***/!!!!!!RESOLVE EWI!!! /*** SSC-EWI-0102 - REMOVED RESTART IDENTITY OPTION FROM CODE, ALREADY HANDLED IN CONVERSION TO SNOWFLAKE ***/!!!
TRUNCATE table_base2;
-- Case 2:
!!!RESOLVE EWI!!! /*** SSC-EWI-0102 - REMOVED CASCADE OPTION FROM CODE, ALREADY HANDLED IN CONVERSION TO SNOWFLAKE ***/!!!!!!RESOLVE EWI!!! /*** SSC-EWI-0102 - REMOVED RESTART IDENTITY OPTION FROM CODE, ALREADY HANDLED IN CONVERSION TO SNOWFLAKE ***/!!!
TRUNCATE TABLE table_inherit_and_generated;
ベストプラクティス¶
エンドユーザーによる操作は必要ありません。
さらにサポートが必要な場合は、[snowconvert-support@snowflake.com](mailto:snowconvert-support@snowflake.com)までメールでお問い合わせください。
SSC-EWI-0107¶
現在のシナリオではサポートされていないインターバルリテラル
重大性¶
高
説明¶
Snowflakeインターバルは算術演算でのみ使用できます。その他のシナリオで使用されるインターバルはサポートされていません。
コード例 ¶
入力コード:
SELECT INTERVAL '1-5' YEAR TO MONTH FROM DUAL;
出力コード:
SELECT
!!!RESOLVE EWI!!! /*** SSC-EWI-0107 - INTERVAL LITERAL IS NOT SUPPORTED BY SNOWFLAKE IN THIS SCENARIO ***/!!!
INTERVAL '1-5' YEAR TO MONTH FROM DUAL;
ベストプラクティス ¶
エンドユーザーによる操作は必要ありません。
さらにサポートが必要な場合は、[snowconvert-support@snowflake.com](mailto:snowconvert-support@snowflake.com)までメールでお問い合わせください。
SSC-EWI-0108¶
以下のサブクエリは、無効とみなされるパターンの少なくとも1つにマッチし、コンパイルエラーが発生する可能性があります。
重大性¶
高
説明¶
Snowflakeでは、サブクエリの中にサポートされていない複数のパターンや要素があり、実行可能ではありません。[サブクエリに関するSnowflakeドキュメント](https://docs.snowflake.com/ja/user-guide/querying-subqueries#types-supported-by-snowflake)によると、以下のサブクエリ型が サポートされています。
値式を使用できる任意の場所での無相関のスカラーサブクエリ。
WHERE 句の相関スカラーサブクエリ。
EXISTS、ANY / ALL、および IN サブクエリの WHERE 句。これらのサブクエリは、相関の場合と非相関の場合があります。
上記のリストは網羅的なものではないことに注意してください。つまり、指定された型のいずれにも一致しないサブクエリも有効と見なされる場合があります。
エラーを回避するために、SnowConvert AI は、通常サブクエリを無効にするサブクエリパターンのセットを知っています。この EWI は、サブクエリがこれらのパターンの少なくとも1つに一致するため、Snowflakeでコンパイルしたときにエラーが発生する可能性があることを警告するために追加されます。
コード例¶
入力コード: ¶
CREATE TABLE tableA
(
col1 INTEGER,
col2 VARCHAR(20)
);
CREATE TABLE tableB
(
col3 INTEGER,
col4 VARCHAR(20)
);
INSERT INTO tableA VALUES (50, 'Hey');
INSERT INTO tableB VALUES (50, 'Hey');
INSERT INTO tableB VALUES (50, 'Example');
INSERT INTO tableB VALUES (10, 'Bye');
-- Snowflake only allows the usage of FETCH in subqueries that are uncorrelated scalar, this subquery execution will fail
SELECT col2
FROM tableA
WHERE col2 = (SELECT col4 FROM tableB WHERE col3 = col1 FETCH FIRST ROW ONLY);
-- This subquery is uncorrelated scalar so FETCH is valid to use
SELECT col2
FROM tableA
WHERE col2 = (SELECT col4 FROM tableB FETCH FIRST ROW ONLY);
生成されたコード:¶
CREATE OR REPLACE TABLE tableA
(
col1 INTEGER,
col2 VARCHAR(20)
)
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "oracle", "convertedOn": "12/05/2024", "domain": "test" }}'
;
CREATE OR REPLACE TABLE tableB
(
col3 INTEGER,
col4 VARCHAR(20)
)
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "oracle", "convertedOn": "12/05/2024", "domain": "test" }}'
;
INSERT INTO tableA
VALUES (50, 'Hey');
INSERT INTO tableB
VALUES (50, 'Hey');
INSERT INTO tableB
VALUES (50, 'Example');
INSERT INTO tableB
VALUES (10, 'Bye');
-- Snowflake only allows the usage of FETCH in subqueries that are uncorrelated scalar, this subquery execution will fail
SELECT col2
FROM
tableA
WHERE col2 =
--** SSC-FDM-0002 - CORRELATED SUBQUERIES MAY HAVE SOME FUNCTIONAL DIFFERENCES. **
!!!RESOLVE EWI!!! /*** SSC-EWI-0108 - THE FOLLOWING SUBQUERY MATCHES AT LEAST ONE OF THE PATTERNS CONSIDERED INVALID AND MAY PRODUCE COMPILATION ERRORS ***/!!! (SELECT
ANY_VALUE( col4) FROM
tableB
WHERE col3 = col1
FETCH FIRST 1 ROW ONLY);
-- This subquery is uncorrelated scalar so FETCH is valid to use
SELECT col2
FROM
tableA
WHERE col2 = (SELECT col4 FROM
tableB
FETCH FIRST 1 ROW ONLY);
ベストプラクティス¶
Snowflakeでサブクエリをチェックして、問題なくコンパイルできる場合、このEWI は無視しても問題ありません。
評価レポートのサブクエリに関する複雑なパターンセクションを確認してください。通常サブクエリを無効にするパターンとその発生のリストが含まれており、移行されたサブクエリとそれらが無効とみなされる理由を確認するために使用できます。
さらにサポートが必要な場合は、[snowconvert-support@snowflake.com](mailto:snowconvert-support@snowflake.com)までメールでお問い合わせください。
SSC-EWI-0109¶
Alter Table構文はSnowflakeでは使用できません。
重大性¶
中
説明¶
使用されているAlter Table構文はSnowflakeでは適用できないため、このメッセージが追加されています。
コード例:¶
入力コード:¶
ALTER TABLE SOMENAME DEFAULT COLLATION SOMENAME;
ALTER TABLE SOMENAME ROW ARCHIVAL;
ALTER TABLE SOMENAME MODIFY CLUSTERING;
ALTER TABLE SOMENAME DROP CLUSTERING;
ALTER TABLE SOMENAME SHRINK SPACE COMPACT CASCADE;
生成されたコード:¶
!!!RESOLVE EWI!!! /*** SSC-EWI-0109 - ALTER TABLE SYNTAX NOT APPLICABLE IN SNOWFLAKE ***/!!!
ALTER TABLE SOMENAME
DEFAULT COLLATION SOMENAME;
!!!RESOLVE EWI!!! /*** SSC-EWI-0109 - ALTER TABLE SYNTAX NOT APPLICABLE IN SNOWFLAKE ***/!!!
ALTER TABLE SOMENAME
ROW ARCHIVAL;
!!!RESOLVE EWI!!! /*** SSC-EWI-0109 - ALTER TABLE SYNTAX NOT APPLICABLE IN SNOWFLAKE ***/!!!
ALTER TABLE SOMENAME
MODIFY CLUSTERING;
!!!RESOLVE EWI!!! /*** SSC-EWI-0109 - ALTER TABLE SYNTAX NOT APPLICABLE IN SNOWFLAKE ***/!!!
ALTER TABLE SOMENAME
DROP CLUSTERING;
!!!RESOLVE EWI!!! /*** SSC-EWI-0109 - ALTER TABLE SYNTAX NOT APPLICABLE IN SNOWFLAKE ***/!!!
ALTER TABLE SOMENAME
SHRINK SPACE COMPACT CASCADE;
ベストプラクティス¶
ユーザーによる追加のアクションは必要ありません。
さらにサポートが必要な場合は、[snowconvert-support@snowflake.com](mailto:snowconvert-support@snowflake.com)までメールでお問い合わせください。
SSC-EWI-0110¶
依存関係が見つからないために変換が実行されない
重大性¶
低
説明¶
依存関係が欠落している場合、EWI は変換が実行できないことを示すために追加されます。SnowConvert AI は抽象構文ツリーを利用して入力コードのセマンティックモデルを作成し、それを使って元のソースの機能を複製する新しいコードを生成します。しかし、この特定のシナリオでは、セマンティックモデルに特定の依存関係がないため、変換を完了できませんでした。
コード例¶
入力コード:¶
ALTER TABLE MissingTable ADD
CONSTRAINT constraint1 DEFAULT (suser_name()) FOR col1;
生成されたコード:¶
--** SSC-FDM-0007 - MISSING DEPENDENT OBJECT "MissingTable" **
!!!RESOLVE EWI!!! /*** SSC-EWI-0110 - TRANSFORMATION NOT PERFORMED DUE TO MISSING DEPENDENCIES ***/!!!
ALTER TABLE MissingTable
ADD
CONSTRAINT constraint1 DEFAULT (CURRENT_USER()) FOR col1;
ベストプラクティス¶
不足している依存関係を入力コードに追加します。
さらにサポートが必要な場合は、[snowconvert-support@snowflake.com](mailto:snowconvert-support@snowflake.com)までメールでお問い合わせください。
SSC-EWI-0111¶
Snowflakeでは、ネストされたプロシージャには1つのレベルしか許可されません。
重大性¶
Critical
説明¶
Snowflakeは、プロシージャのネストレベルを1つだけサポートします。ネストされたプロシージャの中に別のネストされたプロシージャを定義することは許可されていません。このパターンが検出されると、このエラーが発生します。
コード例¶
入力コード:¶
CREATE OR REPLACE PROCEDURE calculate_executive_salary (
p_result OUT NUMBER
)
AS
PROCEDURE calculate_senior_level (
senior_result OUT NUMBER
)
AS
PROCEDURE calculate_base_level (
base_result OUT NUMBER
)
AS
BEGIN
base_result := 75000;
END calculate_base_level;
BEGIN
calculate_base_level(senior_result);
senior_result := senior_result * 1.5;
END calculate_senior_level;
BEGIN
calculate_senior_level(p_result);
END calculate_executive_salary;
生成されたコード:¶
CREATE OR REPLACE PROCEDURE calculate_executive_salary (p_result OUT NUMBER(38, 18)
)
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "oracle", "convertedOn": "07/22/2025", "domain": "no-domain-provided" }}'
EXECUTE AS CALLER
AS
$$
DECLARE
calculate_senior_level PROCEDURE (senior_result NUMBER(38, 18)
)
RETURNS NUMBER
AS
DECLARE
!!!RESOLVE EWI!!! /*** SSC-EWI-0111 - ONLY ONE LEVEL OF NESTING IS ALLOWED FOR NESTED PROCEDURES IN SNOWFLAKE. ***/!!!
PROCEDURE calculate_base_level (
base_result OUT NUMBER
)
AS
BEGIN
base_result := 75000;
END calculate_base_level;
call_results NUMBER;
BEGIN
call_results := (
CALL
calculate_base_level(:senior_result)
);
senior_result := :call_results;
senior_result := :senior_result * 1.5;
RETURN senior_result;
END;
call_results NUMBER;
BEGIN
call_results := (
CALL
calculate_senior_level(:p_result)
);
p_result := :call_results;
END;
$$;
ベストプラクティス¶
複数レベルのネストされたプロシージャを回避するためにコードをリファクタリングします。深くネストされたプロシージャをトップレベルに移動するか、Snowflakeの単一レベルのネスト制限に準拠するようにロジックを再構築します。
さらにサポートが必要な場合は、[snowconvert-support@snowflake.com](mailto:snowconvert-support@snowflake.com)までメールでお問い合わせください。
SSC-EWI-0112¶
ネストされたプロシージャのオーバーロードはサポートされていません。
重大性¶
Critical
説明¶
Snowflakeは、ネストされたプロシージャのオーバーロードをサポートしていません。つまり、同じ親プロシージャの中で、同じ名前で異なるパラメーターリストを持つ複数のネストされたプロシージャを定義することはできません。ソースコードにオーバーロードされたネストされたプロシージャが含まれている場合、このエラーはそのようなパターンがSnowflakeでサポートされていないことを示すために生成されます。
コード例¶
入力コード:¶
CREATE OR REPLACE PROCEDURE demonstrate_salary_calculations(
final_summary OUT VARCHAR2
)
AS
result1 VARCHAR2(100);
result2 VARCHAR2(100);
result3 VARCHAR2(100);
PROCEDURE calculate_salary(
output OUT VARCHAR2
)
AS
BEGIN
output := 'Standard: 55000';
END;
PROCEDURE calculate_salary(
base_amount IN NUMBER,
output OUT VARCHAR2
)
AS
BEGIN
output := 'Calculated: ' || (base_amount * 1.15);
END;
PROCEDURE calculate_salary(
employee_level IN VARCHAR2,
output OUT VARCHAR2
)
AS
BEGIN
output := 'Level ' || UPPER(employee_level) || ': 60000';
END;
BEGIN
calculate_salary(result1);
calculate_salary(50000, result2);
calculate_salary('senior', result3);
final_summary := result1 || ' | ' || result2 || ' | ' || result3;
END demonstrate_salary_calculations;
生成されたコード:¶
CREATE OR REPLACE PROCEDURE demonstrate_salary_calculations (final_summary OUT VARCHAR
)
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "oracle", "convertedOn": "07/22/2025", "domain": "no-domain-provided" }}'
EXECUTE AS CALLER
AS
$$
DECLARE
result1 VARCHAR(100);
result2 VARCHAR(100);
result3 VARCHAR(100);
calculate_salary PROCEDURE(output VARCHAR
)
RETURNS VARCHAR
AS
BEGIN
output := 'Standard: 55000';
RETURN output;
END;
!!!RESOLVE EWI!!! /*** SSC-EWI-0112 - NESTED PROCEDURE OVERLOADING IS NOT SUPPORTED. ***/!!!
calculate_salary PROCEDURE(base_amount NUMBER(38, 18), output VARCHAR
)
RETURNS VARCHAR
AS
BEGIN
output := 'Calculated: ' || NVL((:base_amount * 1.15) :: STRING, '');
RETURN output;
END;
!!!RESOLVE EWI!!! /*** SSC-EWI-0112 - NESTED PROCEDURE OVERLOADING IS NOT SUPPORTED. ***/!!!
calculate_salary PROCEDURE(employee_level VARCHAR, output VARCHAR
)
RETURNS VARCHAR
AS
BEGIN
output := 'Level ' || NVL(UPPER(:employee_level) :: STRING, '') || ': 60000';
RETURN output;
END;
call_results VARCHAR;
BEGIN
call_results := (
CALL
calculate_salary(:result1)
);
result1 := :call_results;
call_results := (
CALL
calculate_salary(50000, :result2)
);
result2 := :call_results;
call_results := (
CALL
calculate_salary('senior', :result3)
);
result3 := :call_results;
final_summary := NVL(:result1 :: STRING, '') || ' | ' || NVL(:result2 :: STRING, '') || ' | ' || NVL(:result3 :: STRING, '');
END;
$$;
ベストプラクティス¶
Snowflakeでネストされたプロシージャをオーバーロードしようとすると、コンパイルエラーや予期しない動作が発生します。互換性を確保するためには、ネストされたプロシージャをオーバーロードしないようにコードをリファクタリングする必要があります。ネストされた各プロシージャがそのスコープ内で一意な名前を持つようにプロシージャの名前を変更するか、オーバーロードの必要性を排除するためにロジックを再構築することを検討してください。さらに、すべてのプロシージャ呼び出しを確認して更新し、新しい一意の名前を使用します。
さらにサポートが必要な場合は、[snowconvert-support@snowflake.com](mailto:snowconvert-support@snowflake.com)までメールでお問い合わせください。
SSC-EWI-0113¶
このシナリオでは、Snowflakeスクリプト UDF の使用はサポートされていません。
重大性¶
中
説明¶
特定のシナリオにおけるSnowflake Scritping UDFs の使用はサポートされていません。次のケースはサポートされていません。
Snowflakeスクリプト UDFs は、マテリアライズドビューを作成する場合には使用できません。
Snowflakeスクリプト UDFs は、デフォルトの列値を指定するためには使用できません。
コード例¶
入力コード:¶
CREATE TABLE Table1 (
col1 INT DEFAULT SnowScriptUdf()
);
CREATE MATERIALIZED VIEW CreateView1
AS
SELECT
col1,
SnowScriptUdf() AS col2
FROM Table1;
生成されたコード:¶
CREATE OR REPLACE TABLE Table1 (
col1 INT DEFAULT SnowScriptUdf() !!!RESOLVE EWI!!! /*** SSC-EWI-0113 - THE USAGE OF SNOWFLAKE SCRIPTING UDF IS NOT SUPPORTED IN THIS SCENARIO. ***/!!!
)
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "transact", "convertedOn": "09/17/2025", "domain": "no-domain-provided" }}'
;
CREATE OR REPLACE DYNAMIC TABLE CreateView1
--** 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": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "transact", "convertedOn": "09/17/2025", "domain": "no-domain-provided" }}'
AS
SELECT
col1,
SnowScriptUdf() !!!RESOLVE EWI!!! /*** SSC-EWI-0113 - THE USAGE OF SNOWFLAKE SCRIPTING UDF IS NOT SUPPORTED IN THIS SCENARIO. ***/!!! AS col2
FROM
Table1;
ベストプラクティス¶
さらにサポートが必要な場合は、[snowconvert-support@snowflake.com](mailto:snowconvert-support@snowflake.com)までメールでお問い合わせください。
SSC-EWI-0114¶
MIXED CONTINUE AND EXIT EXCEPTION HANDLERS IN THE SAME BLOCK ARE NOT SUPPORTED BY SNOWFLAKE SCRIPTING.
重大性¶
中
注釈
わかりやすくするため、出力コードの一部を省略しています。
説明¶
In database systems like DB2, Teradata, and others, it is possible to declare both CONTINUE and EXIT exception handlers in the same procedural block. However, Snowflake Scripting does not support mixing CONTINUE and EXIT handlers within the same EXCEPTION block.
When SnowConvert AI encounters a procedure with both types of handlers declared in the same block, it generates separate EXCEPTION blocks for each handler type and adds this EWI to indicate that manual review and testing are required to ensure the converted code maintains the intended behavior.
Key Behavioral Differences:
CONTINUE HANDLER: Allows execution to continue after handling the exception
EXIT HANDLER: Terminates the current block after handling the exception
Since Snowflake cannot mix these behaviors in a single EXCEPTION block, the conversion may result in different execution flow compared to the source system.
コード例¶
入力コード:¶
DB2
CREATE OR REPLACE PROCEDURE with_continueAndExit()
BEGIN
DECLARE test_1 INTEGER DEFAULT 10;
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION
INSERT INTO error_test VALUES ('EXCEPTION');
DECLARE EXIT HANDLER FOR SQLSTATE '20000'
INSERT INTO error_test VALUES ('ERROR 2000');
SET test_1 = 1 / 0;
INSERT INTO error_test VALUES ('EXIT');
END;
生成されたコード:¶
Snowflake
CREATE OR REPLACE PROCEDURE with_continueAndExit()
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "db2", "convertedOn": "01/15/2025" }}'
AS
$$
DECLARE
test_1 INTEGER DEFAULT 10;
BEGIN
test_1 := 1 / 0;
INSERT INTO error_test VALUES ('EXIT');
EXCEPTION
WHEN OTHER CONTINUE THEN
INSERT INTO error_test VALUES ('EXCEPTION')
!!!RESOLVE EWI!!! /*** SSC-EWI-0114 - MIXED CONTINUE AND EXIT EXCEPTION HANDLERS IN THE SAME BLOCK ARE NOT SUPPORTED BY SNOWFLAKE SCRIPTING ***/!!!
EXCEPTION
WHEN OTHER EXIT THEN
CASE
WHEN (SQLSTATE = '20000') THEN
INSERT INTO error_test VALUES ('ERROR 2000')
END
END;
$$;
ベストプラクティス¶
When dealing with mixed CONTINUE and EXIT handlers:
Review Exception Handling Logic: Carefully review the converted code to understand how exceptions are handled in each block.
Test Thoroughly: Test all error scenarios to ensure the behavior matches the source system's expectations.
Consider Refactoring: If possible, refactor the code to use only one type of handler (either all CONTINUE or all EXIT) within a block.
Use Nested Blocks: Consider restructuring the logic using nested BEGIN...END blocks, where each block has its own exception handling strategy.
Document Behavior Changes: Document any differences in exception handling behavior for future maintenance.
Recommended Pattern¶
Instead of mixing handlers, consider this approach:
BEGIN
-- Handle operations that should continue on error
BEGIN
operation1();
operation2();
EXCEPTION
WHEN OTHER CONTINUE THEN
log_error('Continue handler');
END;
-- Handle operations that should exit on error
BEGIN
critical_operation();
EXCEPTION
WHEN OTHER EXIT THEN
log_error('Exit handler');
END;
END;