SnowConvert AI - SQL ServerとAzure Synapseの問題
Applies to
SQL Server
Azure Synapse Analytics
Sybase
SSC-EWI-TS0001
ユーザー定義関数本文が生成されない
重大性
Critical
注釈
わかりやすくするため、出力コードの一部を省略しています。
説明
この EWI は、SnowConvert AI が関数の翻訳中に関数本文が生成されない原因となる重大な例外を処理するときに表示されます。
コード例
SQL Server
CREATE FUNCTION func1 ()
RETURNS VARCHAR
SELECT
*
FROM
TABLE1
Snowflake
--** SSC-FDM-0007 - MISSING DEPENDENT OBJECT "TABLE1" **
CREATE OR REPLACE FUNCTION func1 ()
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "transact", "convertedOn": "07/14/2025", "domain": "no-domain-provided" }}'
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0001 - THE BODY WAS NOT GENERATED FOR FUNCTION 'func1' ***/!!!
AS
$$
$$;
SSC-EWI-TS0002
ANSI_PADDING OFF は Snowflake ではサポートされていません。
重大性
低
注釈
わかりやすくするため、出力コードの一部を省略しています。
説明
Transact-SQL では、ステートメント SET ANSI_PADDING OFF によって、char データ型の挿入時に後続のスペースが削除されます。Snowflakeでは SET ANSI_PADDING OFF を直接設定できないので、SnowConvert AI でこの EWI を生成します。
コード例
Snowflake
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0002 - THE ANSI_PADDING OFF IS NOT SUPPORTED IN SNOWFLAKE. ***/!!!
SET ANSI_PADDING OFF;
SSC-EWI-TS0003
ANSI_WARNINGS OFF は Snowflake ではサポートされていません。
重大性
低
注釈
わかりやすくするため、出力コードの一部を省略しています。
説明
Transact-SQL では、ステートメント SET ANSI_WARNINGS OFF によって、ゼロによる除算や算術オーバーフローなどの警告が無効になります。Snowflakeでは SET ANSI_WARNINGS OFF を直接設定できないので、SnowConvert AI でこの EWI を生成します。
コード例
Snowflake
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0003 - THE ANSI_WARNINGS OFF IS NOT SUPPORTED IN SNOWFLAKE. ***/!!!
SET ANSI_WARNINGS OFF;
SSC-EWI-TS0009
次のトランザクションはネストされたトランザクションを含む可能性があります。これはSnowflakeではサポートされない複雑なパターンと考えられます。
注釈
わかりやすくするため、出力コードの一部を省略しています。
重大性
高
説明
このエラーは、トランザクションがネストされたトランザクションを含む可能性があることを示すために追加されました。SQL Serverでは、トランザクションを入れ子にすることができます。これは、既存のトランザクションの中で新しいトランザクションを開始できることを意味します。最初の BEGIN ステートメントの後に別のBEGINステートメントを実行すると、新しいトランザクションが開き、現在のトランザクションカウントが1増えます。
一方、これはSnowflakeではサポートされていないので、2つ目の BEGIN ステートメントは無視され、トランザクションは1つだけのままとなります。詳しくは SQL Serverトランザクション をご参照ください。
コード例
生成されたコード:
CREATE OR REPLACE PROCEDURE transactionsTest ()
RETURNS ARRAY
LANGUAGE SQL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"transact"}}'
EXECUTE AS CALLER
AS
$$
DECLARE
ProcedureResultSet1 VARCHAR;
ProcedureResultSet2 VARCHAR;
ProcedureResultSet3 VARCHAR;
return_arr ARRAY := array_construct();
BEGIN
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0009 - THE FOLLOWING TRANSACTION MAY CONTAIN NESTED TRANSACTIONS WHICH ARE NOT SUPPORTED IN SNOWFLAKE. ***/!!!
BEGIN TRANSACTION;
ProcedureResultSet1 := 'RESULTSET_' || REPLACE(UPPER(UUID_STRING()), '-', '_');
CREATE OR REPLACE TEMPORARY TABLE IDENTIFIER(:ProcedureResultSet1) AS
SELECT
:TRANCOUNT AS TransactionCount_AfterFirstTransaction;
return_arr := array_append(return_arr, :ProcedureResultSet1);
INSERT INTO TESTSCHEMA.TESTTABLE (ID) VALUES (1), (2);
BEGIN TRANSACTION;
ProcedureResultSet2 := 'RESULTSET_' || REPLACE(UPPER(UUID_STRING()), '-', '_');
CREATE OR REPLACE TEMPORARY TABLE IDENTIFIER(:ProcedureResultSet2) AS
SELECT
:TRANCOUNT AS TransactionCount_AfterSecondTransaction;
return_arr := array_append(return_arr, :ProcedureResultSet2);
INSERT INTO TESTSCHEMA.TESTTABLE (ID) VALUES (3), (4);
COMMIT;
ProcedureResultSet3 := 'RESULTSET_' || REPLACE(UPPER(UUID_STRING()), '-', '_');
CREATE OR REPLACE TEMPORARY TABLE IDENTIFIER(:ProcedureResultSet3) AS
SELECT
:TRANCOUNT AS TransactionCount_AfterFirstCommit;
return_arr := array_append(return_arr, :ProcedureResultSet3);
COMMIT;
--** SSC-FDM-0020 - MULTIPLE RESULT SETS ARE RETURNED IN TEMPORARY TABLES **
RETURN return_arr;
END;
$$;
-- ** SSC-EWI-0001 - UNRECOGNIZED TOKEN ON LINE '12' COLUMN '1' OF THE SOURCE CODE STARTING AT 'END'. EXPECTED 'BATCH' GRAMMAR. **
--END
;
SSC-EWI-TS0010
ビューの共通テーブル式がSnowflakeでサポートされていません。
注釈
わかりやすくするため、出力コードの一部を省略しています。
重大性
高
説明
ビューはクエリの実体化表現であり、データの取得と表示方法を定義するだけであってデータの操作方法は定義しないため、ビュー内に無効な CTE があると、このエラーが追加されます。
コード例
入力コード:
Create View viewName
as
with commonTableExpressionName (
columnName
) as
(
select
1
)
((select
1 as col2)
union
(
select
1 as col3
));
生成されたコード:
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0010 - COMMON TABLE EXPRESSION IN VIEW NOT SUPPORTED IN SNOWFLAKE. ***/!!!
CREATE OR REPLACE VIEW viewName
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"transact"}}'
AS
!!!RESOLVE EWI!!! /*** SSC-EWI-0021 - WITH CTE NOT SUPPORTED IN SNOWFLAKE ***/!!!
with commonTableExpressionName (
columnName
) as
(
select
1
)
((select
1 as col2)
union
(
select
1 as col3
));
SSC-EWI-TS0013
計算された列の変換
重大性
低
説明
この警告は、SQL Serverの計算された列がSnowflakeの同等の列に変換されるときに追加されます。これが追加されるのは、場合により、機能的同等性に影響が出る可能性があるためです。
コード例
入力コード:
CREATE TABLE [TestTable](
[Col1] AS (CONVERT ([REAL], ExpressionValue))
);
生成されたコード:
CREATE OR REPLACE TABLE TestTable (
Col1 REAL AS (CAST(ExpressionValue AS REAL)) /*** SSC-FDM-TS0014 - COMPUTED COLUMN WAS TRANSFORMED TO ITS SNOWFLAKE EQUIVALENT, FUNCTIONAL EQUIVALENCE VERIFICATION PENDING. ***/
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"transact"}}'
;
SSC-EWI-TS0015
データ型がSnowflakeではサポートされていません
説明
この警告は、SQL Serverの列にSnowflakeでサポートされていない型がある場合に追加されます。
コード例
入力コード:
CREATE TABLE table1
(
column1 customType,
);
生成されたコード:
CREATE OR REPLACE TABLE table1
(
column1 VARIANT !!!RESOLVE EWI!!! /*** SSC-EWI-TS0015 - DATA TYPE CUSTOMTYPE IS NOT SUPPORTED IN SNOWFLAKE ***/!!!
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"transact"}}'
;
SSC-EWI-TS0016
ODBC スカラー関数の翻訳を保留
注釈
わかりやすくするため、出力コードの一部を省略しています。
説明
この EWI は、SnowConvert AI が入力コード内に ODBC スカラー関数を見つけたときに追加されます。\ ODBC スカラー関数では、ユーザー定義関数はサポートされていません。
コード例
入力コード:
SELECT {fn CURRENT_DATE_UDF()};
生成されたコード:
--** SSC-FDM-0007 - MISSING DEPENDENT OBJECT "CURRENT_DATE_UDF" **
SELECT
CURRENT_DATE_UDF() !!!RESOLVE EWI!!! /*** SSC-EWI-0073 - PENDING FUNCTIONAL EQUIVALENCE REVIEW FOR 'CURRENT_DATE_UDF' NODE ***/!!!!!!RESOLVE EWI!!! /*** SSC-EWI-TS0016 - USER DEFINED FUNCTIONS ARE NOT SUPPORTED IN ODBC SCALAR FUNCTION. ***/!!!;
SSC-EWI-TS0017
マスキングはサポートされていません
重大性
低
説明
この EWI は、SnowConvert AI が CREATE TABLE ステートメント内にマスキングされた列を見つけたときに追加されます。この機能は、列宣言にオプションを追加しても機能しません。SQL Serverと同じ動作をさせるには、手作業が必要です。
コード例
入力コード:
CREATE TABLE TABLE1
(
[COL1] nvarchar MASKED WITH (FUNCTION = 'default()') NULL,
[COL2] varchar(100) MASKED WITH (FUNCTION = 'partial(1, "xxxxx", 1)') NULL,
[COL3] varchar(100) MASKED WITH (FUNCTION = 'email()') NOT NULL,
[COL4] smallint MASKED WITH (FUNCTION = 'random(1, 100)') NULL
);
生成されたコード:
CREATE OR REPLACE TABLE TABLE1
(
COL1 VARCHAR
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0017 - COLUMN MASKING NOT SUPPORTED IN CREATE TABLE ***/!!!
MASKED WITH (FUNCTION = 'default()') NULL,
COL2 VARCHAR(100)
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0017 - COLUMN MASKING NOT SUPPORTED IN CREATE TABLE ***/!!!
MASKED WITH (FUNCTION = 'partial(1, "xxxxx", 1)') NULL,
COL3 VARCHAR(100)
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0017 - COLUMN MASKING NOT SUPPORTED IN CREATE TABLE ***/!!!
MASKED WITH (FUNCTION = 'email()') NOT NULL,
COL4 SMALLINT
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0017 - COLUMN MASKING NOT SUPPORTED IN CREATE TABLE ***/!!!
MASKED WITH (FUNCTION = 'random(1, 100)') NULL
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"transact"}}'
;
ベストプラクティス
SnowConvert AI の現在のバージョンでは、 MASKING POLICIES が生成されないため、手動で作成する必要があります。例:
最初のステップは、マスキングポリシーの管理者ロールを作成することです。
create role masking_admin;
2つ目は、作成したロールに必要な権限を付与することです。
grant create masking policy on schema PUBLIC to role masking_admin;
allow table_owner role to set or unset the ssn_mask masking policy -- (optional)
grant apply on masking policy ssn_mask to role table_owner;
次のステップは、マスキングポリシー関数を作成することです。
-- default mask
create or replace masking policy default_mask as (val string) returns string ->
case
when current_role() in ('ANALYST') then val
else 'xxxx'
end;
-- partial mask
create or replace masking policy partial_mask as (val string) returns string ->
case
when current_role() in ('ANALYST') then val
else LEFT(val,1) || 'xxxxx' || RIGHT(val,1)
end;
-- email mask
create or replace masking policy email_mask as (val string) returns string ->
case
when current_role() in ('ANALYST') then val
else LEFT(val,1) || 'XXX@XXX.com'
end;
-- random mask
create or replace masking policy random_mask as (val smallint) returns smallint ->
case
when current_role() in ('ANALYST') then val
else UNIFORM(1,100,RANDOM())::SMALLINT
end;
注釈
サンプルとして、SQL Serverのマスキング関数の例をいくつか取り上げ、Snowflakeの同等の関数に手動で変換しています。
最後のステップは、SQL Serverでもともとマスキングオプションがあった列にマスキングポリシーを追加することです。
alter table if exists TABLE1 modify column COL1 set masking policy default_mask;
alter table if exists TABLE1 modify column COL2 set masking policy partial_mask;
alter table if exists TABLE1 modify column COL3 set masking policy email_mask;
alter table if exists TABLE1 modify column COL4 set masking policy random_mask;
さらにサポートが必要な場合は、 snowconvert-support@snowflake.com までメールでお問い合わせください。
SSC-EWI-TS0023
バルクオプションはサポートされていません
重大性
低
注釈
わかりやすくするため、出力コードの一部を省略しています。
説明
この EWI は BULK INSERT の一部のオプションをマッピングできなかったときに追加されます。翻訳されたバルクオプションは FILE FORMAT オプションとして反映されるはずです。
コード例
入力コード:
BULK INSERT #PCE FROM 'E:\PCE_Look-up_table.txt'
WITH
(
FIELDTERMINATOR ='\t',
ROWTERMINATOR ='\n',
FIRE_TRIGGERS
);
生成されたコード:
CREATE OR REPLACE FILE FORMAT FILE_FORMAT_638461199649565070
FIELD_DELIMITER = '\t'
RECORD_DELIMITER = '\n'
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0023 - 'FIRE_TRIGGERS' BULK OPTION COULD NOT BE TRANSFORMED TO ANY OF THE EXISTING FILE FORMAT OPTIONS ***/!!!
FIRE_TRIGGERS;
CREATE OR REPLACE STAGE STAGE_638461199649565070
FILE_FORMAT = FILE_FORMAT_638461199649565070;
--** SSC-FDM-TS0004 - PUT STATEMENT IS NOT SUPPORTED ON WEB UI. YOU SHOULD EXECUTE THE CODE THROUGH THE SNOWFLAKE CLI **
PUT file://E:\PCE_Look-up_table.txt @STAGE_638461199649565070 AUTO_COMPRESS = FALSE;
COPY INTO T_PCE FROM @STAGE_638461199649565070/PCE_Look-up_table.txt;
SSC-EWI-TS0024
一括挿入のための変換が不完全
重大性
低
説明
この EWI は、ストアドプロシージャ内の BULK INSERT がまったく特定されなかったときに追加されます。そのため、完全な変換のための依存関係は生成されません。また、変換された COPY INTO は、手動で作成する必要がある tempStage からファイルを取得します。
コード例
入力コード:
CREATE PROCEDURE BULK_PROC2
AS
BULK INSERT dbo.table1 FROM 'E:\test.txt'
WITH
(
FIELDTERMINATOR ='\t',
ROWTERMINATOR ='\n'
);
GO
生成されたコード:
CREATE OR REPLACE FILE FORMAT FILE_FORMAT_638461207064166040
FIELD_DELIMITER = '\t'
RECORD_DELIMITER = '\n';
CREATE OR REPLACE STAGE STAGE_638461207064166040
FILE_FORMAT = FILE_FORMAT_638461207064166040;
--** SSC-FDM-TS0004 - PUT STATEMENT IS NOT SUPPORTED ON WEB UI. YOU SHOULD EXECUTE THE CODE THROUGH THE SNOWFLAKE CLI **
PUT file://E:\test.txt @STAGE_638461207064166040 AUTO_COMPRESS = FALSE;
CREATE OR REPLACE PROCEDURE BULK_PROC2 ()
RETURNS STRING
LANGUAGE JAVASCRIPT
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"transact"}}'
EXECUTE AS CALLER
AS
$$
// REGION SnowConvert AI Helpers Code
// END REGION
EXEC(`COPY INTO dbo.table1 FROM @STAGE_638461207064166040/test.txt`);
$$
SSC-EWI-TS0025
ERROR_SEVERITY 関数変換
重大性
低
注釈
Generate Procedures and Macros using JavaScript as the target language adding the following flag -t JavaScript or --PLTargetLanguage JavaScript
注釈
わかりやすくするため、出力コードの一部を省略しています。
説明
この EWI は、 ERROR_SEVERITY 組み込み関数を翻訳する際に追加されます。デフォルトでは、この関数は SQL Serverで最も一般的な深刻度である16を返します。生成された UDF は
コード例
入力コード:
-- Additional Params: -t JavaScript
CREATE procedure proc1()
as
BEGIN TRY
-- Generate a divide-by-zero error.
SELECT 1/0 from table1;
END TRY
BEGIN CATCH
return ERROR_SEVERITY();
END CATCH;
GO
生成されたコード:
CREATE OR REPLACE PROCEDURE proc1 ()
RETURNS STRING
LANGUAGE JAVASCRIPT
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"transact"}}'
EXECUTE AS CALLER
AS
$$
// SnowConvert AI Helpers Code section is omitted.
try {
EXEC(` -- Generate a divide-by-zero error.
SELECT
TRUNC( 1/0) from
table1`);
} catch(error) {
return SELECT(` !!!RESOLVE EWI!!! /*** SSC-EWI-TS0025 - CUSTOM UDF 'ERROR_SEVERITY_UDF' INSERTED FOR ERROR_SEVERITY FUNCTION. ***/!!!
ERROR_SEVERITY_UDF()`);
}
$$;
SSC-EWI-TS0026
DeleteクエリがCreate Tableに変換されている
重大性
低
説明
この EWI は、Delete Fromを持つ共通テーブル式がCreate TableまたはReplace Tableに変換されたときに追加されます。
コード例
入力コード:
WITH Duplicated AS (
SELECT *, ROW_NUMBER() OVER (PARTITION BY ID ORDER BY ID) AS RN
FROM WithQueryTest
)
DELETE FROM Duplicated
WHERE Duplicated.RN > 1
生成されたコード:
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0026 - WITH DELETE QUERY TURNED TO CREATE TABLE ***/!!!
CREATE OR REPLACE TABLE WithQueryTest AS
SELECT
*
FROM
WithQueryTest
QUALIFY
ROW_NUMBER()
OVER (PARTITION BY
ID
ORDER BY ID) = 1;
SSC-EWI-TS0032
一括挿入が部分的に翻訳されている
警告
この EWI は、Javascriptがストアドプロシージャのターゲット言語である場合にのみ生成されます。ストアドプロシージャの推奨ターゲット言語はSnowflakeスクリプトであるため、これは非推奨の変換機能です。
重大性
高
注釈
Generate Procedures and Macros using JavaScript as the target language adding the following flag -t JavaScript or --PLTargetLanguage JavaScript
注釈
わかりやすくするため、出力コードの一部を省略しています。
説明
この EWI は、元々連結だったリテラルに追加されるもので、含まれるコードに BULK INSERT ステートメントがあったときに追加されます。この PUT コマンドは BULK INSERT を翻訳した結果ですが、もともと動的 SQL であったコードの実行ではサポートされていません。
このため、PUT コマンドを出力コードから抽出し、それを含むプロシージャの外で手動で実行する必要があります。プロシージャ内の動的 SQL 文に多くの BULK INSERT ステートメントがある場合は、このプロシージャを分割して、翻訳された各 BULK INSERT に対応する PUT コマンドを手動で実行できるようにすることをお勧めします。
コード例
入力コード:
-- Additional Params: -t JavaScript
CREATE PROCEDURE [dbo].[Load_FuelMgtMasterData]
AS
BEGIN
SET NOCOUNT ON;
DECLARE
@SQLString VARCHAR(500)
, @ImportName VARCHAR(200)
, @Today DATE
, @Yesterday DATE
, @SourceAffiliates VARCHAR(200);
SET @Today = GETDATE();
SET @Yesterday = DATEADD(DAY, -1, @Today);
TRUNCATE TABLE dbo.SourceFM_Affiliates;
SET @ImportName = '\\' + +@@ServerName
+ '\WorkA\merchantportal\affiliates.txt';
SET @SQLString = 'BULK INSERT ' + @SourceAffiliates + ' FROM '''
+ @ImportName + '''';
EXEC (@SQLString);
END;
生成されたコード:
CREATE OR REPLACE PROCEDURE dbo.Load_FuelMgtMasterData ()
RETURNS STRING
LANGUAGE JAVASCRIPT
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"transact"}}'
EXECUTE AS CALLER
AS
$$
// SnowConvert AI Helpers Code section is omitted.
/*** SSC-EWI-0040 - THE 'SET' CLAUSE IS NOT SUPPORTED IN SNOWFLAKE ***/
/* SET NOCOUNT ON*/
;
let SQLSTRING;
let IMPORTNAME;
let TODAY;
let YESTERDAY;
let SOURCEAFFILIATES;
TODAY = SELECT(` CURRENT_TIMESTAMP() :: TIMESTAMP`);
YESTERDAY = SELECT(` DATEADD(DAY, -1, ?)`,[TODAY]);
EXEC(` TRUNCATE TABLE dbo.SourceFM_Affiliates`);
IMPORTNAME = `\\` + SERVERNAME + `\WorkA\merchantportal\affiliates.txt`;
SQLSTRING =
// ** SSC-EWI-TS0032 - THE BULK INSERT WAS PART OF A DYNAMIC SQL, WHICH MAKES SOME OF THE TRANSLATED ELEMENTS INVALID UNLESS EXECUTED OUTSIDE DYNAMIC CODE. **
`CREATE OR REPLACE FILE FORMAT FILE_FORMAT_638923328992788100;
CREATE OR REPLACE STAGE STAGE_638923328992788100
FILE_FORMAT = FILE_FORMAT_638923328992788100;
PUT file://${IMPORTNAME} @STAGE_638923328992788100 AUTO_COMPRESS = FALSE;
COPY INTO ${SOURCEAFFILIATES}
FROM @STAGE_638923328992788100/${IMPORTNAME}`;
EXEC(`${SQLSTRING}`);
$$;
SSC-EWI-TS0034
RETURNS 句が記号の欠落により不完全
重大性
高
説明
この EWI は、CREATE FUNCTION の RETURNS TABLE 句が正しく生成できなかった場合に出力コードに追加されます。これは、結果として RETURNS TABLE 句で指定されなければならない列が、SnowConvert AI で推論できず、 RETURNS TABLE 句が空になってしまう場合に発生します。
コード例
入力コード:
CREATE FUNCTION Sales.ufn_SalesByStore2()
RETURNS TABLE
AS
RETURN
(
WITH CTE AS (
SELECT DepartmentID, Name, GroupName
FROM HumanResources.Department
)
SELECT tab.* FROM CTE tab
);
GO
SELECT * FROM GetDepartmentInfo();
生成されたコード:
--** SSC-FDM-0007 - MISSING DEPENDENT OBJECT "HumanResources.Department" **
CREATE OR REPLACE FUNCTION Sales.ufn_SalesByStore2 ()
RETURNS TABLE(
DepartmentID STRING /*** SSC-FDM-TS0012 - INFORMATION FOR THE COLUMN DepartmentID WAS NOT FOUND. STRING DATATYPE USED TO MATCH CAST AS STRING OPERATION ***/,
Name STRING /*** SSC-FDM-TS0012 - INFORMATION FOR THE COLUMN Name WAS NOT FOUND. STRING DATATYPE USED TO MATCH CAST AS STRING OPERATION ***/,
GroupName STRING /*** SSC-FDM-TS0012 - INFORMATION FOR THE COLUMN GroupName WAS NOT FOUND. STRING DATATYPE USED TO MATCH CAST AS STRING OPERATION ***/
)
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "transact", "convertedOn": "07/14/2025", "domain": "no-domain-provided" }}'
AS
$$
--** SSC-PRF-TS0001 - PERFORMANCE WARNING - RECURSION FOR CTE NOT CHECKED. MIGHT REQUIRE RECURSIVE KEYWORD **
WITH CTE AS (
SELECT
DepartmentID,
Name,
GroupName
FROM
HumanResources.Department
)
SELECT tab.* FROM
CTE tab
$$;
--** SSC-FDM-0007 - MISSING DEPENDENT OBJECT "GetDepartmentInfo" **
SELECT
*
FROM
TABLE(GetDepartmentInfo());
SSC-EWI-TS0035
初期化されないカーソル変数の宣言はサポートされていません。
重大性
中
注釈
わかりやすくするため、出力コードの一部を省略しています。
説明
Currently, a Cursor Variable that is declared but never initialized is not supported by Snowflake. Thus, the EWI is added, and the code commented out.
コード例
入力コード:
CREATE OR ALTER PROCEDURE notInitializedCursorTest
AS
BEGIN
-- Should be marked with SSC-EWI-TS0035
DECLARE @MyCursor CURSOR, @MyCursor2 CURSOR;
-- Should not be marked
DECLARE cursorVar CURSOR FORWARD_ONLY STATIC READ_ONLY
FOR
SELECT someCol
FROM someTable;
RETURN 'DONE';
END;
生成されたコード:
CREATE OR REPLACE PROCEDURE notInitializedCursorTest ()
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"transact"}}'
EXECUTE AS CALLER
AS
$$
DECLARE
-- Should be marked with SSC-EWI-TS0035
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0035 - CURSOR VARIABLE DECLARED BUT NEVER INITIALIZED, THIS IS NOT SUPPORTED IN SNOWFLAKE SCRIPTING ***/!!!
MYCURSOR CURSOR;
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0035 - CURSOR VARIABLE DECLARED BUT NEVER INITIALIZED, THIS IS NOT SUPPORTED IN SNOWFLAKE SCRIPTING ***/!!!
MYCURSOR2 CURSOR;
-- Should not be marked
cursorVar CURSOR
FOR
SELECT
someCol
FROM
someTable;
BEGIN
RETURN 'DONE';
END;
$$;
SSC-EWI-TS0036
Snowflakeスクリプトはローカルカーソルのみをサポートしています。
重大性
中
注釈
わかりやすくするため、出力コードの一部を省略しています。
説明
この EWI は、ローカルカーソル以外のカーソルが識別された場合に追加されます。現在、Snowflakeスクリプトはローカルカーソルのみをサポートしています。したがって、すべてのカーソルはローカルカーソルとして変換されます。
コード例
入力コード:
CREATE OR ALTER PROCEDURE globalCursorTest
AS
BEGIN
-- Should be marked with SSC-EWI-TS0036
DECLARE MyCursor CURSOR GLOBAL STATIC READ_ONLY
FOR
SELECT *
FROM exampleTable;
-- Should not be marked
DECLARE MyCursor2 CURSOR LOCAL STATIC READ_ONLY
FOR
SELECT testCol
FROM myTable;
RETURN 'DONE';
END;
CREATE OR REPLACE PROCEDURE globalCursorTest ()
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"transact"}}'
EXECUTE AS CALLER
AS
$$
DECLARE
-- Should be marked with SSC-EWI-TS0036
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0036 - SNOWFLAKE SCRIPTING ONLY SUPPORTS LOCAL CURSORS ***/!!!
MyCursor CURSOR
FOR
SELECT
*
FROM
exampleTable;
-- Should not be marked
MyCursor2 CURSOR
FOR
SELECT
testCol
FROM
myTable;
BEGIN
RETURN 'DONE';
END;
$$;
SSC-EWI-TS0037
Snowflakeスクリプトカーソルはスクロールできません。
重大性
中
注釈
わかりやすくするため、出力コードの一部を省略しています。
説明
Snowflakeスクリプトカーソルはスクロールできません。現在のところ、FETCH NEXT のみサポートされています。
コード例
入力コード:
CREATE OR ALTER PROCEDURE scrollablecursorTest
AS
BEGIN
-- Should be marked with SSC-EWI-TS0037
DECLARE CursorVar CURSOR SCROLL STATIC READ_ONLY
FOR
SELECT FirstName
FROM vEmployee;
-- Should not be marked
DECLARE CursorVar2 CURSOR STATIC READ_ONLY
FOR
SELECT FirstName
FROM vEmployee;
DECLARE CursorVar3 CURSOR FORWARD_ONLY STATIC READ_ONLY
FOR
SELECT FirstName
FROM vEmployee;
RETURN 'DONE';
END;
生成されたコード:
CREATE OR REPLACE PROCEDURE scrollablecursorTest ()
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"transact"}}'
EXECUTE AS CALLER
AS
$$
DECLARE
-- Should be marked with SSC-EWI-TS0037
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0037 - SNOWFLAKE SCRIPTING CURSORS ARE NON-SCROLLABLE, ONLY FETCH NEXT IS SUPPORTED ***/!!!
CursorVar CURSOR
FOR
SELECT
FirstName
FROM
vEmployee;
-- Should not be marked
CursorVar2 CURSOR
FOR
SELECT
FirstName
FROM
vEmployee;
CursorVar3 CURSOR
FOR
SELECT
FirstName
FROM
vEmployee;
BEGIN
RETURN 'DONE';
END;
$$;
SSC-EWI-TS0039
同じカーソルに対して複数の SET ステートメントが見つかりました。
重大性
中
説明
この EWI は、同じカーソルに対して複数の SET ステートメントが見つかった場合に追加されます。追加の SET ステートメントもすべてコメントアウトされます。これは、同じカーソルに対して複数の SET ステートメントを持つことは、Snowflakeスクリプトでは無効であるために起こります。
コード例:
入力コード:
CREATE OR ALTER PROCEDURE multipleSetExample
AS
BEGIN
DECLARE @MyCursor CURSOR;
DECLARE @MyCursor2 CURSOR STATIC READ_ONLY
FOR
SELECT FirstName
FROM vEmployee;
DECLARE @MyCursor3 CURSOR;
SET @MyCursor = CURSOR STATIC READ_ONLY
FOR
SELECT col3
FROM defaultTable;
SET @MyCursor3 = CURSOR STATIC READ_ONLY
FOR
SELECT *
FROM someTable;
SET @MyCursor = CURSOR DYNAMIC
FOR
SELECT col2
FROM exampleTable;
SET @MyCursor2 = CURSOR STATIC READ_ONLY
FOR
SELECT col3
FROM defaultTable;
RETURN 'DONE';
END;
生成されたコード:
CREATE OR REPLACE PROCEDURE multipleSetExample ()
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"transact"}}'
EXECUTE AS CALLER
AS
$$
DECLARE
MYCURSOR CURSOR
FOR
SELECT col3
FROM defaultTable;
MYCURSOR2 CURSOR
FOR
SELECT
FirstName
FROM
vEmployee;
MYCURSOR3 CURSOR
FOR
SELECT *
FROM someTable;
BEGIN
DECLARE
MYCURSOR CURSOR
FOR
SELECT col3
FROM defaultTable;
MYCURSOR2 CURSOR
FOR
SELECT
FirstName
FROM
vEmployee;
MYCURSOR3 CURSOR
FOR
SELECT *
FROM someTable;
BEGIN
!!!RESOLVE EWI!!! /*** SSC-EWI-0040 - THE 'SET CURSOR' CLAUSE IS NOT SUPPORTED IN SNOWFLAKE ***/!!!!!!RESOLVE EWI!!! /*** SSC-EWI-TS0039 - CURSOR VARIABLE MYCURSOR SET MULTIPLE TIMES, THIS IS NOT VALID IN SNOWFLAKE SCRIPTING ***/!!!
SET @MyCursor = CURSOR DYNAMIC
FOR
SELECT col2
FROM exampleTable;
!!!RESOLVE EWI!!! /*** SSC-EWI-0040 - THE 'SET CURSOR' CLAUSE IS NOT SUPPORTED IN SNOWFLAKE ***/!!!!!!RESOLVE EWI!!! /*** SSC-EWI-TS0039 - CURSOR VARIABLE MYCURSOR2 SET MULTIPLE TIMES, THIS IS NOT VALID IN SNOWFLAKE SCRIPTING ***/!!!
SET @MyCursor2 = CURSOR STATIC READ_ONLY
FOR
SELECT col3
FROM defaultTable;
RETURN 'DONE';
END;
$$;
SSC-EWI-TS0041
XML データ型メソッドはSnowflakeではサポートされていません。
重大性
中
説明
この EWI は、Snowflake SQL でサポートされていない以下の XML データ型メソッド のために追加されます。
コード例
入力コード:
CREATE PROCEDURE xml_procedure
@inUserGroupsXML XML
AS
BEGIN
SELECT entities.entity.value('TypeID[1]', 'VARCHAR(100)') AS TypeID
,entities.entity.value('Name[1]', 'VARCHAR(100)') AS Name
INTO #tmpUserGroups
FROM @inUserGroupsXML.nodes('/entities/entity') entities(entity)
END;
生成されたコード:
CREATE OR REPLACE PROCEDURE xml_procedure (INUSERGROUPSXML TEXT)
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"transact"}}'
EXECUTE AS CALLER
AS
$$
BEGIN
CREATE OR REPLACE TEMPORARY TABLE T_tmpUserGroups AS
SELECT
XMLGET(entity, '$') :: VARCHAR(100) AS TypeID
,
XMLGET(entity, '$') :: VARCHAR(100) AS Name
FROM
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0041 - XML TYPE METHOD nodes IS NOT SUPPORTED IN SNOWFLAKE ***/!!!
T_inUserGroupsXML('/entities/entity') entities (
entity
);
END;
$$;
SSC-EWI-TS0043
WITH XMLNAMESPACES はSnowflakeではサポートされていません。
重大性
中
注釈
わかりやすくするため、出力コードの一部を省略しています。
コード例
入力コード:
WITH XMLNAMESPACES ('uri' as ns1)
SELECT ProductID as 'ns1:ProductID',
Name as 'ns1:Name',
Color as 'ns1:Color'
FROM Production.Product
WHERE ProductID = 316
FOR XML RAW, ELEMENTS XSINIL
生成されたコード:
--** SSC-PRF-TS0001 - PERFORMANCE WARNING - RECURSION FOR CTE NOT CHECKED. MIGHT REQUIRE RECURSIVE KEYWORD **
WITH
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0043 - WITH XMLNAMESPACES IS NOT SUPPORTED IN SNOWFLAKE ***/!!!
XMLNAMESPACES ('uri' as VARIANT !!!RESOLVE EWI!!! /*** SSC-EWI-TS0015 - DATA TYPE NS1 IS NOT SUPPORTED IN SNOWFLAKE ***/!!! NOT NULL)
SELECT
ProductID AS "ns1:ProductID",
Name AS "ns1:Name",
Color AS "ns1:Color"
FROM
Production.Product
WHERE
ProductID = 316
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0044 - FOR XML RAW CLAUSE IS NOT SUPPORTED IN SNOWFLAKE ***/!!!
FOR XML RAW, ELEMENTS XSINIL;
ベストプラクティス
SQL Server
CREATE TABLE PRODUCT (ProductID INTEGER, Name VarChar(20), Color VarChar(20));
INSERT INTO PRODUCT(PRODUCTID, NAME, COLOR) VALUES(1,'UMBRELLA','RED');
INSERT INTO PRODUCT(PRODUCTID, NAME, COLOR) VALUES(2,'SHORTS','BLUE');
INSERT INTO PRODUCT(PRODUCTID, NAME, COLOR) VALUES(3,'BALL','YELLOW');
WITH XMLNAMESPACES ('uri' as ns1)
SELECT ProductID as 'ns1:ProductID',
Name as 'ns1:Name',
Color as 'ns1:Color'
FROM Product
FOR XML RAW
Snowflake SQL
CREATE OR REPLACE TABLE PRODUCT (
ProductID INTEGER,
Name VARCHAR(20),
Color VARCHAR(20))
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "transact", "convertedOn": "07/12/2024" }}'
;
INSERT INTO PRODUCT (PRODUCTID, NAME, COLOR) VALUES(1,'UMBRELLA','RED');
INSERT INTO PRODUCT (PRODUCTID, NAME, COLOR) VALUES(2,'SHORTS','BLUE');
INSERT INTO PRODUCT (PRODUCTID, NAME, COLOR) VALUES(3,'BALL','YELLOW');
--** SSC-PRF-TS0001 - PERFORMANCE WARNING - RECURSION FOR CTE NOT CHECKED. MIGHT REQUIRE RECURSIVE KEYWORD **
WITH
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0043 - WITH XMLNAMESPACES IS NOT SUPPORTED IN SNOWFLAKE ***/!!! XMLNAMESPACES ('uri' as ns1)
SELECT
ProductID AS "ns1:ProductID",
Name AS "ns1:Name",
Color AS "ns1:Color"
FROM
Product
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0044 - FOR XML RAW CLAUSE IS NOT SUPPORTED IN SNOWFLAKE ***/!!!
FOR XML RAW;
SSC-EWI-TS0044
FOR XML 句はSnowflakeではサポートされていません。
重大性
Critical
注釈
わかりやすくするため、出力コードの一部を省略しています。
説明
この EWI は、Snowflake SQL ではサポートされていない FOR XML 句のために追加されています。
コード例
入力コード:
SELECT TOP 1 LastName
FROM AdventureWorks2019.Person.Person
FOR XML AUTO;
生成されたコード:
SELECT TOP 1
LastName
FROM
AdventureWorks2019.Person.Person
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0044 - FOR XML AUTO CLAUSE IS NOT SUPPORTED IN SNOWFLAKE ***/!!!
FOR XML AUTO;
ベストプラクティス
SQL Server
クエリ
CREATE TABLE TEMPTABLE (Ref INT, Des NVARCHAR(100), Qty INT)
INSERT INTO tempTable VALUES (100001, 'Normal', 1), (100002, 'Foobar', 1), (100003, 'Hello World', 2)
GO
-- FOR XML
SELECT *
FROM TempTable
FOR XML AUTO
GO
-- FOR XML RAW
SELECT *
FROM TempTable
FOR XML RAW
結果
-- FOR XML
<TempTable Ref="100001" Des="Normal" Qty="1"/><TempTable Ref="100002" Des="Foobar" Qty="1"/><TempTable Ref="100003" Des="Hello World" Qty="2"/>
-- FOR XML RAW
<row Ref="100001" Des="Normal" Qty="1"/><row Ref="100002" Des="Foobar" Qty="1"/><row Ref="100003" Des="Hello World" Qty="2"/>
クエリ
CREATE OR REPLACE TABLE TEMPTABLE (
Ref INT,
Des VARCHAR(100),
Qty INT
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"transact"}}'
;
INSERT INTO tempTable VALUES (100001, 'Normal', 1), (100002, 'Foobar', 1), (100003, 'Hello World', 2);
-- FOR XML
SELECT
*
FROM
TempTable
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0044 - FOR XML AUTO CLAUSE IS NOT SUPPORTED IN SNOWFLAKE ***/!!!
FOR XML AUTO;
-- FOR XML RAW
SELECT
*
FROM
TempTable
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0044 - FOR XML RAW CLAUSE IS NOT SUPPORTED IN SNOWFLAKE ***/!!!
FOR XML RAW;
結果
-- FOR XML
<TempTable DES="Normal" QTY="1" REF="100001" /><TempTable DES="Foobar" QTY="1" REF="100002" /><TempTable DES="Hello World" QTY="2" REF="100003" />
-- FOR XML RAW
<row DES="Normal" QTY="1" REF="100001" /><row DES="Foobar" QTY="1" REF="100002" /><row DES="Hello World" QTY="2" REF="100003" />
SSC-EWI-TS0045
ラベル付きステートメントは、Snowflakeスクリプトではサポートされていません。
重大性
低
注釈
わかりやすくするため、出力コードの一部を省略しています。
説明
この EWI は、SQL Serverの GOTO で使用されるすべての LABELS に対して追加されます。
コード例
入力コード:
CREATE PROCEDURE GoToProcedure
AS
BEGIN
DECLARE @TotalMaarks INT
SET @TotalMaarks = 49
IF @TotalMaarks >= 50
GOTO Pass
IF @TotalMaarks < 50
GOTO Fail
Pass:
SELECT 1;
SELECT * FROM TABLE1;
RETURN 1;
Fail:
SELECT 2;
SELECT * FROM TABLE2;
RETURN 2;
END
生成されたコード:
CREATE OR REPLACE PROCEDURE GoToProcedure ()
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"transact"}}'
EXECUTE AS CALLER
AS
$$
DECLARE
TOTALMAARKS INT;
BEGIN
TOTALMAARKS := 49;
IF (:TOTALMAARKS >= 50) THEN
!!!RESOLVE EWI!!! /*** SSC-EWI-0073 - PENDING FUNCTIONAL EQUIVALENCE REVIEW FOR 'GOTO' NODE ***/!!!
GOTO Pass
END IF;
IF (:TOTALMAARKS < 50) THEN
!!!RESOLVE EWI!!! /*** SSC-EWI-0073 - PENDING FUNCTIONAL EQUIVALENCE REVIEW FOR 'GOTO' NODE ***/!!!
GOTO Fail
END IF;
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0045 - LABELED STATEMENT IS NOT SUPPORTED IN SNOWFLAKE SCRIPTING ***/!!!
Pass:
SELECT 1;
SELECT
*
FROM
TABLE1;
RETURN 1;
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0045 - LABELED STATEMENT IS NOT SUPPORTED IN SNOWFLAKE SCRIPTING ***/!!!
Fail:
SELECT 2;
SELECT
*
FROM
TABLE2;
RETURN 2;
END;
$$;
SSC-EWI-TS0046
システムテーブルはSnowflakeではサポートされていません。
重大性
中
コード例
入力コード:
SELECT *
FROM
sys.all_sql_modules
WHERE
[STATE] = 0; -- state must be ONLINE
生成されたコード:
SELECT
*
FROM
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0046 - SYSTEM TABLE sys.all_sql_modules IS NOT SUPPORTED IN SNOWFLAKE ***/!!!
sys.all_sql_modules
WHERE
STATE = 0; -- state must be ONLINE
SSC-EWI-TS0047
RAISERROR エラーメッセージは、SQL Serverの文字列形式により異なる場合があります。
重大性
低
説明
この EWI は、RAISERROR エラーメッセージが SQL Serverの文字列形式により異なる場合があることを通知するために追加されています。
コード例
入力コード:
CREATE PROCEDURE RAISERROR_PROCEDURE
AS
BEGIN
RAISERROR ('This is a sample error message with the first parameter %d and the second parameter %*.*s',
10,
1,
123,
7,
7,
'param2');
END
生成されたコード:
CREATE OR REPLACE PROCEDURE RAISERROR_PROCEDURE ()
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"transact"}}'
EXECUTE AS CALLER
AS
$$
BEGIN
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0047 - RAISERROR ERROR MESSAGE MAY DIFFER BECAUSE OF THE SQL SERVER STRING FORMAT ***/!!!
SELECT
RAISERROR_UDF('This is a sample error message with the first parameter %d and the second parameter %*.*s',
10,
1, array_construct(
123,
7,
7,
'param2'));
END;
$$;
SSC-EWI-TS0049
複数行のIf本文は今後配信される予定です。
注釈
わかりやすくするため、出力コードの一部を省略しています。
重大性
中
説明
IF ステートメントで本文に Begin ...End ブロックを含むもののほとんどはサポートされています。これは成功するシナリオです(SSC-EWI-TS0049 は生成されません)。
コード例
入力コード:
CREATE OR ALTER FUNCTION [PURCHASING].[FOO](@status INT)
Returns INT
As
Begin
declare @result as int = 10;
SELECT @result = quantity FROM TABLE1 WHERE COL1 = @status;
IF @result = 3
BEGIN
IF @result>0 SELECT @result=0 ELSE SELECT @result=1
SELECT @result = 1
END
return @result;
End
生成されたコード:
!!!RESOLVE EWI!!! /*** SSC-EWI-0068 - USER DEFINED FUNCTION WAS TRANSFORMED TO SNOWFLAKE PROCEDURE ***/!!!
--** SSC-FDM-0007 - MISSING DEPENDENT OBJECT "TABLE1" **
CREATE OR REPLACE PROCEDURE PURCHASING.FOO (STATUS INT)
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "transact", "convertedOn": "07/14/2025", "domain": "no-domain-provided" }}'
EXECUTE AS CALLER
AS
$$
DECLARE
RESULT INT := 10;
BEGIN
SELECT
quantity
INTO
:RESULT
FROM
TABLE1
WHERE
COL1 = :STATUS;
IF (:RESULT = 3) THEN
BEGIN
IF (:RESULT >0) THEN SELECT
0
INTO
:RESULT;
ELSE
SELECT
1
INTO
:RESULT;
END IF;
SELECT
1
INTO
:RESULT;
END;
END IF;
RETURN :RESULT;
END;
$$;
注釈
一般的な(上のような)コード例では、変換は正常に行われます。しかし、「IF」ステートメントが変換されず、EWI が生成されるエッジケースもあります。
手動サポート
ケース1: 単一のステートメント
このようなケースでは、変換されたステートメントはselect句に現れるので、変換は簡単です。
IF @result = 0
BEGIN
SET @result =1
END
CASE WHEN (SELECT RESULT FROM CTE2)= 0 THEN
( SELECT 1 AS RESULT )
ケース2: 複数のステートメント
複数のステートメントを変換する場合、Nステートメントを変換し、これをN+1ステートメントのソーステーブルとして使用します。
IF @result = 0
BEGIN
Statement1
Statement2
Statement3
END
CASE WHEN (SELECT RESULT FROM CTE2)= 0 THEN
(
SELECT TransformedStatement3
FROM (
SELECT TransformedStatement2
FROM (
SELECT TransformedStatement1
) T1
) T2
)
ケース3: 複数のセットステートメント
このようなケースでは、setステートメントごとに変換を繰り返す必要があります。
IF @result = 0
BEGIN
SET @var1 = 1
SET @var2 = 3
SET @var3 = @var2
END
WITH CTE1 AS (
SELECT
CASE WHEN (SELECT
RESULT
FROM
CTE0) = 0 THEN
(SELECT 1) AS VAR1)
WITH CTE2 AS (
SELECT
CASE WHEN (SELECT
RESULT
FROM
CTE0)= 0 THEN
(SELECT 3) AS VAR2)
WITH CTE3 AS (
SELECT
CASE WHEN (SELECT
RESULT
FROM
CTE0)= 0 THEN
(SELECT T1.VAR2
FROM ((SELECT 3) AS VAR2) AS T1) AS VAR3)
...
SSC-EWI-TS0055
デフォルトの制約がコメントアウトされ、テーブル定義に追加された可能性があります。
重大性
中
説明
この EWI は、Alter Tableステートメントにデフォルトの制約が存在する場合に追加されます。
現在のところ、その制約はサポートされていません。これを変換するために利用可能な回避策としては、Alter Tableの前にテーブルを定義しておくことです。こうすると、参照を特定でき、デフォルトの制約はテーブル定義に統合されます。そうしなければ、制約がコメントアウトされるだけです。
コード例
入力コード:
CREATE TABLE table1(
col1 integer,
col2 varchar collate Latin1_General_CS,
col3 date
);
ALTER TABLE table1
ADD col4 integer,
CONSTRAINT col1_constraint DEFAULT 50 FOR col1,
CONSTRAINT col1_constraint DEFAULT 30 FOR col1;
生成されたコード:
CREATE OR REPLACE TABLE table1 (
col1 INTEGER DEFAULT 50,
col2 VARCHAR COLLATE 'EN-CS',
col3 DATE
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"transact"}}'
;
ALTER TABLE table1
ADD col4 INTEGER,
CONSTRAINT col1_constraint
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0055 - DEFAULT CONSTRAINT MAY HAVE BEEN ADDED TO TABLE DEFINITION ***/!!!
DEFAULT 50 FOR col1,
CONSTRAINT col1_constraint
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0055 - DEFAULT CONSTRAINT MAY HAVE BEEN ADDED TO TABLE DEFINITION ***/!!!
DEFAULT 30 FOR col1;
注釈
Alter Tableの内容がすべて無効である場合、Alter Tableはコメントアウトされることになります。
既知の問題
同じ列に対して異なるデフォルトの制約が宣言されている場合、最初の制約のみがCreate Tableステートメントに反映されます。
SSC-EWI-TS0056
MASKING POLICY がMASKED WITH の代用で作成されました。
重大性
低
注釈
わかりやすくするため、出力コードの一部を省略しています。
説明
この EWI は、Alter Tableステートメントに MASKED WITH 句が含まれている場合に追加されます。これが追加されている理由は、MASKED WITH 関数の代用として、近似の MASKING POLICY が作成されたことを通知するためです。
コード例
入力コード:
ALTER TABLE table_name
ALTER COLUMN column_name
ADD MASKED WITH (FUNCTION = 'default()');
生成されたコード:
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0057 - MASKING ROLE MUST BE DEFINED PREVIOUSLY BY THE USER ***/!!!
CREATE OR REPLACE MASKING POLICY "default" AS
(val STRING)
RETURNS STRING ->
CASE
WHEN current_role() IN ('YOUR_DEFINED_ROLE_HERE')
THEN val
ELSE 'xxxxx'
END;
ALTER TABLE IF EXISTS table_name MODIFY COLUMN column_name!!!RESOLVE EWI!!! /*** SSC-EWI-TS0056 - A MASKING POLICY WAS CREATED AS SUBSTITUTE FOR MASKED WITH ***/!!! SET MASKING POLICY "default";
注釈
MASKING POLICY は、ALTER TABLE ステートメントの前に作成されます。そして、ほぼ同じ動作をすることが期待されます。ロールとユーザー権限に関して、いくつかの微調整が必要となる可能性があります。 <!-- TODO: You can relate to Broken link broken-reference "mention" for further details.>
SSC-EWI-TS0057
ユーザーは事前にマスキングロールを定義しておく必要があります。
重大性
低
注釈
わかりやすくするため、出力コードの一部を省略しています。
説明
この EWI は、MASKING POLICY が作成され、データマスキングが適切に機能するように、ロールまたは権限をそこにリンクする必要がある場合に発生します。
コード例
入力コード
ALTER TABLE tableName
ALTER COLUMN columnName
ADD MASKED WITH (FUNCTION = 'partial(1, "xxxxx", 1)');
生成されたコード:
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0057 - MASKING ROLE MUST BE DEFINED PREVIOUSLY BY THE USER ***/!!!
CREATE OR REPLACE MASKING POLICY "partial_1_xxxxx_1" AS
(val STRING)
RETURNS STRING ->
CASE
WHEN current_role() IN ('YOUR_DEFINED_ROLE_HERE')
THEN val
ELSE LEFT(val, 1) || 'xxxxx' || RIGHT(val, 1)
END;
ALTER TABLE IF EXISTS tableName MODIFY COLUMN columnName!!!RESOLVE EWI!!! /*** SSC-EWI-TS0056 - A MASKING POLICY WAS CREATED AS SUBSTITUTE FOR MASKED WITH ***/!!! SET MASKING POLICY "partial_1_xxxxx_1";
注釈
As shown on line 6, there is a placeholder where the defined roles can be placed. There is room for one or several values separated by commas. Also, here, the use of single quotes is mandatory for each of the values.
SSC-EWI-TS0060
日付間隔はSnowflakeではサポートされていません。
重大性
中
説明
この EWI は、日付関連関数のパラメーターとして以下の時間部分のいずれかが使用される場合に追加されます。これらはSnowflakeではサポートされていないためです。詳細については、サポートされている日付と時間の部分( 日付と時刻の関数 | Snowflakeドキュメント )をご参照ください。
コード例
入力コード
SELECT
-- Supported
DATEPART(second, getdate()),
-- Not supported
DATEPART(millisecond, getdate()),
DATEPART(microsecond, getdate());
生成されたコード:
SELECT
-- Supported
DATE_PART(second, CURRENT_TIMESTAMP() :: TIMESTAMP),
-- Not supported
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0060 - TIME PART 'millisecond' NOT SUPPORTED AS A FUNCTION PARAMETER ***/!!!
DATEPART(millisecond, CURRENT_TIMESTAMP() :: TIMESTAMP),
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0060 - TIME PART 'microsecond' NOT SUPPORTED AS A FUNCTION PARAMETER ***/!!!
DATEPART(microsecond, CURRENT_TIMESTAMP() :: TIMESTAMP);
SSC-EWI-TS0061
ALTER COLUMN はサポートされていません。
重大性
中
注釈
わかりやすくするため、出力コードの一部を省略しています。
説明
この EWI は、サポートされていない ALTER COLUMN ステートメントがあるたびに追加されます。
コード例
入力コード:
ALTER TABLE SampleTable
ALTER COLUMN SampleColumn INT NULL SPARSE;
生成されたコード:
ALTER TABLE IF EXISTS SampleTable
ALTER COLUMN SampleColumn
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0061 - ALTER COLUMN COMMENTED OUT BECAUSE SPARSE COLUMN IS NOT SUPPORTED IN SNOWFLAKE ***/!!!
INT NULL SPARSE;
SSC-EWI-TS0063
タイムゾーンはSnowflakeではサポートされていません。
重大性
Critical
説明
この EWI は、Snowflakeでサポートされていないタイムゾーンがある場合に追加されます。
コード例
入力コード:
SELECT current_timestamp at time zone 'Turks And Caicos Standard Time';
生成されたコード:
SELECT
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0063 - TIME ZONE NOT SUPPORTED IN SNOWFLAKE ***/!!!
CURRENT_TIMESTAMP() at time zone 'Turks And Caicos Standard Time'
;
SSC-EWI-TS0067
OPENXML テーブル値関数のパラメーターが無効です。
重大性
重大
注釈
わかりやすくするため、出力コードの一部を省略しています。
説明
この EWI は、OPENXML に無効なパラメーターがある場合、特に XML パスにアクセスできない場合に追加されます。
この EWI を避けるには、パラメーターを通して明示的なノードパスを送ってください。
入力コード:
SELECT
*
FROM
OPENXML (@idoc, @path, 1) WITH (
CustomerID VARCHAR(10),
ContactName VARCHAR(20)
);
生成されたコード:
SELECT
*
FROM
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0067 - INVALID PARAMETERS IN OPENXML TABLE-VALUED FUNCTION ***/!!!
OPENXML(@idoc, @path, 1);
生成されたコード(明示的パラメーター)
SELECT
Left(value:Customer['@CustomerID'], '10') AS 'CustomerID',
Left(value:Customer['@ContactName'], '20') AS 'ContactName'
FROM
OPENXML_UDF($idoc, ':ROOT:Customer');
SSC-EWI-TS0070
At Time Zoneステートメントの CURRENT_TIMESTAMP は異なる動作をすることがあります。
説明
この EWI は、At Time Zone に CURRENT_TIMESTAMP がある場合に追加されます。これは、場合によっては結果が異なる可能性があるためです。
主な違いは、SQL Serverでは、CURRENT_TIMESTAMP がサーバーのタイムゾーンで現在のシステムの日付と時刻を返し、Snowflakeでは、CURRENT_TIMESTAMP が UTC(協定世界時)のタイムゾーンで現在の日付と時刻を返すことです。
入力コード:
SQL Server
SELECT current_timestamp at time zone 'Hawaiian Standard Time';
結果
2024-02-08 16:52:55.317 -10:00
Snowflake
SELECT
CONVERT_TIMEZONE('Pacific/Honolulu', CURRENT_TIMESTAMP() !!!RESOLVE EWI!!! /*** SSC-EWI-TS0070 - CURRENT_TIMESTAMP in At Time Zone statement may have a different behavior in certain cases ***/!!!);
結果
2024-02-08 06:53:46.994 -1000
ベストプラクティス
これは、Snowflakeで同じ形式を維持したい場合の例です。
SQL Server
SELECT current_timestamp at time zone 'Hawaiian Standard Time';
結果
2024-02-08 16:33:49.143 -10:00
Snowflakeでは、 ALTER SESSION を使ってデフォルトのタイムゾーンを変更することができます。例:
Snowflake
ALTER SESSION SET TIMEZONE = 'Pacific/Honolulu';
SELECT
CONVERT_TIMEZONE('Pacific/Honolulu', 'UTC', CURRENT_TIMESTAMP());
結果
2024-02-08 16:33:49.143
SSC-EWI-TS0072
RETURN ステートメントは以前の RETURN ステートメントのために無視されます。
重大性
低
注釈
わかりやすくするため、出力コードの一部を省略しています。
説明
この EWI は、SELECT ステートメントと OUPUT パラメーターを返す必要がある場合に追加されます。この場合、SELECT ステートメントからの結果セットが優先されます。
入力コード:
CREATE PROCEDURE SOMEPROC(@product_count INT OUTPUT, @123 INT OUTPUT)
AS
BEGIN
SELECT * from AdventureWorks.HumanResources.Department;
SELECT * from AdventureWorks.HumanResources.Employee;
END
生成されたコード:
--** SSC-FDM-0007 - MISSING DEPENDENT OBJECTS "AdventureWorks.HumanResources.Department", "AdventureWorks.HumanResources.Employee" **
CREATE OR REPLACE PROCEDURE SOMEPROC (PRODUCT_COUNT OUT INT, _123 OUT INT)
RETURNS ARRAY
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
ProcedureResultSet1 VARCHAR;
ProcedureResultSet2 VARCHAR;
return_arr ARRAY := array_construct();
BEGIN
ProcedureResultSet1 := 'RESULTSET_' || REPLACE(UPPER(UUID_STRING()), '-', '_');
CREATE OR REPLACE TEMPORARY TABLE IDENTIFIER(:ProcedureResultSet1) AS
SELECT
*
from
AdventureWorks.HumanResources.Department;
return_arr := array_append(return_arr, :ProcedureResultSet1);
ProcedureResultSet2 := 'RESULTSET_' || REPLACE(UPPER(UUID_STRING()), '-', '_');
CREATE OR REPLACE TEMPORARY TABLE IDENTIFIER(:ProcedureResultSet2) AS
SELECT
*
from
AdventureWorks.HumanResources.Employee;
return_arr := array_append(return_arr, :ProcedureResultSet2);
--** SSC-FDM-0020 - MULTIPLE RESULT SETS ARE RETURNED IN TEMPORARY TABLES **
RETURN return_arr;
END;
$$;
SSC-EWI-TS0073
Snowflakeではエラーメッセージが異なる可能性があります
重大性
低
説明
この EWI は、ERROR_MESSAGE() の変換に追加されます。エラーの正確なメッセージはSnowflakeでは変わる可能性があります。
入力コード:
SET @varErrorMessage = ERROR_MESSAGE()
生成されたコード
BEGIN
VARERRORMESSAGE := SQLERRM !!!RESOLVE EWI!!! /*** SSC-EWI-TS0073 - ERROR MESSAGE COULD BE DIFFERENT IN SNOWFLAKE ***/!!!;
END;
SSC-EWI-TS0074
キャストの結果は、依存関係の欠落により、TRY_CAST/TRY_CONVERT 関数とは異なる可能性があります。
重大性
低
注釈
わかりやすくするため、出力コードの一部を省略しています。
説明
この EWI は、TRY_CAST と TRY_CONVERT 関数の変換で追加されます。これらの関数の正確な結果は、依存関係の欠落により、Snowflakeでは変わる可能性があります(SnowConvert AI が一部のデータ型を解決できませんでした)。これは依存関係がソースコードになかったことが原因である可能性があります。
入力コード:
SELECT TRY_CONVERT( INT, col1) FROM TABLE1;
SELECT TRY_CAST(COL1 AS FLOAT) FROM TABLE1
生成されたコード
SELECT
CAST(col1 AS INT) /*** SSC-FDM-TS0005 - TRY_CONVERT/TRY_CAST COULD NOT BE CONVERTED TO TRY_CAST ***/!!!RESOLVE EWI!!! /*** SSC-EWI-TS0074 - CAST RESULT MAY BE DIFFERENT FROM TRY_CONVERT FUNCTION DUE TO MISSING DEPENDENCIES ***/!!!
FROM
TABLE1;
SELECT
CAST(COL1 AS FLOAT) /*** SSC-FDM-TS0005 - TRY_CONVERT/TRY_CAST COULD NOT BE CONVERTED TO TRY_CAST ***/!!!RESOLVE EWI!!! /*** SSC-EWI-TS0074 - CAST RESULT MAY BE DIFFERENT FROM TRY_CAST FUNCTION DUE TO MISSING DEPENDENCIES ***/!!!
FROM
TABLE1;
SSC-EWI-TS0075
組み込みプロシージャはサポートされていません
重大性
中
説明
組み込みプロシージャの翻訳は現在サポートされていません。
コード例
入力コード:
EXEC sp_column_privileges_rowset_rmt 'Caption';
生成されたコード:
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0075 - TRANSLATION FOR BUILT-IN PROCEDURE 'sp_column_privileges_rowset_rmt' IS NOT CURRENTLY SUPPORTED. ***/!!!
EXEC sp_column_privileges_rowset_rmt 'Caption';
SSC-EWI-TS0076
デフォルトパラメーターの並び替えが必要な場合があります
注釈
This EWI is deprecated. SnowConvert AI now automatically reorders default parameters to the end of the parameter list. Please refer to SSC-FDM-0041 for the updated behavior.
重大性
中
説明
デフォルトパラメーターの並び替えが必要な場合があります。Snowflakeは、パラメーター宣言の末尾にあるデフォルトパラメーターのみをサポートしています。
コード例
入力コード:
CREATE PROCEDURE MySampleProc
@Param1 NVARCHAR(50) = NULL,
@Param2 NVARCHAR(10),
@Param3 NVARCHAR(10) = NULL,
@Param4 NVARCHAR(10)
AS
SELECT 1;
生成されたコード:
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0076 - DEFAULT PARAMETERS MAY NEED TO BE REORDERED. SNOWFLAKE ONLY SUPPORTS DEFAULT PARAMETERS AT THE END OF THE PARAMETERS DECLARATIONS. ***/!!!
CREATE OR REPLACE PROCEDURE MySampleProc (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;
$$;
SSC-EWI-TS0077
照合順序はサポートされていません
重大性
低
説明
このメッセージは、Snowflakeでサポートされていないcollate句がある場合に表示されます。
コード例
入力コード:
SELECT 'a' COLLATE Albanian_BIN;
SELECT 'a' COLLATE Albanian_CI_AI;
CREATE TABLE ExampleTable (
ID INT,
Name VARCHAR(50) COLLATE collateName
);
生成されたコード:
SELECT 'a'
-- !!!RESOLVE EWI!!! /*** SSC-EWI-TS0077 - COLLATION Albanian_BIN NOT SUPPORTED ***/!!!
-- COLLATE Albanian_BIN
;
SELECT 'a'
-- !!!RESOLVE EWI!!! /*** SSC-EWI-TS0077 - COLLATION Albanian_CI_AI NOT SUPPORTED ***/!!!
-- COLLATE Albanian_CI_AI
;
CREATE OR REPLACE TABLE ExampleTable (
ID INT,
Name VARCHAR(50)
-- !!!RESOLVE EWI!!! /*** SSC-EWI-TS0077 - COLLATION collateName NOT SUPPORTED ***/!!!
-- COLLATE collateName
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"transact"}}'
;
SSC-EWI-TS0078
Snowflakeではデフォルト値は使用できません。
重大性
中
説明
このエラーは、関数呼び出し、変数名、名前付き定数などの式がデフォルトオプションに従う場合にコードに追加されます。
Snowflakeでは、数値や文字列のような明示的な定数のみをサポートしています。
コード例
入力コード:
ALTER TABLE
T_ALTERTABLETEST
ADD
COLUMN COL10 INTEGER DEFAULT RANDOM(10);
生成されたコード:
--** SSC-FDM-0007 - MISSING DEPENDENT OBJECTS "T_ALTERTABLETEST", "RANDOM" **
ALTER TABLE IF EXISTS T_ALTERTABLETEST
ADD
COLUMN COL10 INTEGER
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0078 - DEFAULT OPTION NOT ALLOWED IN SNOWFLAKE ***/!!!
DEFAULT RANDOM(10);
SSC-EWI-TS0079
データベースコンソールコマンドはサポートされていません
重大性
中
説明
この EWI は、SnowConvert AI が入力コード内にDBCC ステートメントを見つけた場合に追加されます。\ ほとんどの DBCC ステートメントは、Snowflakeではサポートされていません。
コード例
入力コード:
DBCC CHECKIDENT(@a, RESEED, @b) WITH NO_INFOMSGS
生成されたコード:
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0079 - DATABASE CONSOLE COMMAND 'CHECKIDENT' IS NOT SUPPORTED. ***/!!!
DBCC CHECKIDENT(@a, RESEED, @b) WITH NO_INFOMSGS;
SSC-EWI-TS0080
実行時に実行コンテキストを変更することは、Snowflakeではサポートされていません。
重大性
高
説明
SQL Serverのユーザーは、 EXECUTE AS コマンドを使用して一時的に実行コンテキストを変更することができます。これは実行権限を変更し、 USER_NAME() のようなコンテキスト依存関数の結果に影響を与えます。REVERT コマンドを使用すると、最後の EXECUTE AS より前のコンテキストを復元できます。
Snowflakeでは、CREATE PROCEDURE または ALTER PROCEDURE ステートメントのいずれかを使用した、プロシージャ内での実行コンテキストの定義のみをサポートしています。実行時にコンテキストを変更することはサポートされていません。
コード例
入力コード:
CREATE PROCEDURE proc1()
WITH EXECUTE AS OWNER
AS
BEGIN
SELECT USER_NAME();
EXECUTE AS CALLER;
SELECT USER_NAME();
REVERT;
SELECT USER_NAME();
END
GO
出力コード:
CREATE OR REPLACE PROCEDURE proc1 ()
RETURNS ARRAY
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "transact", "convertedOn": "07/05/2024" }}'
EXECUTE AS OWNER
AS
$$
DECLARE
ProcedureResultSet1 VARCHAR;
ProcedureResultSet2 VARCHAR;
ProcedureResultSet3 VARCHAR;
return_arr ARRAY := array_construct();
BEGIN
ProcedureResultSet1 := 'RESULTSET_' || REPLACE(UPPER(UUID_STRING()), '-', '_');
CREATE OR REPLACE TEMPORARY TABLE IDENTIFIER(:ProcedureResultSet1) AS
SELECT
CURRENT_USER();
return_arr := array_append(return_arr, :ProcedureResultSet1);
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0080 - CHANGING THE EXECUTION CONTEXT AT RUNTIME IS NOT SUPPORTED IN SNOWFLAKE. ***/!!!
EXECUTE AS CALLER;
ProcedureResultSet2 := 'RESULTSET_' || REPLACE(UPPER(UUID_STRING()), '-', '_');
CREATE OR REPLACE TEMPORARY TABLE IDENTIFIER(:ProcedureResultSet2) AS
SELECT
CURRENT_USER();
return_arr := array_append(return_arr, :ProcedureResultSet2);
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0080 - CHANGING THE EXECUTION CONTEXT AT RUNTIME IS NOT SUPPORTED IN SNOWFLAKE. ***/!!!
REVERT;
ProcedureResultSet3 := 'RESULTSET_' || REPLACE(UPPER(UUID_STRING()), '-', '_');
CREATE OR REPLACE TEMPORARY TABLE IDENTIFIER(:ProcedureResultSet3) AS
SELECT
CURRENT_USER();
return_arr := array_append(return_arr, :ProcedureResultSet3);
--** SSC-FDM-0020 - MULTIPLE RESULT SETS ARE RETURNED IN TEMPORARY TABLES **
RETURN return_arr;
END;
$$;
SSC-EWI-TS0081
Deleteステートメントでの完全結合の使用はサポートされていません
説明
DELETE ステートメントを変換する際、SnowConvert AI はステートメントの FROM 句にあるテーブル参照を抽出し、それをSnowflakeのDELETEステートメントの USING 句に移動します。
The following EWI warns the user about the limitations of the outer join (+) syntax in Snowflake. To preserve the LEFT and RIGHT JOINs used in the original code, outer join syntax (+) is added to the conditions to indicate such behavior. However, in Snowflake, the (+) syntax can't be used to indicate FULL JOINs. For more information, see Joins in the WHERE clause.
コード例
入力コード:
DELETE Employees
FROM Employees FULL OUTER JOIN Departments
ON Employees.DepartmentID = Departments.DepartmentID
WHERE Departments.DepartmentID IS NULL;
生成されたコード:
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0081 - USING A FULL JOIN IN A DELETE STATEMENT IS NOT SUPPORTED IN SNOWFLAKE ***/!!!
DELETE FROM
Employees
USING Departments
WHERE
Departments.DepartmentID IS NULL
AND Employees.DepartmentID = Departments.DepartmentID;
ベストプラクティス
入力:
DELETE Employees
FROM Employees LEFT OUTER JOIN Departments
ON Employees.DepartmentID = Departments.DepartmentID
WHERE Departments.DepartmentID IS NULL;
出力:
DELETE FROM
Employees
USING Departments
WHERE
Departments.DepartmentID IS NULL
AND Employees.DepartmentID = Departments.DepartmentID(+);
SSC-EWI-TS0082
CROSS APPLY は LEFT OUTER JOIN に変換されており、手動での検証が必要です。
説明
CROSS APPLY から LEFT OUTER JOIN への変換は、Snowflakeにおいて正しくない結果や予期しない動作につながる可能性があるため、手動による検証が必要です。この2つの関数は似ているように見えるかもしれませんが、特にサブクエリがマッチしない場合や、サブクエリがアウターテーブルと相関している場合など、処理する状況が異なります。
コード例
セットアップデータ
-- Create a table to store monthly sales or metric data
CREATE TABLE sales_metrics (
metric_id INT PRIMARY KEY,
january_value VARCHAR(35),
february_value VARCHAR(35),
march_value VARCHAR(35)
);
-- Insert sample data
INSERT INTO sales_metrics (metric_id, january_value, february_value, march_value) VALUES
(1, 'sales-jan-1', 'sales-feb-1', 'sales-march-1'),
(2, 'sales-jan-2', 'sales-feb-2', 'sales-march-2');
入力コード:
SELECT
m.metric_id,
monthly_data.metric_value,
monthly_data.month_number
FROM
sales_metrics m
CROSS APPLY (
SELECT m.january_value AS metric_value, '01' AS month_number
UNION ALL
SELECT m.february_value AS metric_value, '02' AS month_number
UNION ALL
SELECT m.march_value AS metric_value, '03' AS month_number
) AS monthly_data;
生成されたコード:
SELECT
m.metric_id,
monthly_data.metric_value,
monthly_data.month_number
FROM
sales_metrics m
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0082 - CROSS APPLY HAS BEEN CONVERTED TO LEFT OUTER JOIN AND REQUIRES MANUAL VALIDATION. ***/!!!
LEFT OUTER JOIN
(
SELECT
m.january_value AS metric_value, '01' AS month_number
UNION ALL
SELECT
m.february_value AS metric_value, '02' AS month_number
UNION ALL
SELECT
m.march_value AS metric_value, '03' AS month_number
) AS monthly_data;
LEFT OUTER JOIN が失敗する可能性のある主なシナリオ
フィルタリングの動作: 元の CROSS APPLY がメインテーブルの行をフィルタリングすることを意図していたがサブクエリでマッチしない場合、 LEFT OUTER JOIN はこの動作を再現しません。その代わり、結合した列に NULL 値を持つ行が含まれますが、これは意図した結果ではない可能性があります。
相関サブクエリ: CROSS APPLY は、サブクエリがアウタークエリの列を参照する、相関サブクエリをサポートするように特別に設計されています。標準的な LEFT OUTER JOIN は、このパターンを同じようにはサポートしていません。相関のある CROSS APPLY を LEFT OUTER JOIN に変換しようとすると、構文エラー、デカルト積(行の重複)、論理的に正しくない結果につながることがあります。
結果セットの違い: CROSS APPLY と LEFT OUTER JOIN のセマンティクスは、特にサブクエリが行を返さない場合に異なります。 CROSS APPLY はそのような行を結果から除外しますが、LEFT OUTER JOIN はそのような行を NULL の値を付けて含めます。
推奨: CROSS APPLY が LEFT OUTER JOIN に変換されたクエリの出力が間違いなく正しいかどうか、常に確認し、テストします。
SSC-EWI-TS0083
Error Message
ROLLBACK TRANSACTION requires the appropriate setup to work as intended.
説明
This EWI is generated when a ROLLBACK TRANSACTION statement is encountered, indicating that SnowConvert has successfully transformed the statement into a Snowflake-compatible format. However, the transformation requires manual verification because Snowflake's transaction rollback behavior differs significantly from SQL Server's ROLLBACK TRANSACTION functionality.
コード例
Output (Snowflake Scripting):
BEGIN
!!!RESOLVE EWI!!! /*** SSC-EWI-0073 - PENDING FUNCTIONAL EQUIVALENCE REVIEW FOR 'BeginTransaction' NODE ***/!!!
BEGIN TRANSACTION MyTransaction;
-- Some operations
--** SSC-FDM-0007 - MISSING DEPENDENT OBJECT "Employees" **
INSERT INTO Employees (Name, Department) VALUES ('Alice', 'Engineering');
IF (:ERROR <> 0) THEN
BEGIN
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0083 - ROLLBACK TRANSACTION REQUIRES THE APPROPRIATE SETUP TO WORK AS INTENDED. ***/!!!
ROLLBACK TRANSACTION MyTransaction; -- Named transaction rollback
END;
ELSE
BEGIN
COMMIT;
END;
END IF;
END;
SSC-EWI-TS0085
INSERT WITH EXECUTE statement requires manual review.
重大性
中
説明
This issue is generated when SnowConvert AI encounters an INSERT ... EXECUTE statement that cannot be automatically transformed. In SQL Server, INSERT ... EXEC inserts the result set of a stored procedure or dynamic SQL into a table. Snowflake does not support this syntax directly. When the statement appears at the top level (outside a stored procedure), SnowConvert AI cannot apply its standard transformation pattern and flags the statement for manual review.
コード例
入力コード:
INSERT INTO SalesReport
EXEC GenerateQuarterlySales @Quarter = 1;
生成されたコード:
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0085 - INSERT WITH EXECUTE NODE NEEDS TO BE CHECKED. ***/!!!
INSERT INTO SalesReport EXEC GenerateQuarterlySales @Quarter = 1;
ベストプラクティス
Rewrite the logic using Snowflake Scripting: call the procedure separately, capture its result with RESULT_SCAN(LAST_QUERY_ID()), and then INSERT INTO ... SELECT from the result set.
If the procedure returns a fixed schema, consider using a temporary table or TABLE() function to capture the output.
さらにサポートが必要な場合は、 snowconvert-support@snowflake.com までメールでお問い合わせください。
SSC-EWI-TS0086
OPENQUERY is not supported in Snowflake.
重大性
高
説明
This issue is generated when SnowConvert AI encounters an OPENQUERY function. In SQL Server, OPENQUERY executes a pass-through query on a linked server and returns the result as a table. Snowflake does not have an equivalent linked server or OPENQUERY mechanism. The statement is preserved as-is with an EWI marker for manual migration.
コード例
入力コード:
SELECT *
FROM OPENQUERY(OracleFinance, 'SELECT account_id, balance FROM accounts WHERE status = ''ACTIVE''');
生成されたコード:
SELECT
*
FROM
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0086 - OPENQUERY NODE NEEDS TO BE CHECKED. ***/!!! OPENQUERY (OracleFinance, 'SELECT account_id, balance FROM accounts WHERE status = ''ACTIVE''');
ベストプラクティス
Replace OPENQUERY with Snowflake external tables, external stages, or data sharing to access data from external sources.
If the linked server points to another database, consider migrating that data into Snowflake or using Snowflake's connector ecosystem (e.g., Snowflake Connector for Oracle).
For real-time access patterns, evaluate Snowflake External Network Access or External Functions.
さらにサポートが必要な場合は、 snowconvert-support@snowflake.com までメールでお問い合わせください。
SSC-EWI-TS0087
GOTO is not supported in Snowflake.
重大性
高
説明
This issue is generated when SnowConvert AI encounters a GOTO statement inside a stored procedure. SQL Server supports GOTO for unconditional jumps to labeled statements within a procedure. Snowflake Scripting does not support GOTO or labeled jump targets. The GOTO statement is preserved with an EWI marker, and the associated labels also receive a separate EWI (SSC-EWI-TS0045).
コード例
入力コード:
CREATE PROCEDURE ValidateScore
AS
BEGIN
DECLARE @Score INT
SET @Score = 49
IF @Score >= 50
GOTO Pass
IF @Score < 50
GOTO Fail
Pass:
SELECT 'Passed' AS Result;
RETURN 1;
Fail:
SELECT 'Failed' AS Result;
RETURN 0;
END
生成されたコード:
CREATE OR REPLACE PROCEDURE ValidateScore ()
RETURNS VARCHAR
LANGUAGE SQL
EXECUTE AS CALLER
AS
$$
DECLARE
SCORE INT;
BEGIN
SCORE := 49;
IF (:SCORE >= 50) THEN
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0087 - GOTO IS NOT SUPPORTED IN SNOWFLAKE. ***/!!!
GOTO Pass
END IF;
IF (:SCORE < 50) THEN
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0087 - GOTO IS NOT SUPPORTED IN SNOWFLAKE. ***/!!!
GOTO Fail
END IF;
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0045 - LABELED STATEMENT IS NOT SUPPORTED IN SNOWFLAKE SCRIPTING ***/!!!
Pass:
SELECT 'Passed' AS Result;
RETURN 1;
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0045 - LABELED STATEMENT IS NOT SUPPORTED IN SNOWFLAKE SCRIPTING ***/!!!
Fail:
SELECT 'Failed' AS Result;
RETURN 0;
END;
$$;
ベストプラクティス
Refactor GOTO-based control flow into structured constructs such as IF/ELSE, CASE, LOOP, or by splitting the procedure into smaller procedures.
For simple pass/fail patterns like the example above, replace the GOTO logic with an IF/ELSEIF/ELSE block.
さらにサポートが必要な場合は、 snowconvert-support@snowflake.com までメールでお問い合わせください。
SSC-EWI-TS0088
Unsupported sequence options were removed during conversion.
重大性
低
説明
This issue is generated when SnowConvert AI encounters a CREATE SEQUENCE statement with options that are not supported in Snowflake, such as MINVALUE, MAXVALUE, or CYCLE. These options are removed during conversion because Snowflake sequences only support START WITH and INCREMENT BY. The EWI message lists the specific options that were removed.
コード例
入力コード:
CREATE SEQUENCE InvoiceNumberSeq
START WITH 1000
INCREMENT BY 5
MINVALUE 100
MAXVALUE 50000
CYCLE;
生成されたコード:
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0088 - SEQUENCE OPTIONS 'MIN VALUE, MAX VALUE, CYCLE' WERE REMOVED, THEY ARE NOT SUPPORTED IN SNOWFLAKE ***/!!!
CREATE SEQUENCE InvoiceNumberSeq
START WITH 1000
INCREMENT BY 5
;
ベストプラクティス
If your application relies on CYCLE behavior, implement a wrapper UDF that resets the sequence value when it exceeds a threshold.
If MINVALUE or MAXVALUE bounds are critical, add application-level validation or a Snowflake task to monitor sequence values.
さらにサポートが必要な場合は、 snowconvert-support@snowflake.com までメールでお問い合わせください。
SSC-EWI-TS0089
SET statement is not supported in Snowflake.
重大性
低
説明
This issue is generated when SnowConvert AI encounters a SET statement that changes a session option not supported in Snowflake and whose non-default value cannot be replicated. For example, SET CONCAT_NULL_YIELDS_NULL OFF changes SQL Server's NULL concatenation behavior, but Snowflake always treats NULL || value as NULL (equivalent to CONCAT_NULL_YIELDS_NULL ON). Similarly, SET NUMERIC_ROUNDABORT ON raises errors on precision loss, which Snowflake does not support. The original statement is preserved with an EWI marker.
コード例
入力コード:
SET CONCAT_NULL_YIELDS_NULL OFF;
生成されたコード:
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0089 - SET CONCAT_NULL_YIELDS_NULL OFF IS NOT SUPPORTED IN SNOWFLAKE. ***/!!!
SET CONCAT_NULL_YIELDS_NULL OFF;
ベストプラクティス
Review the downstream code that depends on this SET option. For CONCAT_NULL_YIELDS_NULL OFF, replace NULL concatenation patterns with explicit NVL() or COALESCE() calls to handle NULL values.
For NUMERIC_ROUNDABORT ON, add explicit rounding or precision checks in the application logic.
さらにサポートが必要な場合は、 snowconvert-support@snowflake.com までメールでお問い合わせください。
SSC-EWI-TS0090
Agent Job step uses an unsupported subsystem and requires manual migration.
重大性
中
説明
This issue is generated when SnowConvert AI encounters a SQL Server Agent Job step that uses a subsystem other than TSQL or SSIS (e.g., CmdExec, PowerShell, ANALYSISCOMMAND). These subsystems execute operating system commands or external tools that have no direct equivalent in Snowflake. The original sp_add_jobstep call is preserved with an EWI marker, and the step is not included in the generated Snowflake Task orchestration.
コード例
入力コード:
EXEC msdb.dbo.sp_add_jobstep
@job_name = N'NightlyArchive',
@step_name = N'ArchiveOldRecords',
@step_id = 1,
@subsystem = N'CmdExec',
@command = N'powershell.exe -File "C:\Scripts\archive_records.ps1"';
生成されたコード:
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0090 - AGENT JOB STEP 'ArchiveOldRecords' USES UNSUPPORTED SUBSYSTEM 'CmdExec'. MANUAL MIGRATION REQUIRED. ***/!!!
EXEC msdb.dbo.sp_add_jobstep @job_name = N'NightlyArchive', @step_name = N'ArchiveOldRecords', @step_id = 1, @subsystem = N'CmdExec', @command = N'powershell.exe -File "C:\Scripts\archive_records.ps1"';
ベストプラクティス
For CmdExec or PowerShell steps, evaluate whether the logic can be rewritten as a Snowflake stored procedure, external function, or Snowflake task with a SQL body.
For SSIS steps, use SnowConvert AI's built-in ETL-to-dbt migration, which automatically generates orchestrator stored procedures.
Consider using Snowflake External Functions or Snowpark for operations that require external compute.
さらにサポートが必要な場合は、 snowconvert-support@snowflake.com までメールでお問い合わせください。
SSC-EWI-TS0091
Agent Job notification procedure requires manual setup of a Snowflake notification integration.
重大性
中
説明
This issue is generated when SnowConvert AI encounters a SQL Server Agent notification procedure such as sp_send_dbmail, sp_notify_operator, or similar email/alert procedures within an Agent Job context. These procedures rely on SQL Server's Database Mail or Operator subsystem, which has no direct equivalent in Snowflake. A Snowflake notification integration must be manually configured to replicate this functionality.
コード例
入力コード:
EXEC msdb.dbo.sp_send_dbmail
@profile_name = N'DBA_Alerts',
@recipients = N'admin@example.com',
@subject = N'ETL job completed';
生成されたコード:
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0091 - AGENT JOB NOTIFICATION PROCEDURE 'sp_send_dbmail' REQUIRES MANUAL SETUP OF A SNOWFLAKE NOTIFICATION INTEGRATION. ***/!!!
EXEC msdb.dbo.sp_send_dbmail @profile_name = N'DBA_Alerts', @recipients = N'admin@example.com', @subject = N'ETL job completed';
SSC-EWI-TS0092
Agent Job procedure references a dynamic job name that cannot be resolved statically.
重大性
中
説明
This issue is generated when SnowConvert AI encounters an Agent Job management procedure (sp_start_job, sp_stop_job, sp_delete_job, sp_update_job) where the @job_name parameter is a variable rather than a string literal. Because the job name cannot be resolved at conversion time, SnowConvert AI cannot determine which Snowflake Task to reference. The original statement is preserved with an EWI marker for manual resolution.
コード例
入力コード:
DECLARE @jobName NVARCHAR(128);
SET @jobName = N'ETL_Daily_Load';
EXEC msdb.dbo.sp_start_job @job_name = @jobName;
生成されたコード:
DECLARE
JOBNAME NVARCHAR(128);
BEGIN
JOBNAME := 'ETL_Daily_Load';
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0092 - AGENT JOB PROCEDURE 'sp_start_job' REFERENCES A DYNAMIC JOB NAME THAT CANNOT BE RESOLVED STATICALLY. ***/!!!
EXEC msdb.dbo.sp_start_job @job_name = @jobName;
END;
ベストプラクティス
If the job name is known at design time, replace the variable with a string literal so SnowConvert AI can resolve it to the corresponding Snowflake Task (e.g., EXECUTE TASK TASK_ETL_DAILY_LOAD).
If the job name is truly dynamic, use EXECUTE IMMEDIATE to build the EXECUTE TASK or ALTER TASK statement dynamically in Snowflake Scripting.
さらにサポートが必要な場合は、 snowconvert-support@snowflake.com までメールでお問い合わせください。
SSC-EWI-TS0093
Agent Job procedure is not supported.
重大性
低
説明
This issue is generated when SnowConvert AI encounters a SQL Server Agent Job system procedure that does not have a supported translation to Snowflake. This includes procedures like sp_update_jobstep, sp_add_jobserver, and sp_update_job (when used without the @enabled parameter). These procedures manage Agent Job metadata that has no equivalent in Snowflake's Task framework. The original statement is preserved with an EWI marker.
コード例
入力コード:
EXEC msdb.dbo.sp_update_jobstep
@job_name = N'ETL_Nightly_Load',
@step_id = 1,
@step_name = N'UpdatedStepName';
生成されたコード:
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0093 - AGENT JOB PROCEDURE 'sp_update_jobstep' IS NOT SUPPORTED. ***/!!!
EXEC msdb.dbo.sp_update_jobstep @job_name = N'ETL_Nightly_Load', @step_id = 1, @step_name = N'UpdatedStepName';
ベストプラクティス
Review whether the procedure's functionality is still needed in the Snowflake environment. Many Agent Job metadata operations (renaming steps, assigning servers) are not applicable in Snowflake's Task model.
If the procedure modifies job scheduling or enablement, use ALTER TASK in Snowflake instead.
さらにサポートが必要な場合は、 snowconvert-support@snowflake.com までメールでお問い合わせください。
SSC-EWI-TS0094
Error Message
WAITFOR DELAY variable may contain a time string incompatible with SYSTEM$WAIT.
説明
This EWI is generated when a WAITFOR DELAY statement uses a variable or parameter expression instead of a literal time value. The statement is transformed to CALL SYSTEM$WAIT(), which expects a numeric value representing seconds (or milliseconds). However, the variable may hold a time string in 'HH:MM:SS' format, which is incompatible with SYSTEM$WAIT.
For more information about SYSTEM$WAIT, see the Snowflake documentation.
コード例
入力コード:
CREATE PROCEDURE proc1(@WaitTime INT)
AS
BEGIN
WAITFOR DELAY @WaitTime;
END
生成されたコード:
CREATE OR REPLACE PROCEDURE proc1 (WAITTIME INT)
RETURNS VARCHAR
LANGUAGE SQL
EXECUTE AS CALLER
AS
$$
BEGIN
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0094 - WAITFOR DELAY WITH VARIABLE ':WAITTIME' WAS CONVERTED TO SYSTEM$WAIT, BUT THE VARIABLE MAY CONTAIN A TIME STRING IN 'HH:MM:SS' FORMAT. SYSTEM$WAIT EXPECTS A NUMERIC VALUE IN SECONDS. ***/!!!
CALL SYSTEM$WAIT(:WAITTIME);
END;
$$;
ベストプラクティス
Ensure the variable passed to SYSTEM$WAIT contains a numeric value in seconds, not a time string in 'HH:MM:SS' format.
If the variable holds a time string, convert it to seconds before passing it to SYSTEM$WAIT.
さらにサポートが必要な場合は、 snowconvert-support@snowflake.com までメールでお問い合わせください。
SSC-EWI-TS0095
SCOPE_IDENTITY() called without a preceding INSERT to an identity table in the same scope.
重大性
High
注釈
わかりやすくするため、出力コードの一部を省略しています。
説明
SnowConvert AI was unable to determine the target table for SCOPE_IDENTITY(). No preceding INSERT to an identity table found in the same scope.
This EWI is generated when SCOPE_IDENTITY() is called without a preceding INSERT statement to a table with an IDENTITY column in the same procedural scope. In SQL Server, SCOPE_IDENTITY() returns the last identity value inserted in the current scope, but without a detectable INSERT, SnowConvert AI cannot generate the appropriate time-travel query.
The function call is kept as-is with this EWI, requiring manual review to determine the correct implementation.
コード例
Generated Code (Snowflake):
CREATE OR REPLACE PROCEDURE GetLastId ()
RETURNS TABLE()
LANGUAGE SQL
EXECUTE AS CALLER
AS
$$
DECLARE
LASTID INT := SCOPE_IDENTITY() !!!RESOLVE EWI!!! /*** SSC-EWI-TS0095 - SNOWCONVERT AI WAS UNABLE TO DETERMINE THE TARGET TABLE FOR SCOPE_IDENTITY(). NO PRECEDING INSERT TO AN IDENTITY TABLE FOUND IN THE SAME SCOPE. ***/!!!;
ProcedureResultSet RESULTSET;
BEGIN
ProcedureResultSet := (SELECT
:LASTID);
RETURN TABLE(ProcedureResultSet);
END;
$$;
ベストプラクティス
Review the stored procedure logic to identify where the INSERT statement occurs
If the INSERT is in a different scope (e.g., nested block), refactor the code to make the INSERT detectable
さらにサポートが必要な場合は、 snowconvert-support@snowflake.com までメールでお問い合わせください。
SSC-EWI-TS0096
SCOPE_IDENTITY() references a table that cannot be resolved in the symbol table.
重大性
High
注釈
わかりやすくするため、出力コードの一部を省略しています。
説明
SnowConvert AI was unable to resolve the target table for SCOPE_IDENTITY(). Missing table definition.
This EWI is generated when SCOPE_IDENTITY() follows an INSERT statement, but the target table cannot be resolved in the symbol table. This may occur when:
The table is defined in an external file not included in the conversion
The table name uses dynamic SQL or is otherwise unresolvable
The table definition is missing or incomplete
Without a resolvable table reference, SnowConvert AI cannot determine which identity column to query in the generated time-travel query.
コード例
Input Code (SQL Server):
CREATE PROCEDURE InsertOrder @CustomerID INT
AS
BEGIN
DECLARE @OrderID INT;
INSERT INTO UnknownTable (CustomerID) VALUES (@CustomerID);
SET @OrderID = SCOPE_IDENTITY();
SELECT @OrderID;
END;
Generated Code (Snowflake):
CREATE OR REPLACE PROCEDURE InsertOrder (CUSTOMERID INT)
RETURNS TABLE()
LANGUAGE SQL
EXECUTE AS CALLER
AS
$$
DECLARE
ORDERID INT;
ProcedureResultSet RESULTSET;
BEGIN
INSERT INTO UnknownTable (CustomerID) VALUES (:CUSTOMERID);
ORDERID := SCOPE_IDENTITY() !!!RESOLVE EWI!!! /*** SSC-EWI-TS0096 - SNOWCONVERT AI WAS UNABLE TO RESOLVE THE TARGET TABLE FOR SCOPE_IDENTITY(). MISSING TABLE DEFINITION. ***/!!!;
ProcedureResultSet := (SELECT
:ORDERID);
RETURN TABLE(ProcedureResultSet);
END;
$$;
ベストプラクティス
Ensure all table definitions are included in the conversion input
Verify that the table name in the INSERT statement matches the table definition
If the table is external, provide the schema definition or manually implement the identity retrieval logic
さらにサポートが必要な場合は、 snowconvert-support@snowflake.com までメールでお問い合わせください。
SSC-EWI-TS0097
SCOPE_IDENTITY() references a table without an identifiable identity column.
重大性
High
注釈
わかりやすくするため、出力コードの一部を省略しています。
説明
SnowConvert AI was unable to identify the identity column for SCOPE_IDENTITY(). Missing column definition.
This EWI is generated when SCOPE_IDENTITY() follows an INSERT statement to a table that exists in the symbol table but does not have an IDENTITY column defined. In SQL Server, SCOPE_IDENTITY() only returns values for tables with identity columns. Without an identifiable identity column, SnowConvert AI cannot generate the appropriate MAX(identity_column) query for the time-travel transformation.
コード例
Input Code (SQL Server):
CREATE TABLE Orders (OrderID INT, CustomerID INT);
GO
CREATE PROCEDURE InsertOrder @CustomerID INT
AS
BEGIN
DECLARE @OrderID INT;
INSERT INTO Orders (CustomerID) VALUES (@CustomerID);
SET @OrderID = SCOPE_IDENTITY();
SELECT @OrderID;
END;
Generated Code (Snowflake):
CREATE OR REPLACE TABLE Orders (
OrderID INT,
CustomerID INT
)
;
CREATE OR REPLACE PROCEDURE InsertOrder (CUSTOMERID INT)
RETURNS TABLE()
LANGUAGE SQL
EXECUTE AS CALLER
AS
$$
DECLARE
ORDERID INT;
ProcedureResultSet RESULTSET;
BEGIN
INSERT INTO Orders (CustomerID) VALUES (:CUSTOMERID);
ORDERID := SCOPE_IDENTITY() !!!RESOLVE EWI!!! /*** SSC-EWI-TS0097 - SNOWCONVERT AI WAS UNABLE TO IDENTIFY THE IDENTITY COLUMN FOR SCOPE_IDENTITY(). MISSING COLUMN DEFINITION. ***/!!!;
ProcedureResultSet := (SELECT
:ORDERID);
RETURN TABLE(ProcedureResultSet);
END;
$$;
ベストプラクティス
Verify that the table definition includes an IDENTITY column specification
If the table should have an identity column, add the IDENTITY constraint to the CREATE TABLE statement before conversion
If the table should not use SCOPE_IDENTITY(), refactor the code to use a different method for retrieving the inserted ID
さらにサポートが必要な場合は、 snowconvert-support@snowflake.com までメールでお問い合わせください。
SSC-EWI-TS0098
CONVERT with a non-literal style cannot be mapped to a Snowflake format string.
説明
This EWI is generated when the third argument of CONVERT is a variable or expression instead of a literal style code. SnowConvert AI can map literal style values to Snowflake format strings for TO_DATE and TO_TIMESTAMP, but when the style is dynamic it cannot determine the correct format at conversion time. In those cases SnowConvert AI falls back to CAST.
コード例
Input Code (SQL Server):
SELECT CONVERT(DATE, @InputDate, @Style);
Generated Code (Snowflake SQL):
SELECT
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0098 - CONVERT WITH A VARIABLE OR EXPRESSION AS THE STYLE ARGUMENT CANNOT BE AUTOMATICALLY MAPPED TO A SNOWFLAKE FORMAT STRING. REPLACE WITH THE APPROPRIATE TO_DATE/TO_TIMESTAMP CALL WITH THE KNOWN FORMAT STRING. ***/!!!
CAST(@InputDate AS DATE);
ベストプラクティス
Replace the dynamic style argument with a known literal format whenever possible.
If the style varies at runtime, rewrite the expression manually using the correct TO_DATE, TO_TIMESTAMP, or conditional logic in Snowflake.
さらにサポートが必要な場合は、 snowconvert-support@snowflake.com までメールでお問い合わせください。