SnowConvert AI - SQL Server-Azure Synapseの機能の違い

Applies to
  • SQL Server

  • Azure Synapse Analytics

SSC-FDM-TS0001

注釈

この FDM は非推奨です。 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
);
Copy
生成されたコード:
 SELECT 'a'
--           --** SSC-FDM-TS0001 - COLLATION Albanian_BIN NOT SUPPORTED **
--           COLLATE Albanian_BIN
                               ;

SELECT 'a'
--           --** SSC-FDM-TS0001 - COLLATION Albanian_CI_AI NOT SUPPORTED **
--           COLLATE Albanian_CI_AI
                                 ;

CREATE OR REPLACE TABLE ExampleTable (
    ID INT,
    Name VARCHAR(50)
--                     --** SSC-FDM-TS0001 - COLLATION collateName NOT SUPPORTED **
--                     COLLATE collateName
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"transact"}}'
;
Copy

ベストプラクティス

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

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

SSC-FDM-TS0002

説明

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

コード例

入力コード:
 SELECT 'a' COLLATE Latin1_General_CI_AS_WS;
Copy
生成されたコード:
 SELECT 'a' COLLATE 'EN-CI-AS' /*** SSC-FDM-TS0002 - COLLATION FOR VALUE WS NOT SUPPORTED ***/;
Copy

ベストプラクティス

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

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

SSC-FDM-TS0003

XP_LOGININFO がカスタム UDF にマッピングされています

説明

このメッセージは、XP_LOGININFO プロシージャが実行され、次の列セットが返される場合に表示されます(詳細については SQL SERVER のドキュメントを参照

account nametypeprivilegemapped login namepermission path

この動作を複製するために、Snowflakeには APPLICABLE_ROLES ビューから列を選択するクエリがあります。これは以下の列セットを返します(詳細については SnowFlake のドキュメントを参照)。

GRANTEE

ROLE_NAME

ROLE_OWNER

IS_GRANTABLE

SQL Serverの元の列は、次の表に示すようにマッピングされます。両者は完全には等価でない場合があります。

SQL ServerSnowFlake
account nameGRANTEE
typeROLE_OWNER
privilegeROLE_NAME
mapped login nameGRANTEE
permission pathNULL

コード例

入力コード:
 EXEC xp_logininfo

EXEC xp_logininfo 'USERNAME'
Copy
生成されたコード:
 --** SSC-FDM-TS0003 - XP_LOGININFO MAPPED TO CUSTOM UDF XP_LOGININFO_UDF AND MIGHT HAVE DIFFERENT BEHAVIOR **
SELECT
*
FROM
TABLE(XP_LOGININFO_UDF());

--** SSC-FDM-TS0003 - XP_LOGININFO MAPPED TO CUSTOM UDF XP_LOGININFO_UDF AND MIGHT HAVE DIFFERENT BEHAVIOR **
SELECT
*
FROM
TABLE(XP_LOGININFO_UDF('USERNAME'));
Copy

ベストプラクティス

SSC-FDM-TS0004

説明

このメッセージは、 BULK INSERT が変換され、 PUT コマンドが出力コードに追加された場合に表示されます。これは、SnowSQL WebUI を使って PUT コマンドを実行できないために起こります。このコマンドを正常に実行するためには、ユーザーが事前に SnowCLI をインストールしておく必要があります。

コード例

入力コード:
 BULK INSERT #temptable FROM 'path/to/file.txt'  
WITH
(
   FIELDTERMINATOR ='\t',  
   ROWTERMINATOR ='\n'
);
Copy
生成されたコード:
 CREATE OR REPLACE FILE FORMAT FILE_FORMAT_638466175888203490
FIELD_DELIMITER = '\t'
RECORD_DELIMITER = '\n';

CREATE OR REPLACE STAGE STAGE_638466175888203490
FILE_FORMAT = FILE_FORMAT_638466175888203490;

--** SSC-FDM-TS0004 - PUT STATEMENT IS NOT SUPPORTED ON WEB UI. YOU SHOULD EXECUTE THE CODE THROUGH THE SNOWFLAKE CLI **
PUT file://path/to/file.txt @STAGE_638466175888203490 AUTO_COMPRESS = FALSE;

--** SSC-FDM-0007 - MISSING DEPENDENT OBJECT "#temptable" **
COPY INTO T_temptable FROM @STAGE_638466175888203490/file.txt;
Copy

ベストプラクティス

  • SnowCLI をインストールします。

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

SSC-FDM-TS0005

TRY_CONVERT/TRY_CAST が TRY_CAST に変換されませんでした

説明

この FMD は、TRY_CONVERT または TRY_CAST がSnowflakeで TRY_CAST に変換できなかった場合に追加されます。

Snowflakeの TRY_CAST 関数には、文字式しか変換できないという制限があります。一方、Transactの TRY_CONVERT および TRY_CAST 関数はあらゆるデータ型の式が可能です。

現在、TRY_CONVERT または TRY_CAST からSnowflakeの TRY_CAST への変換は、文字列式またはツールがそのコンテキストで文字列として識別できる式に対してのみ実行されます。

コード例

入力コード:
 SELECT TRY_CAST(14.85 AS INT);
SELECT TRY_CONVERT(VARCHAR, 1234);
SELECT TRY_CONVERT(CHAR, 1);
SELECT TRY_CONVERT(SQL_VARIANT, '2017-01-01 12:00:00');
SELECT TRY_CONVERT(GEOGRAPHY, 'LINESTRING(-122.360 47.656, -122.343 47.656 )');
Copy
生成されたコード:
 SELECT
CAST(14.85 AS INT) /*** SSC-FDM-TS0005 - TRY_CONVERT/TRY_CAST COULD NOT BE CONVERTED TO TRY_CAST ***/;
SELECT
TO_VARCHAR(1234);
SELECT
TO_CHAR(1);
SELECT
TO_VARIANT('2017-01-01 12:00:00');
SELECT
TO_GEOGRAPHY('LINESTRING(-122.360 47.656, -122.343 47.656 )');
Copy

ベストプラクティス

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

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

SSC-FDM-TS0006

EXECUTE AS 'user_name' 句はSnowflakeには存在せず、プロシージャを呼び出すユーザーは必要なすべての権限を持っている必要があります。

説明

このメッセージは、SnowConvert AI が EXECUTE AS 'user_name' 句を含むプロシージャを見つけたときに表示されます。これはSnowflakeではサポートされていないため、 EXECUTE AS CALLER に変更されます。

この句は、プロシージャを実行するセキュリティコンテキストを指定します

注釈

詳細については、この句の機能に関する ドキュメント をご参照ください。

コード例

入力コード:
 CREATE PROCEDURE SelectAllCustomers
WITH EXECUTE AS 'user_name'
AS
BEGIN
      SELECT * FROM Customers;
END;
Copy
生成されたコード:
 --** SSC-FDM-0007 - MISSING DEPENDENT OBJECT "Customers" **
CREATE OR REPLACE PROCEDURE SelectAllCustomers ()
RETURNS TABLE()
LANGUAGE SQL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"transact"}}'
EXECUTE AS CALLER
--** SSC-FDM-TS0006 - EXECUTE AS 'user_name' CLAUSE DOES NOT EXIST IN SNOWFLAKE AND THE USER CALLING THE PROCEDURE SHOULD HAVE ALL THE REQUIRED PRIVILEGES **
AS
$$
      DECLARE
            ProcedureResultSet RESULTSET;
      BEGIN
            ProcedureResultSet := (
            SELECT
                  *
            FROM
                  Customers);
            RETURN TABLE(ProcedureResultSet);
      END;
