SnowConvert AI - SQL Server-Azure Synapse 기능적 차이

Applies to
  • SQL 서버

  • 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

모범 사례

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

모범 사례

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 명령이 출력 코드에 추가된 경우 표시됩니다. PUT 명령은 SnowSQL 웹 UI를 사용하여 실행할 수 없습니다. 성공적으로 실행하려면 모든 사용자가 이전에 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

모범 사례

SSC-FDM-TS0005

TRY_CONVERT 및 TRY_CAST는 TRY_CAST로 변환될 수 없습니다

설명

이 FMD는 Snowflake에서 TRY_CONVERT 또는 TRY_CAST를 TRY_CAST로 변환할 수 없는 경우에 표시됩니다.

Snowflake의 TRY_CAST 함수는 문자열 식의 변환만 허용하므로 제한 사항이 있습니다. 그러나 Transact의 TRY_CONVERTTRY_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

모범 사례

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

모범 사례

SSC-FDM-TS0007

FOR REPLICATION 절은 Snowflake에 존재하지 않습니다.

설명

이 메시지는 SnowConvert AI가 FOR REPLICATION 절이 있는 프로시저를 발견한 경우에 표시됩니다. 이는 Snowflake에서 지원되지 않으므로 제거됩니다.

이 절은 프로시저가 복제를 위해 생성되었다고 명시합니다. 따라서 Subscriber에서는 실행할 수 없습니다.

참고

이 절 기능에 대한 자세한 내용은 설명서를 참조하세요.

코드 예제

입력 코드:
 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

모범 사례

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

Encrypted with는 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

모범 사례

SSC-FDM-TS0010

CURRENT_DATABASE 함수는 특정 상황에서 다르게 동작합니다.

설명

Snowflake는 database_id 매개변수를 지원하지 않으며 CURRENT_DATABASE 함수는 항상 현재 데이터베이스 이름을 반환하므로, 이 EWI는 DB_NAME 함수가 CURRENT_DATABASE로 변환되는 경우에 추가됩니다.

코드 예제

입력 코드:
 SELECT DB_NAME(someId);
Copy
생성된 코드:
 SELECT
CURRENT_DATABASE() /*** SSC-FDM-TS0010 - CURRENT_DATABASE function has different behavior in certain cases ***/;
Copy

모범 사례

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 Scripting 커서 행은 수정할 수 없습니다.

설명

이 EWI는 입력 코드에서 커서가 수정 가능 상태일 때 추가됩니다. 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에서 상응하는 열로 변환되는 경우에 추가됩니다. 경우에 따라 기능적 동등성에 영향을 미칠 수 있기 때문에 이 경고가 추가됩니다.

코드 예제

입력 코드:
 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

Snowflake의 XML 열은 형식이 다를 수 있습니다

설명

이 경고는 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 함수에서 지원되지 않기 때문에 추가됩니다.

입력 코드:

 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

모범 사례

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

Known Issues

  • 동일한 열에 대해 서로 다른 기본 제약 조건이 선언되면 첫 번째 제약 조건만 Create Table 문에 반영됩니다.

  • 누락된 열에 기본 제약 조건이 선언되면 종속성 부족으로 인해 변환을 수행할 수 없습니다.

모범 사례

SSC-FDM-TS0021

MASKED WITH를 대체하기 위해 MASKING POLICY가 생성되었습니다.

참고

출력 코드의 일부 부분은 명확성을 위해 생략되었습니다.

설명

이 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번째 줄에 표시된 것처럼, 정의된 역할을 배치할 수 있는 자리 표시자가 있습니다. 쉼표로 구분된 하나 이상의 값을 입력할 수 있는 공간이 있습니다. 또한, 여기에서는 각 값에 작은 따옴표를 사용해야 합니다.

모범 사례

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 서버
 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 케이스가 고려되지 않음을 알립니다. 이 패턴에 대한 자세한 내용은 MERGE를 DML로 사용하는 테이블 DML 요소를 포함한 INSERT를 참조하세요.

입력 코드:

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은 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

출력 매개 변수는 실행된 코드에 표시되는 순서와 동일해야 합니다

설명

이 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는 SETNOCOUNT 문을 발견하는 경우 이 FDM을 추가합니다. 그런 다음 SnowConvert AI는 SET NOCOUNT 문이 Snowflake 환경과 관련이 없기 때문에 주석 처리합니다.

코드 예제

입력 코드:

 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_PADDINGON 문을 발견하는 경우 이 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 상태인 것처럼 동작하며, 특히 산술 오버플로, 0으로 나누기, 문자열 잘림 등의 오류를 처리할 때 그렇습니다. 일반적으로 Snowflake에서 ANSI_WARNINGS에 상응하는 항목을 명시적으로 “설정”할 필요가 없습니다. 따라서 SnowConvert AI는 SET ANSI_WARNINGSON 문을 발견하는 경우 이 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는 IDENTITY 대신 ROW_NUMBER 열을 추가하여 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