SnowConvert: Transact-SQL の機能差

Supported Environments
  • [x] Microsoft SQL Server

  • [x] Microsoft Azure Synapse Analytics

SSC-FDM-TS0001

注釈

この FDM は廃止されました。詳細情報については、 SSC-EWI-TS0077 をご参照ください。

説明

このエラーは、Snowflakeがサポートしていない照合順序句を使用しようとしたときに表示されます。

コード例

入力コード:
 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がサポートしていない照合順序句を使用した場合に表示されます。

コード例

入力コード:
 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 プロシージャを実行したときに表示されます。これらの列の詳細については、 SQL Serverのドキュメントを参照 してください。

account nametypeprivilegemapped login namepermission path

利用可能なロールを理解するには、Snowflakeの APPLICABLE_ROLES ビューをクエリします。このビューはロール情報を持つ列のセットを提供します。詳細については、 Snowflakeドキュメント をご参照ください。

GRANTEE

ROLE_NAME

ROLE_OWNER

IS_GRANTABLE

SQL Serverソースの列は、次のテーブルに示すようにSnowflakeの列にマッピングされます。これらのマッピングは厳密には等価ではないことに注意してください。

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 コマンドが出力コードに含まれている場合に表示されます。PUT コマンドは SnowSQL Web UI から実行できないため、ユーザーはこのコマンドを実行する前に、Snowflakeコマンドラインインターフェイス(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

ベストプラクティス

  • Snowflakeコマンドラインインターフェイス(SnowCLI)をインストールします。

  • その他のサポートについては、 snowconvert-support@snowflake.com にお問い合わせください

SSC-FDM-TS0005

説明

この機能移行の詳細(FMD)は、ソースデータベースの TRY_CONVERT または TRY_CAST 操作をSnowflakeの TRY_CAST 関数に直接変換できない場合に追加されます。

Snowflakeの TRY_CAST 関数は文字列式のみの変換に限定されていますが、 SQL Serverの TRY_CONVERTTRY_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

説明

このメッセージは、 SnowConvert が「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

説明

このメッセージは、 SnowConvert が 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 がすべての形式タイプを正しく扱えるとは限らないため、状況によってはエラーが発生する可能性があることにご注意ください。

負の数値は変換されずに負の符号のまま保持されます。形式指定子 %I64d は UDFs と互換性がないため、使用するとエラーが発生します。

FORMATMESSAGE_UDF 関数では、引数の数がメッセージテンプレートのプレースホルダーの数と一致しない場合にエラーが発生します。

このユーザー定義関数(UDF)では、メッセージ番号識別子を処理することはできません。

コード例

入力コード:
 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

説明

この警告は、列が 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

説明

この警告は、 SQL Serverの関数 DB_NAME をSnowflakeの関数 CURRENT_DATABASE に変換した場合に表示されます。Snowflakeの CURRENT_DATABASE 関数はパラメーターとしてデータベース IDs をサポートしておらず、現在のデータベースの名前のみを返すため、この変換はコードの動作に影響を与える可能性があります。

コード例

入力コード:
 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

注釈

この FDM は現在サポートされていません。詳細情報については、 SSC-EWI-TS0078 をご参照ください。

説明

このエラーは、関数呼び出し、変数名、名前付き定数などの式が、switchステートメントのデフォルトの場合の後に置かれたときに発生します。

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
Document headings start at H4, not H1 [myst.header]

SSC-FDM-TS0012

説明

この警告は、変換中にシステムが列の戻り値のタイプを決定できない場合に、テーブル値ユーザー定義関数に表示されます。このような場合、 SELECT ステートメントの CAST 操作に一致するデフォルトタイプとして、 STRING が自動的に使用されます。

コード例

入力コード:
 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 Scriptingでは、カーソル行は読み取り専用であり、変更することはできません。

コード例:

入力コード:
 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に変換するときに警告が表示されます。この警告は、Snowflakeの関数が SQL Serverで使用されていたものとまったく同じではない可能性があることを示しています。

コード例

入力コード:
 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-TS0015

説明

この警告は、 SQL Server列のデータ型がSnowflakeでサポートされていない場合に表示されます。

コード例

入力コード:
 CREATE TABLE table1
(
column1 type1
);
Copy
生成されたコード:
 CREATE OR REPLACE TABLE table1
(
column1 VARIANT /*** SSC-FDM-TS0015 - DATA TYPE TYPE1 IS NOT SUPPORTED IN SNOWFLAKE ***/
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"transact"}}'
;
Copy

ベストプラクティス

SSC-FDM-TS0016

説明

この警告は、 SQL Server FOR XML 句をSnowflakeに変換するときに表示されます。これは、 XML の出力結果の列順が、2つのプラットフォームで異なる可能性があることを示しています。

コード例

以下のような、 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

説明

この警告は、 SUSER_NAMESUSER_SNAME などの関数にユーザー識別子パラメーターが含まれている場合に表示されます。Snowflakeの CURRENT_USER 関数はユーザーパラメーターをサポートしていないためです。