$$;
Copy

ベストプラクティス

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

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

SSC-FDM-TS0007

FOR REPLICATION 句はSnowflakeには存在しません。

説明

このメッセージは、SnowConvert AI が FOR REPLICATION 句を含むプロシージャを見つけたときに表示されます。これはSnowflakeではサポートされていないため、削除されます。

この句は、そのプロシージャが複製用に作成されていることを明示します。その結果、サブスクライバー上で実行することはできません。

注釈

詳細については、この句の機能に関する ドキュメント をご参照ください。

コード例

入力コード:
 CREATE PROCEDURE SelectAllCustomers
WITH FOR REPLICATION
AS
BEGIN
      SELECT * FROM Customers;
END;
Copy
生成されたコード:
 --** SSC-FDM-0007 - MISSING DEPENDENT OBJECT "Customers" **
CREATE OR REPLACE PROCEDURE SelectAllCustomers ()
RETURNS TABLE()
LANGUAGE SQL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"transact"}}'
EXECUTE AS CALLER
--** SSC-FDM-TS0007 - FOR REPLICATION CLAUSE DOES NOT EXIST IN SNOWFLAKE **
AS
$$
      DECLARE
            ProcedureResultSet RESULTSET;
      BEGIN
            ProcedureResultSet := (
            SELECT
                  *
            FROM
                  Customers);
            RETURN TABLE(ProcedureResultSet);
      END;
$$;
Copy

ベストプラクティス

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

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

SSC-FDM-TS0008

FORMATMESSAGE 関数が UDF に変換されました

説明

この警告は、FORMATMESSAGE 関数が使用されており、それが FORMATMESSAGE_UDF に置き換えられたために追加されています。警告を追加する理由は、FORMATMESSAGE を置き換えるために使用される FORMATMESSAGE_UDF が、すべての種類の形式は適切に処理できず、特定の条件下でエラーを投げる可能性があるためです。

負として与えられた符号なし数値は、値を変換する代わりに符号を保持します。また、%I64d プレースホルダーは、UDF ではサポートされていないため、使用するとエラーとなります。

FORMATMESSAGE_UDF では、引数の数がプレースホルダの数と異なるとエラーになります。

この UDF は、メッセージ番号 IDs の使用をサポートしていません。

コード例

入力コード:
 SELECT FORMATMESSAGE('Unsigned int %u, %u', 50, -50); -- Unsigned int 50, 4294967246
SELECT FORMATMESSAGE('Unsigned octal %o, %o', 50, -50); -- Unsigned octal 62, 37777777716
SELECT FORMATMESSAGE('Unsigned hexadecimal %X, %x', -11, -50); -- Unsigned hexadecimal FFFFFFF5, ffffffce
SELECT FORMATMESSAGE('Unsigned octal with prefix: %#o', -50); -- Unsigned octal with prefix: 037777777716
SELECT FORMATMESSAGE('Unsigned hexadecimal with prefix: %#X, %x', -11,-50); -- Unsigned hexadecimal with prefix: 0XFFFFFFF5, ffffffce
SELECT FORMATMESSAGE('Bigint %I64d', 3000000000); -- Bigint 3000000000
SELECT FORMATMESSAGE('My message: %s %s %s', 'Hello', 'World'); -- My message: Hello World (null) 
Copy
生成されたコード:
 SELECT
--** SSC-FDM-TS0008 - FORMATMESSAGE WAS CONVERTED TO CUSTOM UDF FORMATMESSAGE_UDF AND IT MIGHT HAVE A DIFFERENT BEHAVIOR. **
FORMATMESSAGE_UDF('Unsigned int %u, %u', ARRAY_CONSTRUCT(50, -50)); -- Unsigned int 50, 4294967246
SELECT
--** SSC-FDM-TS0008 - FORMATMESSAGE WAS CONVERTED TO CUSTOM UDF FORMATMESSAGE_UDF AND IT MIGHT HAVE A DIFFERENT BEHAVIOR. **
FORMATMESSAGE_UDF('Unsigned octal %o, %o', ARRAY_CONSTRUCT(50, -50)); -- Unsigned octal 62, 37777777716
SELECT
--** SSC-FDM-TS0008 - FORMATMESSAGE WAS CONVERTED TO CUSTOM UDF FORMATMESSAGE_UDF AND IT MIGHT HAVE A DIFFERENT BEHAVIOR. **
FORMATMESSAGE_UDF('Unsigned hexadecimal %X, %x', ARRAY_CONSTRUCT(-11, -50)); -- Unsigned hexadecimal FFFFFFF5, ffffffce
SELECT
--** SSC-FDM-TS0008 - FORMATMESSAGE WAS CONVERTED TO CUSTOM UDF FORMATMESSAGE_UDF AND IT MIGHT HAVE A DIFFERENT BEHAVIOR. **
FORMATMESSAGE_UDF('Unsigned octal with prefix: %#o', ARRAY_CONSTRUCT(-50)); -- Unsigned octal with prefix: 037777777716
SELECT
--** SSC-FDM-TS0008 - FORMATMESSAGE WAS CONVERTED TO CUSTOM UDF FORMATMESSAGE_UDF AND IT MIGHT HAVE A DIFFERENT BEHAVIOR. **
FORMATMESSAGE_UDF('Unsigned hexadecimal with prefix: %#X, %x', ARRAY_CONSTRUCT(-11, -50)); -- Unsigned hexadecimal with prefix: 0XFFFFFFF5, ffffffce
SELECT
--** SSC-FDM-TS0008 - FORMATMESSAGE WAS CONVERTED TO CUSTOM UDF FORMATMESSAGE_UDF AND IT MIGHT HAVE A DIFFERENT BEHAVIOR. **
FORMATMESSAGE_UDF('Bigint %I64d', ARRAY_CONSTRUCT(3000000000)); -- Bigint 3000000000
SELECT
--** SSC-FDM-TS0008 - FORMATMESSAGE WAS CONVERTED TO CUSTOM UDF FORMATMESSAGE_UDF AND IT MIGHT HAVE A DIFFERENT BEHAVIOR. **
FORMATMESSAGE_UDF('My message: %s %s %s', ARRAY_CONSTRUCT('Hello', 'World')); -- My message: Hello World (null) 
Copy

ベストプラクティス

  • メッセージの中で %I64d プレースホルダーは使わないでください。

  • 最初の引数にメッセージ ID を使う代わりに、メッセージを直接文字列として使います。

  • プレースホルダーの数が、メッセージの後の引数の数と確実に同じであるようにしてください。

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

SSC-FDM-TS0009

暗号化はSnowflakeではサポートされていません。

説明

この警告は、列定義で ENCRYPTED WITH が使用されている場合に追加されます。これはSnowflakeではサポートされていないため、削除され、警告が追加されています。

コード例

入力コード:
 CREATE TABLE [SCHEMA1].[TABLE1] (
    [COL1] NVARCHAR(60)
        ENCRYPTED WITH (
            COLUMN_ENCRYPTION_KEY = MyCEK,
            ENCRYPTION_TYPE = RANDOMIZED,
            ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256'
        )
);
Copy
生成されたコード:
 CREATE OR REPLACE TABLE SCHEMA1.TABLE1 (
    COL1 VARCHAR(60)
--    --** SSC-FDM-TS0009 - ENCRYPTED WITH NOT SUPPORTED IN SNOWFLAKE **
--           ENCRYPTED WITH (
--               COLUMN_ENCRYPTION_KEY = MyCEK,
--               ENCRYPTION_TYPE = RANDOMIZED,
--               ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256'
--           )
   )
   COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"transact"}}'
   ;
Copy

ベストプラクティス

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

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

SSC-FDM-TS0010

CURRENT_DATABASE 関数は特定のケースで異なる動作をします。

説明

この EWI は、関数 DB_NAME を CURRENT_DATABASE に変換するときに追加されます。これは、Snowflakeがdatabase_idパラメーターをサポートしておらず、CURRENT_DATABASE 関数が常に現在のデータベース名を返すためです。

コード例

入力コード:
 SELECT DB_NAME(someId);
Copy
生成されたコード:
 SELECT
CURRENT_DATABASE() /*** SSC-FDM-TS0010 - CURRENT_DATABASE function has different behavior in certain cases ***/;
Copy

ベストプラクティス

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

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

SSC-FDM-TS0011

Snowflakeではデフォルト値は使用できません。

注釈

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

説明

このエラーは、関数呼び出し、変数名、名前付き定数などの式がデフォルトオプションに従う場合にコードに追加されます。

Snowflakeでは、数値や文字列のような明示的な定数のみをサポートしています。

コード例

入力コード:
 ALTER TABLE
    T_ALTERTABLETEST
ADD
    COLUMN COL10 INTEGER DEFAULT RANDOM(10);
Copy
生成されたコード:
 --** SSC-FDM-0007 - MISSING DEPENDENT OBJECTS "T_ALTERTABLETEST", "RANDOM" **
ALTER TABLE IF EXISTS T_ALTERTABLETEST
ADD
    COLUMN COL10 INTEGER
--                         --** SSC-FDM-TS0011 - DEFAULT OPTION NOT ALLOWED IN SNOWFLAKE **
--                         DEFAULT RANDOM(10)
                                           ;
Copy

ベストプラクティス

SSC-FDM-TS0012

列の情報が見つかりませんでした。CAST 操作に合わせて STRING が使用されました

説明

この EWI は、テーブル値ユーザー定義関数で、変換中に列の戻り値の型が特定できない場合に追加されます。 SELECT ステートメントの CAST 操作に合わせて、デフォルトで STRING が使用されます。<!--TODO: search for a broken reference.->

コード例

入力コード:
 CREATE FUNCTION GetDepartmentInfo()
RETURNS TABLE
AS
RETURN
(
  SELECT DepartmentID, Name, GroupName
  FROM HumanResources.Department
);
Copy
生成されたコード:
 CREATE OR REPLACE FUNCTION GetDepartmentInfo ()
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":1, "minor":0},{"attributes":{"component":"transact"}}'
AS
$$
    SELECT
    CAST(DepartmentID AS STRING),
    CAST(Name AS STRING),
    CAST(GroupName AS STRING)
    FROM
    HumanResources.Department
$$;
Copy

ベストプラクティス

  • ユーザーは、見つからなかった正しいデータ型がどれかをチェックし、 RETURNS TABLE ステートメント定義で変更する必要があります。

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

SSC-FDM-TS0013

Snowflakeスクリプトのカーソル行は変更できません。

説明

この EWI は、カーソルが入力コードでの変更を受け入れているときに追加されます。Snowflakeスクリプトでは、カーソル行を変更することはできません。

コード例:

入力コード:
 CREATE OR ALTER PROCEDURE modifiablecursorTest