入力コード:

 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 がソースコード内の DBCC (データベースコンソールコマンド)ステートメントを検出すると表示されます。Snowflakeはほとんどの DBCC ステートメントをサポートしていないことに注意してください。

コード例

入力コード:
 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

重大性

悪い

説明

この警告は、 SQL Serverの文字列形式規則により、 RAISERROR エラーメッセージが異なる可能性があることを示しています。

コード例

入力コード:
 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 参照の識別に役立ち、デフォルトの制約がテーブル定義に含まれます。このアプローチに従わない場合、制約はコードのコメントとしてのみ表示されます。

コード例

入力コード:
 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

既知の問題

  • 同じ列に複数のデフォルトの制約が定義されている場合、最初の制約のみがテーブル作成ステートメントに表示されます。

  • デフォルトの制約が存在しない列を参照すると、必要な列が存在しないため変換に失敗します。

推奨事項

SSC-FDM-TS0021

重大性

悪い

注釈

読みやすくするために、この例ではコードの一部を簡略化しています。

説明

この早期警告インジケーター(EWI)は、テーブルの変更ステートメントに 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

注釈

ALTER TABLE ステートメントを実行する前に、 MASKING POLICY を作成する必要があります。動作がソースシステムとまったく同じでない可能性があり、ロールやユーザー権限を適宜調整する必要が生じる場合があることに注意してください。

推奨事項

SSC-FDM-TS0022

重大性

悪い

注釈

読みやすくするために、この例ではコードの一部を簡略化しています。

説明

このエラーは、 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

重大性

悪い

説明

この警告は、 ERROR_MESSAGE()関数の変換中に表示されます。Snowflakeでは正確なエラーメッセージが異なる場合があるため、ご注意ください。

入力コード:
 SET @varErrorMessage = ERROR_MESSAGE()
Copy
出力コード
 BEGIN
VARERRORMESSAGE := SQLERRM /*** SSC-FDM-TS0023 - ERROR MESSAGE COULD BE DIFFERENT IN SNOWFLAKE ***/;
END;
Copy

推奨

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

SSC-FDM-TS0024

説明

この関数検出メカニズム(FDM)は、 At Time ZoneCURRENT_TIMESTAMP を併用した場合にトリガーされます。シナリオによっては結果が異なる場合があるため、この確認は必要です。

SQL ServerとSnowflakeの CURRENT_TIMESTAMP 関数の主な違いは、タイムゾーンの処理です。

  • SQL Server: サーバーのローカルタイムゾーンに基づくシステム日時を返します。

  • Snowflake: 日時を UTC (協定世界時)で返します。

入力コード:

 SELECT current_timestamp at time zone 'Hawaiian Standard Time';
Copy

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

出力コード:
 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で一貫した形式を維持する方法の例を示します。

 SELECT current_timestamp at time zone 'Hawaiian Standard Time';
Copy

2024-02-08 16:33:49.143 -10:00

Snowflakeでは、デフォルトのタイムゾーンは ALTER SESSION コマンドを使って変更できます。例:

 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

説明

この関数設計メモ(FDM)では、 DB_ID_UDF 関数が DB_ID SQL Server関数の再現動作をどのように目指しているかを説明しています。SQL Serverでは、再利用されることのない永続的な一意の識別子をデータベースに割り当てますが、Snowflakeではデータベース IDs の扱いが異なります。Snowflakeでは、データベース IDs は作成時に割り当てられる連番です。データベースが削除された場合、その ID 番号は利用可能になり、次に新しく作成されるデータベースに割り当てられます。

入力コード:

 SELECT DB_ID('my_database');
Copy

6

出力コード:
 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

説明

テーブル DML 要因を含む INSERT ステートメントを変換する場合には、仮テーブルを作成する必要があります。この機能検出メッセージ(FDM)は、 DELETE 操作がこの変換に含まれないことを示していることに注意してください。このパターンの詳細については、 DML として MERGE でテーブル DML 要因を含む INSERT をご参照ください。

入力コード:

 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
出力コード:
 --** 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

説明

この移行中での検出(FDM)は、 SET ANSI_NULLS ON ステートメントがSnowflakeではソースデータベースと異なる動作をする可能性があることを警告します。このステートメントの詳細情報については、 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

説明

この通知は、 SP_EXECUTESQL を使用する場合に出力パラメーターは、実行される SQL 文字列内に現れるのと同じ順序でリストされなければならないことを示しています。順序が異なると、出力値が正しく割り当てられません。

コード例

正しい場合

@MaxAgeOUT@MaxIdOUT パラメーターの順序は、 SQL クエリ文字列と出力パラメーター定義の両方で一致しています。

コードを変換すると、ステートメント SELECT $1, $2 INTO :MAXAGE, :MAXID FROM TABLE(RESULT_SCAN(LAST_QUERY_ID())) は、列$1と$2の値をそれぞれ変数 MAXAGE と MAXID に格納します。

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 にお問い合わせください