AS
BEGIN
    -- Should be marked with SSC-FDM-TS0013
    DECLARE CursorVar CURSOR
	FOR  
	SELECT FirstName
	FROM vEmployee;
    DECLARE CursorVar2 INSENSITIVE CURSOR
	FOR  
	SELECT FirstName
	FROM vEmployee;
    DECLARE CursorVar3 CURSOR KEYSET SCROLL_LOCKS
	FOR  
	SELECT FirstName
	FROM vEmployee;
    DECLARE CursorVar4 CURSOR DYNAMIC OPTIMISTIC
	FOR  
	SELECT FirstName
	FROM vEmployee;
    DECLARE CursorVar6 CURSOR STATIC
	FOR  
	SELECT FirstName
	FROM vEmployee;
    DECLARE CursorVar7 CURSOR READ_ONLY
	FOR  
	SELECT FirstName
	FROM vEmployee;
    -- Shouid not be marked
    DECLARE CursorVar5 CURSOR STATIC READ_ONLY
	FOR  
	SELECT FirstName
	FROM vEmployee;
    RETURN 'DONE';
END;
Copy
生成されたコード:
 CREATE OR REPLACE PROCEDURE modifiablecursorTest ()
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-FDM-TS0013
		--** SSC-FDM-TS0013 - SNOWFLAKE SCRIPTING CURSOR ROWS ARE NOT MODIFIABLE **
		CursorVar CURSOR
		FOR
			SELECT
				FirstName
			FROM
				vEmployee;
		--** SSC-FDM-TS0013 - SNOWFLAKE SCRIPTING CURSOR ROWS ARE NOT MODIFIABLE **
		CursorVar2 CURSOR
		FOR
			SELECT
				FirstName
			FROM
				vEmployee;
		--** SSC-FDM-TS0013 - SNOWFLAKE SCRIPTING CURSOR ROWS ARE NOT MODIFIABLE **
		CursorVar3 CURSOR
		FOR
			SELECT
				FirstName
			FROM
				vEmployee;
		--** SSC-FDM-TS0013 - SNOWFLAKE SCRIPTING CURSOR ROWS ARE NOT MODIFIABLE **
		CursorVar4 CURSOR
		FOR
			SELECT
				FirstName
			FROM
				vEmployee;
		--** SSC-FDM-TS0013 - SNOWFLAKE SCRIPTING CURSOR ROWS ARE NOT MODIFIABLE **
		CursorVar6 CURSOR
		FOR
			SELECT
				FirstName
			FROM
				vEmployee;
		--** SSC-FDM-TS0013 - SNOWFLAKE SCRIPTING CURSOR ROWS ARE NOT MODIFIABLE **
		CursorVar7 CURSOR
		FOR
			SELECT
				FirstName
			FROM
				vEmployee;
		-- Shouid not be marked
		CursorVar5 CURSOR
		FOR
			SELECT
				FirstName
			FROM
				vEmployee;
	BEGIN
		RETURN 'DONE';
	END;
$$;
Copy

ベストプラクティス

SSC-FDM-TS0014

計算された列の変換

説明

この警告は、SQL Serverの計算された列がSnowflakeの同等の列に変換されるときに追加されます。これが追加されるのは、場合により、機能的同等性に影響が出る可能性があるためです。

コード例

入力コード:
 CREATE TABLE [TestTable](
    [Col1] AS (CONVERT ([REAL], ExpressionValue))
);
Copy
生成されたコード:
 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"}}'
;
Copy

ベストプラクティス

  • ユーザーによる追加のアクションは必要なく、ただ情報を提供するだけです。

  • 変換されていない式に手動で変更を加えます。

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

SSC-FDM-TS0016

XML Snowflakeの列は形式が異なる可能性があります。

説明

この警告は、SQL Server FOR XML 句がSnowflakeの同等のものに変換されるときに追加されます。これは、XML の列が異なる可能性があるために追加されています。

コード例

employee という次のテーブルを例として考えます。

Id

名前

Hint

1

Kinslee Park

開発者

2

Ezra Mata

開発者

3

Aliana Quinn

Manager

入力コード:
コード
 SELECT
  	e.id,
  	e.name as full_name,
  	e.hint
  FROM
  	employee e
  FOR XML PATH;
Copy
出力
 <row>
    <id>1</id>
    <full_name>Kinslee Park</full_name>
    <hint>Developer</hint>
</row>
<row>
    <id>2</id>
    <full_name>Ezra Mata</full_name>
    <hint>Developer</hint>
</row>
<row>
    <id>3</id>
    <full_name>Aliana Quinn</full_name>
    <hint>Manager</hint>
</row>
Copy
生成されたコード:
コード
 SELECT
	--** SSC-FDM-TS0016 - XML COLUMNS IN SNOWFLAKE MIGHT HAVE A DIFFERENT FORMAT **
	FOR_XML_UDF(OBJECT_CONSTRUCT('id', e.id, 'full_name', e.name, 'hint', e.hint), 'row')
FROM
	employee e;
Copy
出力
 <row type="OBJECT">
    <full_name type="VARCHAR">Kinslee Park</full_name>
    <hint type="VARCHAR">Developer</hint>
    <id type="INTEGER">1</id>
</row>
<row type="OBJECT">
    <full_name type="VARCHAR">Ezra Mata</full_name>
    <hint type="VARCHAR">Developer</hint>
    <id type="INTEGER">2</id>
</row>
<row type="OBJECT">
    <full_name type="VARCHAR">Aliana Quinn</full_name>
    <hint type="VARCHAR">Manager</hint>
    <id type="INTEGER">3</id>
</row>
Copy

ベストプラクティス

  • ユーザーによる追加のアクションは必要なく、ただ情報を提供するだけです。

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

SSC-FDM-TS0017

CURRENT_USER 関数は、パラメーターとしてユーザー ID をサポートしていません。

説明

この EWI は、 SUSER_NAME または SUSER_SNAME などの関数にパラメーターとしてユーザー識別子が含まれる場合に追加されます。Snowflakeでは CURRENT_USER 関数でこの最後の1つがサポートされていないためです。

入力コード:

 SELECT SUSER_NAME(0x010500000000000515000000a065cf7e784b9b5fe77c87705a2e0000);
Copy
生成されたコード:
 SELECT
CURRENT_USER() /*** SSC-FDM-TS0017 - User ID parameter used in SUSER_NAME function is not supported in CURRENT_USER function and it was removed. ***/;
Copy

ベストプラクティス

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

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

SSC-FDM-TS0018

データベースコンソールコマンドはサポートされていません

注釈

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

説明

この FMD は、SnowConvert AI が入力コード内にDBCC ステートメントを見つけた場合に追加されます。\ ほとんどの DBCC ステートメントは、Snowflakeではサポートされていません。

コード例

入力コード:
 DBCC CHECKIDENT(@a, RESEED, @b) WITH NO_INFOMSGS
Copy
生成されたコード:
 ----** SSC-FDM-TS0018 - DATABASE CONSOLE COMMAND 'CHECKIDENT' IS NOT SUPPORTED. **
--DBCC CHECKIDENT(@a, RESEED, @b) WITH NO_INFOMSGS
Copy

ベストプラクティス

  • ユーザーによる追加のアクションは必要なく、ただ情報を提供するだけです。

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

SSC-FDM-TS0019

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
Copy
生成されたコード:
 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
		--** SSC-FDM-TS0019 - 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;
$$;
Copy

ベストプラクティス

SSC-FDM-TS0020

デフォルトの制約がコメントアウトされ、テーブル定義に追加された可能性があります。

説明

この FDM は、Alter Tableステートメントにデフォルトの制約が存在する場合に追加されます。

現在、その制約のサポートは利用できません。この問題の回避策は、Alter Tableを使用する前にテーブルを定義することです。これにより、SnowConvert AI が参照を識別できるようになり、デフォルトの制約がテーブル定義に統合されます。そうしない場合、制約がコメントアウトされるだけです。

コード例

入力コード:
 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 (getdate()) FOR col1;
Copy
生成されたコード:
 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;

----** SSC-FDM-TS0020 - DEFAULT CONSTRAINT MAY HAVE BEEN ADDED TO TABLE DEFINITION **

--ALTER TABLE table1
--ADD
--CONSTRAINT col1_constraint DEFAULT 50 FOR col1
                                              ;

----** SSC-FDM-TS0020 - DEFAULT CONSTRAINT MAY HAVE BEEN ADDED TO TABLE DEFINITION **

--ALTER TABLE table1
--ADD
--CONSTRAINT col1_constraint DEFAULT (CURRENT_TIMESTAMP() :: TIMESTAMP) FOR col1
                                                                              ;
Copy

既知の問題

  • 同じ列に対して異なるデフォルトの制約が宣言されている場合、最初の制約のみがCreate Tableステートメントに反映されます。

  • デフォルトの制約が欠落列に宣言されている場合、依存関係がないため変換を実行できません。

ベストプラクティス

SSC-FDM-TS0021

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()');
Copy
生成されたコード:
 --** SSC-FDM-TS0022 - 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/*** SSC-FDM-TS0021 - A MASKING POLICY WAS CREATED AS SUBSTITUTE FOR MASKED WITH ***/  SET MASKING POLICY "default";
Copy

注釈

MASKING POLICY は、ALTER TABLE ステートメントの前に作成されます。そして、ほぼ同じ動作をすることが期待されます。ロールとユーザー権限に関して、いくつかの微調整が必要となる可能性があります。

ベストプラクティス

SSC-FDM-TS0022

ユーザーは事前にマスキングロールを定義しておく必要があります。

注釈

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

説明

この EWI は、MASKING POLICY が作成され、データマスキングが適切に機能するように、ロールまたは権限をそこにリンクする必要がある場合に発生します。

コード例

入力コード
 ALTER TABLE tableName
ALTER COLUMN columnName
ADD MASKED WITH (FUNCTION = 'partial(1, "xxxxx", 1)');
Copy
生成されたコード:
 --** SSC-FDM-TS0022 - 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/*** SSC-FDM-TS0021 - A MASKING POLICY WAS CREATED AS SUBSTITUTE FOR MASKED WITH ***/  SET MASKING POLICY "partial_1_xxxxx_1";
Copy

注釈

6行目に示すように、定義されたロールを配置できるプレースホルダがあります。コンマで区切られた1つまたは複数の値を入れるスペースがあります。また、ここでは、それぞれの値に対して一重引用符を使用することが義務付けられています。

ベストプラクティス

SSC-FDM-TS0023

Snowflakeではエラー関数が異なる可能性があります

説明

この EWI は、対応する動作の変化のために、以下の ERRORs 関数の変換に追加されます。

  • ERROR_MESSAGE Snowflakeでは SQLERRM のメッセージが異なる可能性があります。

  • ERROR_STATE ターゲット SQLSTATE プロパティは、プラットフォームの違いにより、異なる数値を返す可能性があります。

  • ERROR_PROCEDURE 変換は、関数が呼び出されたストアドプロシージャを返すように変更されました。

入力コード:

CREATE PROCEDURE ProcError
AS
BEGIN
Declare @ErrorState INT = ERROR_STATE();
Declare @ErrorMessage INT = ERROR_MESSAGE();
Declare @ErrorProc INT = ERROR_PROCEDURE();
Select 1;
END;
Copy

生成されたコード

CREATE OR REPLACE PROCEDURE ProcError ()
RETURNS TABLE()
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "transact",  "convertedOn": "09/01/2025",  "domain": "no-domain-provided" }}'
EXECUTE AS CALLER
AS
$$
DECLARE
ERRORSTATE INT := SQLSTATE /*** SSC-FDM-TS0023 - ERROR STATE COULD BE DIFFERENT IN SNOWFLAKE ***/;
ERRORMESSAGE INT := SQLERRM /*** SSC-FDM-TS0023 - ERROR MESSAGE COULD BE DIFFERENT IN SNOWFLAKE ***/;
ERRORPROC INT := 'ProcError' /*** SSC-FDM-TS0023 - ERROR PROCEDURE NAME COULD BE DIFFERENT IN SNOWFLAKE ***/;
ProcedureResultSet RESULTSET;
BEGIN
 
 
 
ProcedureResultSet := (
Select 1);
RETURN TABLE(ProcedureResultSet);
END;
$$;
Copy

推奨

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

SSC-FDM-TS0024

At Time Zoneステートメントの CURRENT_TIMESTAMP は異なる動作をすることがあります。

説明

この FDM は、At Time ZoneCURRENT_TIMESTAMP がある場合に追加されます。これは、場合によっては結果が異なる可能性があるためです。

主な違いは、SQL Serverでは、CURRENT_TIMESTAMP がサーバーのタイムゾーンで現在のシステムの日付と時刻を返し、Snowflakeでは、CURRENT_TIMESTAMP が UTC(協定世界時)のタイムゾーンで現在の日付と時刻を返すことです。

入力コード:

SQL Server
 SELECT current_timestamp at time zone 'Hawaiian Standard Time';
Copy
結果

2024-02-08 16:52:55.317 -10:00

生成されたコード:
Snowflake
 SELECT
CONVERT_TIMEZONE('Pacific/Honolulu', CURRENT_TIMESTAMP() /*** SSC-FDM-TS0024 - CURRENT_TIMESTAMP in At Time Zone statement may have a different behavior in certain cases ***/);
Copy
結果

2024-02-08 06:53:46.994 -1000

ベストプラクティス

これは、Snowflakeで同じ形式を維持したい場合の例です。

SQL Server
 SELECT current_timestamp at time zone 'Hawaiian Standard Time';
Copy
結果

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());
Copy
結果

2024-02-08 16:33:49.143

SSC-FDM-TS0025

DB_ID_UDF は、特定のケースで異なる動作をする可能性があります。

説明

この FDM は、 DB_ID_UDF が DB_ID SqlServer 関数をできる限りエミュレートしようとしていることを明らかにするために追加されています。SqlServer では、データベースに割り当てられた識別子は一意であり、データベースが削除された場合、この ID は二度と使用されません。これとは別に、Snowflakeでは、この識別子はデータベースが作成されたときに割り当てられた番号に対応します。この番号も一意ですが、連続した番号であるため、このデータベースが削除された場合、この番号は削除されたデータベースの後に作成されたデータベースに割り当てられることになります。

入力コード:

SQL Server
 SELECT DB_ID('my_database');
Copy
結果

6

生成されたコード:
Snowflake
 SELECT
DB_ID_UDF('my_database') /*** SSC-FDM-TS0025 - DB_ID_UDF MAY HAVE A DIFFERENT BEHAVIOR IN CERTAIN CASES ***/;
Copy
結果

6

ベストプラクティス

SSC-FDM-TS0026

DELETE のケースは仮テーブルでは考慮されません

説明

特定の変換を必要とする INSERT ステートメントパターンがあり、これには仮テーブルの作成が必要です。この FDM は、DELETE のケースは考慮されていないことを通知しています。このパターンの詳細については、 INSERT with Table DML Factor with MERGE as DML でご確認ください。

入力コード:

SQL Server
 INSERT INTO T3
SELECT
	col1,
  col2
FROM (
  MERGE T1 USING T2
  	ON T1.col1 = T2.col1
  WHEN NOT MATCHED THEN
    INSERT VALUES ( T2.col1, T2.col2 )
  WHEN MATCHED THEN
    UPDATE SET T1.col2 = t2.col2
  OUTPUT
  	$action ACTION_OUT,
    T2.col1,
    T2.col2
) AS MERGE_OUT
 WHERE ACTION_OUT='UPDATE';
Copy
生成されたコード:
Snowflake
 --** SSC-FDM-TS0026 - DELETE CASE IS NOT BEING CONSIDERED, PLEASE CHECK IF THE ORIGINAL MERGE PERFORMS IT **
CREATE OR REPLACE TEMPORARY TABLE MERGE_OUT AS
	SELECT
		CASE
			WHEN T1.$1 IS NULL
				THEN 'INSERT'
			ELSE 'UPDATE'
		END ACTION_OUT,
		T2.col1,
		T2.col2
	FROM
		T2
		LEFT JOIN
			T1
			ON T1.col1 = T2.col1;

MERGE INTO T1
USING T2
ON T1.col1 = T2.col1
WHEN NOT MATCHED THEN
	   INSERT VALUES (T2.col1, T2.col2)
WHEN MATCHED THEN
	UPDATE SET
		T1.col2 = t2.col2
		!!!RESOLVE EWI!!! /*** SSC-EWI-0021 - OUTPUT CLAUSE NOT SUPPORTED IN SNOWFLAKE ***/!!!
		OUTPUT
			$action ACTION_OUT,
		  T2.col1,
		  T2.col2 ;

		INSERT INTO T3
		SELECT
	col1,
	col2
		FROM
	MERGE_OUT
		WHERE
	ACTION_OUT ='UPDATE';
Copy

ベストプラクティス

SSC-FDM-TS0027

SET ANSI_NULLS ON ステートメントは、Snowflakeでは異なる動作をする可能性があります。

説明

この FDM は、Snowflakeでは SET ANSI_NULLS ON ステートメントが異なる動作をする可能性があることを通知しています。このステートメントについての詳細は、ANSI_NULLS の記事でご確認ください。

入力コード

 SET ANSI_NULLS ON;
Copy
生成されたコード
 ----** SSC-FDM-TS0027 - SET ANSI_NULLS ON STATEMENT MAY HAVE A DIFFERENT BEHAVIOR IN SNOWFLAKE **
--SET ANSI_NULLS ON
Copy

ベストプラクティス

SSC-FDM-TS0028

出力パラメーターは、実行されるコードに現れるのと同じ順序である必要があります。

説明

この FDM は、 SP_EXECUTESQL ステートメントの出力パラメーターが、実行する SQL の文字列と同じ順序である必要があることを通知しています。そうしないと、出力値が正しく割り当てられません。

コード例

正しい場合

ご覧のように @MaxAgeOUT@MaxIdOUT は、SQL 文字列と出力パラメーターの両方に、同じ順序で現れます。

したがって、コードを変換する際、 SELECT $1, $2 INTO :MAXAGE, :MAXID FROM TABLE(RESULT_SCAN(LAST_QUERY_ID())) は正しく値を割り当てます。

Transact
 CREATE PROCEDURE CORRECT_OUTPUT_PARAMS_ORDER
AS
BEGIN
    DECLARE @MaxAge INT;
    DECLARE @MaxId INT;

    EXECUTE sp_executesql
        N'SELECT @MaxAgeOUT = max(AGE), @MaxIdOut = max(ID) FROM PERSONS WHERE ID < @id AND AGE < @age;',
        N'@age INT, @id INT, @MaxAgeOUT INT OUTPUT, @MaxIdOUT INT OUTPUT',
        30,
        100,
        @MaxAgeOUT = @MaxAge OUTPUT,
        @MaxIdOut = @MaxId OUTPUT;

    SELECT @MaxAge, @MaxId;
END
Copy
Snowflake
 CREATE OR REPLACE PROCEDURE CORRECT_OUTPUT_PARAMS_ORDER ()
RETURNS TABLE()
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "transact",  "convertedOn": "10/07/2024" }}'
EXECUTE AS CALLER
AS
$$
  DECLARE
    MAXAGE INT;
    MAXID INT;
    ProcedureResultSet RESULTSET;
  BEGIN
     
     
    !!!RESOLVE EWI!!! /*** SSC-EWI-0030 - THE STATEMENT BELOW HAS USAGES OF DYNAMIC SQL. ***/!!!
    EXECUTE IMMEDIATE TRANSFORM_SP_EXECUTE_SQL_STRING_UDF('SELECT
   MAX(AGE),
   MAX(ID) FROM
   PERSONS
WHERE
   ID < @id AND AGE < @age;', '@age INT, @id INT, @MaxAgeOUT INT OUTPUT, @MaxIdOUT INT OUTPUT', ARRAY_CONSTRUCT('', '', 'MAXAGEOUT', 'MAXIDOUT'), ARRAY_CONSTRUCT(
    30,
    100, :MAXAGE, :MAXID));
    --** SSC-FDM-TS0028 - OUTPUT PARAMETERS MUST HAVE THE SAME ORDER AS THEY APPEAR IN THE EXECUTED CODE **
    SELECT
      $1,
      $2
    INTO
      :MAXAGE,
      :MAXID
    FROM
      TABLE(RESULT_SCAN(LAST_QUERY_ID()));
    ProcedureResultSet := (
    SELECT
      :MAXAGE,
      :MAXID);
    RETURN TABLE(ProcedureResultSet);
  END;
$$;
Copy

問題のあるケース

ご覧のように、出力パラメーターの @MaxAgeOUT@MaxIdOUT は、SQL 文字列とは異なる順序で現れます。

したがって、コードを変換する際、 SELECT $1, $2 INTO :MAXID, :MAXAGE FROM TABLE(RESULT_SCAN(LAST_QUERY_ID())) は誤って値を割り当てます。Max(AGE):MAXID に、 Max(ID):MAXAGE に割り当てられます。

これは、SELECT INTO ステートメント内の出力パラメーターの順序を変更するか、SQL 文字列内の順序を変更することによって、手動で修正する必要があります。

Transact
 CREATE PROCEDURE INCORRECT_OUTPUT_PARAMS_ORDER
AS
BEGIN
    DECLARE @MaxAge INT;
    DECLARE @MaxId INT;

    EXECUTE sp_executesql
        N'SELECT @MaxAgeOUT = max(AGE), @MaxIdOut = max(ID) FROM PERSONS WHERE ID < @id AND AGE < @age;',
        N'@age INT, @id INT, @MaxAgeOUT INT OUTPUT, @MaxIdOUT INT OUTPUT',
        30,
        100,
        @MaxIdOut = @MaxId OUTPUT,
        @MaxAgeOUT = @MaxAge OUTPUT;

    SELECT @MaxAge, @MaxId;
END
Copy
Snowflake
 CREATE OR REPLACE PROCEDURE INCORRECT_OUTPUT_PARAMS_ORDER ()
RETURNS TABLE()
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "transact",  "convertedOn": "10/07/2024" }}'
EXECUTE AS CALLER
AS
$$
  DECLARE
    MAXAGE INT;
    MAXID INT;
    ProcedureResultSet RESULTSET;
  BEGIN
     
     
    !!!RESOLVE EWI!!! /*** SSC-EWI-0030 - THE STATEMENT BELOW HAS USAGES OF DYNAMIC SQL. ***/!!!
    EXECUTE IMMEDIATE TRANSFORM_SP_EXECUTE_SQL_STRING_UDF('SELECT
   MAX(AGE),
   MAX(ID) FROM
   PERSONS
WHERE
   ID < @id AND AGE < @age;', '@age INT, @id INT, @MaxAgeOUT INT OUTPUT, @MaxIdOUT INT OUTPUT', ARRAY_CONSTRUCT('', '', 'MAXIDOUT', 'MAXAGEOUT'), ARRAY_CONSTRUCT(
    30,
    100, :MAXID, :MAXAGE));
    --** SSC-FDM-TS0028 - OUTPUT PARAMETERS MUST HAVE THE SAME ORDER AS THEY APPEAR IN THE EXECUTED CODE **
    SELECT
      $1,
      $2
    INTO
      :MAXID,
      :MAXAGE
    FROM
      TABLE(RESULT_SCAN(LAST_QUERY_ID()));
    ProcedureResultSet := (
    SELECT
      :MAXAGE,
      :MAXID);
    RETURN TABLE(ProcedureResultSet);
  END;
$$;
Copy

ベストプラクティス

  • 確実に OUTPUT パラメーターが SQL の文字列と同じ順番になるようにします。

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

SSC-FDM-TS0029

SET NOCOUNT ステートメントはコメントアウトされており、Snowflakeでは適用されません。

説明

SnowConvert AI は SET NOCOUNT ステートメントに遭遇すると、この FDM を追加します。これは Snowflake 環境には関係がないので、SnowConvert AI はその後に SET NOCOUNT ステートメントをコメントアウトします。

コード例

入力コード:

 SET NOCOUNT ON;
Copy
生成されたコード
 ----** SSC-FDM-TS0029 - SET NOCOUNT STATEMENT IS COMMENTED OUT, WHICH IS NOT APPLICABLE IN SNOWFLAKE. **
--SET NOCOUNT ON
Copy

ベストプラクティス

SSC-FDM-TS0030

SET ANSI_PADDING ON ステートメントはコメントアウトされますが、これはSnowflakeでは同等の動作です。

説明

Snowflakeは、文字列値を列に挿入する際、常に後続のスペースを保持します。この動作は、SQL ServerにおけるSET ANSI_PADDING ON に相当します。したがって、SnowConvert AI は SET ANSI_PADDING ON ステートメントに遭遇すると、この FDM を追加して、コメントアウトします。

コード例

入力コード:

 SET ANSI_PADDING ON;
Copy
生成されたコード
 ----** SSC-FDM-TS0030 - SET ANSI_PADDING ON STATEMENT IS COMMENTED OUT, WHICH IS EQUIVALENT IN SNOWFLAKE. **
--SET ANSI_PADDING ON
Copy

ベストプラクティス

SSC-FDM-TS0031

SET ANSI_WARNINGS ON ステートメントはコメントアウトされているので、Snowflakeは通常 ANSI 規格の動作に従います。

説明

Snowflakeは通常、特に算術オーバーフロー、ゼロによる除算、文字列の切り捨てのエラー処理に関して、デフォルトで ANSI_WARNINGSON であるかのように動作します。Snowflakeでは一般的に、 ANSI_WARNINGS と同等のものを明示的に「設定」する必要はありません。したがって、SnowConvert AI は SET ANSI_WARNINGS ON ステートメントに遭遇すると、この FDM を追加して、コメントアウトします。

コード例

入力コード:

 SET ANSI_WARNINGS ON;
Copy
生成されたコード
 ----** SSC-FDM-TS0031 - SET ANSI_WARNINGS ON STATEMENT IS COMMENTED OUT, WHICH SNOWFLAKE GENERALLY ADHERES TO ANSI-STANDARD BEHAVIORS. **
--SET ANSI_WARNINGS ON
Copy

ベストプラクティス

SSC-FDM-TS0032

IDENTITY 列プロパティは、CREATE TABLE AS STATEMENT ではサポートされておらず、ROW_NUMBER() を使用してエミュレートされています。

説明

Snowflakeには、ID列で CREATE TABLE AS を実行する直接的な方法はありません。SnowConvert では、ROW_NUMBER 列を IDENTITY の代わりに追加して、IDの列挙をシミュレートしています。この変換はID列を作成しないので、作成後に挿入された行は自動的にインクリメントされません。

コード例

入力コード:

with peers as
(
    select
    *
    from (
    values
        ('Luis', 'Miguel'),
        ('Cory', 'Wong'),
        ('Steve', 'Vai'),
        ('John', 'Petrucci'),
        ('Paul', 'Gilbert')
    ) as info(name, lastname)
)
select
    rowm = IDENTITY(int,1,1),
    *
into #MYTABLE
from peers;
Copy
生成されたコード
--** SSC-FDM-TS0032 - IDENTITY COLUMN PROPERTY NOT SUPPORTED IN CREATE TABLE AS STATEMENT, EMULATED WITH USING ROW_NUMBER **
CREATE OR REPLACE TEMPORARY TABLE T_MYTABLE AS
     WITH peers as
(
    select
     *
    from (
    values
        ('Luis', 'Miguel'),
        ('Cory', 'Wong'),
        ('Steve', 'Vai'),
        ('John', 'Petrucci'),
        ('Paul', 'Gilbert')
    ) as info (
      name,
      lastname
     )
)
     SELECT
    ROW_NUMBER()
    OVER (
    ORDER BY
     NULL) AS rowm,
    *
from
    peers;
Copy

ベストプラクティス

SSC-FDM-TS0033

SET QUOTED_IDENTIFIER STATEMENT MAY HAVE A DIFFERENT BEHAVIOR IN SNOWFLAKE.

説明

SQL Server Behavior

In SQL Server, SET QUOTED_IDENTIFIER ON is a syntax setting that is separate from collation. The database's or column's collation (e.g., _CI for Case-Insensitive or _CS for Case-Sensitive) dictates whether quoted identifiers are case-sensitive or not. If a database has a _CI collation, then "MyColumn" and "mycolumn" are treated as the same.

Snowflake Behavior

In Snowflake, the behavior is simpler and more strict:

Unquoted Identifiers: Automatically stored and resolved in all uppercase, making them case-insensitive (mytable is the same as MYTABLE).

Quoted Identifiers: By default, identifiers enclosed in double quotes ("MyColumn") are case-sensitive. They are stored exactly as you typed them.

コード例

入力コード:

SET QUOTED_IDENTIFIER ON
GO

-- the table is defined as "Products Test"
-- this query will work because the case is ignored.
select
*
from [products test];

SET QUOTED_IDENTIFIER OFF

-- this query will fail because the case is preserved
select
*
from [products test];
GO
Copy
生成されたコード
----** SSC-FDM-TS0033 - SET QUOTED_IDENTIFIER STATEMENT MAY HAVE A DIFFERENT BEHAVIOR IN SNOWFLAKE **
--SET QUOTED_IDENTIFIER ON

-- the table is defined as "Products Test"
-- this query will work because the case is ignored.
select
  *
from
  "products test";

----** SSC-FDM-TS0033 - SET QUOTED_IDENTIFIER STATEMENT MAY HAVE A DIFFERENT BEHAVIOR IN SNOWFLAKE **
--SET QUOTED_IDENTIFIER OFF

-- this query will fail because the case is preserved
select
  *
from
  "products test";
Copy

How to Achieve Equivalence in Snowflake

To get the same case-insensitive behavior for quoted identifiers as in SQL Server, you can set the QUOTED_IDENTIFIERS_IGNORE_CASE session parameter to TRUE in Snowflake.

-- This will make quoted identifiers case-insensitive for the session
ALTER SESSION SET QUOTED_IDENTIFIERS_IGNORE_CASE = TRUE;

-- Now, this query will succeed
select
  *
from
  "products test";
Copy

ベストプラクティス

SSC-FDM-TS0034

説明

This FDM is generated when a DATA_COMPRESSION clause is encountered in a CREATE TABLE or ALTER TABLE statement. In SQL Server, DATA_COMPRESSION is used to specify whether data should be compressed (using ROW or PAGE compression) to reduce storage space and improve I/O performance. Snowflake automatically handles data compression using its proprietary compression algorithms, making the DATA_COMPRESSION clause unnecessary and unsupported. SnowConvert comments out the DATA_COMPRESSION clause during conversion.

Example Code

Input (SQL Server):

CREATE TABLE Employees (
    EmployeeID INT PRIMARY KEY,
    Name NVARCHAR(100),
    Department NVARCHAR(50),
    Salary DECIMAL(10, 2)
)
WITH (DATA_COMPRESSION = PAGE);
Copy

Output (Snowflake):

CREATE OR REPLACE TABLE Employees (
    EmployeeID INT PRIMARY KEY,
    Name NVARCHAR(100),
    Department NVARCHAR(50),
    Salary DECIMAL(10, 2)
)
WITH (
--    --** SSC-FDM-TS0034 - DATA_COMPRESSION IS AUTOMATICALLY HANDLED BY SNOWFLAKE. **
--    DATA_COMPRESSION = PAGE
                           )
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "transact",  "convertedOn": "11/06/2025",  "domain": "no-domain-provided",  "migrationid": "sFmaAZAnCnm6VvGeJrE4BQ==" }}'
;
Copy