SnowConvert AI - SQL Server-Azure Synapse 문제

Applies to
  • SQL 서버

  • Azure Synapse Analytics

  • Sybase

SSC-EWI-TS0001

사용자 정의 함수 본문이 생성되지 않습니다

심각도

중요

참고

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

설명

이 EWI는 SnowConvert AI가 변환 중에 함수 본문이 생성되지 못하게 하는 중요한 예외를 처리할 때 표시됩니다.

코드 예시

SQL 서버
 CREATE FUNCTION func1 ()
RETURNS VARCHAR
SELECT
   *
FROM
   TABLE1
Copy
Snowflake
 --** SSC-FDM-0007 - MISSING DEPENDENT OBJECT "TABLE1" **
CREATE OR REPLACE FUNCTION func1 ()
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "transact",  "convertedOn": "07/14/2025",  "domain": "no-domain-provided" }}'
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0001 - THE BODY WAS NOT GENERATED FOR FUNCTION 'func1' ***/!!!
AS
$$

$$;
Copy

모범 사례

SSC-EWI-TS0002

ANSI_PADDING OFF는 Snowflake에서 지원되지 않습니다.

심각도

낮음

참고

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

설명

Transact-SQL에서 SET ANSI_PADDING OFF 문은 문자 데이터 타입의 삽입에서 후행 공백을 제거합니다. SET ANSI_PADDING OFF는 Snowflake에서 직접 구성할 수 있는 설정이 아니므로 SnowConvert AI는 이 EWI를 생성합니다.

코드 예시

SQL 서버
 SET ANSI_PADDING OFF;
Copy
Snowflake
 !!!RESOLVE EWI!!! /*** SSC-EWI-TS0002 - THE ANSI_PADDING OFF IS NOT SUPPORTED IN SNOWFLAKE. ***/!!!
SET ANSI_PADDING OFF;
Copy

모범 사례

  • 이 문제를 제거하려면 ETL 코드를 포함하여 RTRIM을 모든 CHAR() 데이터 타입 삽입에 추가합니다.

  • 추가 지원이 필요한 경우 snowconvert-support@snowflake.com으로 이메일을 보내주세요.

SSC-EWI-TS0003

ANSI_WARNINGS OFF는 Snowflake에서 지원되지 않습니다.

심각도

낮음

참고

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

설명

Transact-SQL에서 SET ANSI_WARNINGS OFF 문은 0으로 나누기 또는 산술 오버플로와 같은 경고를 비활성화합니다. SET ANSI_WARNINGS OFF는 Snowflake에서 직접 구성할 수 있는 설정이 아니므로 SnowConvert AI는 이 EWI를 생성합니다.

코드 예시

SQL 서버
 SET ANSI_WARNINGS OFF;
Copy
Snowflake
 !!!RESOLVE EWI!!! /*** SSC-EWI-TS0003 - THE ANSI_WARNINGS OFF IS NOT SUPPORTED IN SNOWFLAKE. ***/!!!
SET ANSI_WARNINGS OFF;
Copy

모범 사례

SSC-EWI-TS0009

다음 트랜잭션에는 중첩 트랜잭션이 포함될 수 있으며 이는 Snowflake에서 지원되지 않는 복잡한 패턴으로 간주됩니다.

참고

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

심각도

높음

설명

이 오류는 트랜잭션에 중첩 트랜잭션이 포함될 수 있음을 알리기 위해 추가됩니다. SQL Server에서는 트랜잭션을 중첩할 수 있습니다. 즉, 기존 트랜잭션 내에서 새 트랜잭션을 시작할 수 있습니다. 첫 번째 BEGIN 문 이후에 다른 트랜잭션을 실행하면 새 트랜잭션이 열리고 현재 트랜잭션 수가 1씩 증가합니다.\

반면, Snowflake에서는 이 기능이 지원되지 않습니다. 두 번째 BEGIN 문은 무시되며 여전히 하나의 트랜잭션만 남게 됩니다. 자세한 내용은 [SQL Server 트랜잭션]https://learn.microsoft.com/en-us/sql/t-sql/language-elements/transactions-transact-sql?view=sql-server-ver16)을 참조하세요.

코드 예제

입력 코드:
 CREATE PROC transactionsTest
AS
BEGIN TRANSACTION 
   SELECT @@TRANCOUNT AS TransactionCount_AfterFirstTransaction 
   INSERT INTO TESTSCHEMA.TESTTABLE(ID) VALUES (1), (2) 
   BEGIN TRANSACTION 
      SELECT @@TRANCOUNT AS TransactionCount_AfterSecondTransaction 
      INSERT INTO TESTSCHEMA.TESTTABLE(ID) VALUES (3), (4) 
   COMMIT;
   SELECT @@TRANCOUNT AS TransactionCount_AfterFirstCommit  
COMMIT;
END;
Copy
생성된 코드:
 CREATE OR REPLACE PROCEDURE transactionsTest ()
RETURNS ARRAY
LANGUAGE SQL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"transact"}}'
EXECUTE AS CALLER
AS
$$
 DECLARE
  ProcedureResultSet1 VARCHAR;
  ProcedureResultSet2 VARCHAR;
  ProcedureResultSet3 VARCHAR;
  return_arr ARRAY := array_construct();
 BEGIN
  !!!RESOLVE EWI!!! /*** SSC-EWI-TS0009 - THE FOLLOWING TRANSACTION MAY CONTAIN NESTED TRANSACTIONS WHICH ARE NOT SUPPORTED IN SNOWFLAKE. ***/!!!
  BEGIN TRANSACTION;
  ProcedureResultSet1 := 'RESULTSET_' || REPLACE(UPPER(UUID_STRING()), '-', '_');
  CREATE OR REPLACE TEMPORARY TABLE IDENTIFIER(:ProcedureResultSet1) AS
   SELECT
    :TRANCOUNT AS TransactionCount_AfterFirstTransaction;
  return_arr := array_append(return_arr, :ProcedureResultSet1);
  INSERT INTO TESTSCHEMA.TESTTABLE (ID) VALUES (1), (2);
  BEGIN TRANSACTION;
  ProcedureResultSet2 := 'RESULTSET_' || REPLACE(UPPER(UUID_STRING()), '-', '_');
  CREATE OR REPLACE TEMPORARY TABLE IDENTIFIER(:ProcedureResultSet2) AS
   SELECT
    :TRANCOUNT AS TransactionCount_AfterSecondTransaction;
  return_arr := array_append(return_arr, :ProcedureResultSet2);
  INSERT INTO TESTSCHEMA.TESTTABLE (ID) VALUES (3), (4);
  COMMIT;
  ProcedureResultSet3 := 'RESULTSET_' || REPLACE(UPPER(UUID_STRING()), '-', '_');
  CREATE OR REPLACE TEMPORARY TABLE IDENTIFIER(:ProcedureResultSet3) AS
   SELECT
    :TRANCOUNT AS TransactionCount_AfterFirstCommit;
  return_arr := array_append(return_arr, :ProcedureResultSet3);
  COMMIT;
  --** SSC-FDM-0020 - MULTIPLE RESULT SETS ARE RETURNED IN TEMPORARY TABLES **
  RETURN return_arr;
 END;
$$;
-- ** SSC-EWI-0001 - UNRECOGNIZED TOKEN ON LINE '12' COLUMN '1' OF THE SOURCE CODE STARTING AT 'END'. EXPECTED 'BATCH' GRAMMAR. **
--END
   ;
Copy

모범 사례

  • Snowflake에서 중첩 트랜잭션은 컴파일 오류를 일으키지 않으며 단순히 무시됩니다. 평가 보고서에 액세스하여 중첩 트랜잭션이 있는지 확인할 수 있습니다.

  • 추가 지원이 필요한 경우 snowconvert-support@snowflake.com으로 이메일을 보내주세요.

SSC-EWI-TS0010

뷰의 공통 테이블 식은 Snowflake에서 지원되지 않습니다.

참고

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

심각도

높음

설명

이 오류는 뷰의 내부에 유효하지 않은 CTE가 있는 경우에 추가됩니다. 뷰는 쿼리의 구체화된 표현이므로, 뷰는 데이터를 검색하고 표시하는 방법만 정의하며 데이터를 조작하는 방법은 정의하지 않습니다.

코드 예제

입력 코드:
 Create View viewName
as
with commonTableExpressionName (
   columnName
) as
(
   select
      1
)
((select
   1 as col2)
union
(
   select
      1 as col3
));
Copy
생성된 코드:
 !!!RESOLVE EWI!!! /*** SSC-EWI-TS0010 - COMMON TABLE EXPRESSION IN VIEW NOT SUPPORTED IN SNOWFLAKE. ***/!!!
CREATE OR REPLACE VIEW viewName
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"transact"}}'
AS
!!!RESOLVE EWI!!! /*** SSC-EWI-0021 - WITH CTE NOT SUPPORTED IN SNOWFLAKE ***/!!!
with commonTableExpressionName (
   columnName
) as
(
   select
      1
)
((select
   1 as col2)
union
(
   select
      1 as col3
));
Copy

관련 EWI

  1. SSC-EWI-0021: 지원되지 않습니다.

모범 사례

SSC-EWI-TS0013

계산된 열이 변환되었습니다

참고

이 EWI는 더 이상 사용되지 않습니다. SSC-FDM-TS0013 설명서를 참조하세요.

심각도

낮음

설명

이 경고는 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-EWI-TS0015

데이터 타입은 Snowflake에서 지원되지 않습니다

심각도

Medium

설명

이 경고는 SQL Server 열에 Snowflake에서 지원되지 않는 유형이 있는 경우에 추가됩니다.

코드 예제

입력 코드:
 CREATE TABLE table1
(
    column1 customType,
);
Copy
생성된 코드:
 CREATE OR REPLACE TABLE table1
(
    column1 VARIANT !!!RESOLVE EWI!!! /*** SSC-EWI-TS0015 - DATA TYPE CUSTOMTYPE IS NOT SUPPORTED IN SNOWFLAKE ***/!!!
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"transact"}}'
;
Copy

모범 사례

  • Snowflake 데이터 타입 설명서에서 해당 데이터 타입에 해당하는 항목을 찾습니다.

  • 추가 지원이 필요한 경우 snowconvert-support@snowflake.com으로 이메일을 보내주세요.

SSC-EWI-TS0016

ODBC 스칼라 함수에 대한 변환이 보류 중입니다

참고

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

설명

이 EWI는 SnowConvert AI가 입력 코드 내부에서 ODBC 스칼라 함수를 발견한 경우에 추가됩니다.\ 사용자 정의 함수는 ODBC 스칼라 함수에서 지원되지 않습니다.

코드 예제

입력 코드:
 SELECT {fn CURRENT_DATE_UDF()};
Copy
생성된 코드:
 --** SSC-FDM-0007 - MISSING DEPENDENT OBJECT "CURRENT_DATE_UDF" **
SELECT
CURRENT_DATE_UDF() !!!RESOLVE EWI!!! /*** SSC-EWI-0073 - PENDING FUNCTIONAL EQUIVALENCE REVIEW FOR 'CURRENT_DATE_UDF' NODE ***/!!!!!!RESOLVE EWI!!! /*** SSC-EWI-TS0016 - USER DEFINED FUNCTIONS ARE NOT SUPPORTED IN ODBC SCALAR FUNCTION. ***/!!!;
Copy

관련 EWI

  1. SSC-EWI-0073: 기능적 동등성 검토가 보류 중입니다.

모범 사례

  • 추가 사용자 작업이 필요하지 않습니다. 이는 단지 정보 제공용입니다.

  • 추가 지원이 필요한 경우 snowconvert-support@snowflake.com으로 이메일을 보내주세요.

SSC-EWI-TS0017

마스킹은 지원되지 않습니다

심각도

낮음

설명

이 EWI는 SnowConvert AI가 CREATE TABLE 문 내부에서 마스킹된 열을 발견한 경우에 추가됩니다. 이 기능은 열 선언에 옵션을 추가해도 작동하지 않습니다. SQL Server와 동일하게 동작하려면 수동 작업이 필요합니다.

코드 예제

입력 코드:
 CREATE TABLE TABLE1
( 
  [COL1] nvarchar MASKED WITH (FUNCTION = 'default()') NULL,
  [COL2] varchar(100) MASKED WITH (FUNCTION = 'partial(1, "xxxxx", 1)') NULL,
  [COL3] varchar(100) MASKED WITH (FUNCTION = 'email()') NOT NULL,
  [COL4] smallint MASKED WITH (FUNCTION = 'random(1, 100)') NULL
);
Copy
생성된 코드:
 CREATE OR REPLACE TABLE TABLE1
(
  COL1 VARCHAR
               !!!RESOLVE EWI!!! /*** SSC-EWI-TS0017 - COLUMN MASKING NOT SUPPORTED IN CREATE TABLE ***/!!!
               MASKED WITH (FUNCTION = 'default()') NULL,
  COL2 VARCHAR(100)
                    !!!RESOLVE EWI!!! /*** SSC-EWI-TS0017 - COLUMN MASKING NOT SUPPORTED IN CREATE TABLE ***/!!!
 MASKED WITH (FUNCTION = 'partial(1, "xxxxx", 1)') NULL,
  COL3 VARCHAR(100)
                    !!!RESOLVE EWI!!! /*** SSC-EWI-TS0017 - COLUMN MASKING NOT SUPPORTED IN CREATE TABLE ***/!!!
 MASKED WITH (FUNCTION = 'email()') NOT NULL,
  COL4 SMALLINT
                !!!RESOLVE EWI!!! /*** SSC-EWI-TS0017 - COLUMN MASKING NOT SUPPORTED IN CREATE TABLE ***/!!!
                MASKED WITH (FUNCTION = 'random(1, 100)') NULL
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"transact"}}'
;
Copy

모범 사례

SnowConvert AI는 현재 버전에서 MASKING POLICIES를 생성하지 않으므로 수동으로 생성해야 합니다. 예:

첫 번째 단계는 마스킹 정책 관리자 역할을 만드는 것입니다.

 create role masking_admin;
Copy

두 번째 단계는 생성된 역할에 필요한 권한을 부여하는 것입니다.

 grant create masking policy on schema PUBLIC to role masking_admin;
allow table_owner role to set or unset the ssn_mask masking policy -- (optional)
grant apply on masking policy ssn_mask to role table_owner;
Copy

다음 단계는 마스킹 정책 함수를 만드는 것입니다.

 -- default mask
create or replace masking policy default_mask as (val string) returns string ->
case
when current_role() in ('ANALYST') then val
else 'xxxx'
end;

-- partial mask
create or replace masking policy partial_mask as (val string) returns string ->
case
when current_role() in ('ANALYST') then val
else LEFT(val,1) || 'xxxxx' || RIGHT(val,1)
end;

-- email mask
create or replace masking policy email_mask as (val string) returns string ->
case
when current_role() in ('ANALYST') then val
else LEFT(val,1) || 'XXX@XXX.com'
end;

-- random mask
create or replace masking policy random_mask as (val smallint) returns smallint ->
case
when current_role() in ('ANALYST') then val
else UNIFORM(1,100,RANDOM())::SMALLINT
end;
Copy

참고

예제로, SQL Server에서 몇 가지 마스킹 함수를 가져와 Snowflake에서 해당 함수로 변환해 보겠습니다.

마지막 단계는 SQL Server에서 원래 마스킹 옵션이 있었던 열에 마스킹 정책을 추가하는 것입니다.

 alter table if exists TABLE1 modify column COL1 set masking policy default_mask;
alter table if exists TABLE1 modify column COL2 set masking policy partial_mask;
alter table if exists TABLE1 modify column COL3 set masking policy email_mask;
alter table if exists TABLE1 modify column COL4 set masking policy random_mask;
Copy

추가 지원이 필요한 경우 snowconvert-support@snowflake.com으로 이메일을 보내주세요.

SSC-EWI-TS0023

대량 옵션이 지원되지 않습니다

심각도

낮음

참고

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

설명

이 EWI는 BULK INSERT의 일부 옵션을 매핑할 수 없는 경우에 추가됩니다. 변환된 대량 옵션은 FILE FORMAT 옵션으로 반영되어야 합니다.

코드 예제

입력 코드:
 BULK INSERT #PCE FROM 'E:\PCE_Look-up_table.txt'  
WITH   
(  
   FIELDTERMINATOR ='\t',
   ROWTERMINATOR ='\n',
   FIRE_TRIGGERS 
);
Copy
생성된 코드:
 CREATE OR REPLACE FILE FORMAT FILE_FORMAT_638461199649565070
FIELD_DELIMITER = '\t'
RECORD_DELIMITER = '\n'
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0023 - 'FIRE_TRIGGERS' BULK OPTION COULD NOT BE TRANSFORMED TO ANY OF THE EXISTING FILE FORMAT OPTIONS ***/!!!
FIRE_TRIGGERS;

CREATE OR REPLACE STAGE STAGE_638461199649565070
FILE_FORMAT = FILE_FORMAT_638461199649565070;

--** SSC-FDM-TS0004 - PUT STATEMENT IS NOT SUPPORTED ON WEB UI. YOU SHOULD EXECUTE THE CODE THROUGH THE SNOWFLAKE CLI **
PUT file://E:\PCE_Look-up_table.txt @STAGE_638461199649565070 AUTO_COMPRESS = FALSE;

COPY INTO T_PCE FROM @STAGE_638461199649565070/PCE_Look-up_table.txt;
Copy

모범 사례

관련 EWI

  1. SSC-FDM-TS0004: UI에서 PUT 문은 지원되지 않습니다.

SSC-EWI-TS0024

대량 삽입에 대한 불완전한 변환

심각도

낮음

설명

이 EWI는 저장 프로시저 내부의 BULK INSERT가 전혀 식별되지 않아 전체 변환에 대한 종속성이 생성되지 않는 경우에 발생합니다. 또한 변환된 COPY INTO는 수동으로 생성해야 하는 tempStage에서 파일을 검색합니다.

코드 예제

입력 코드:
 CREATE PROCEDURE BULK_PROC2
AS
BULK INSERT dbo.table1 FROM 'E:\test.txt'  
WITH   
(  
   FIELDTERMINATOR ='\t',
   ROWTERMINATOR ='\n'
); 

GO
Copy
생성된 코드:
 CREATE OR REPLACE FILE FORMAT FILE_FORMAT_638461207064166040
FIELD_DELIMITER = '\t'
RECORD_DELIMITER = '\n';

CREATE OR REPLACE STAGE STAGE_638461207064166040
FILE_FORMAT = FILE_FORMAT_638461207064166040;

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

CREATE OR REPLACE PROCEDURE BULK_PROC2 ()
RETURNS STRING
LANGUAGE JAVASCRIPT
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"transact"}}'
EXECUTE AS CALLER
AS
$$
   // REGION SnowConvert AI Helpers Code
   // END REGION

   EXEC(`COPY INTO dbo.table1 FROM @STAGE_638461207064166040/test.txt`);
$$
Copy

모범 사례

SSC-EWI-TS0025

ERROR_SEVERITY 함수가 변환되었습니다

심각도

낮음

참고

JavasScript를 대상 언어로 사용하고 -t JavaScript 또는 –PLTargetLanguage JavaScript 플래그를 추가해 프로시저 및 매크로를 생성합니다.

참고

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

설명

이 EWI는 ERROR_SEVERITY 기본 제공 함수가 변환되는 경우에 추가됩니다. 기본적으로 이 함수는 SQL Server에서 가장 일반적인 심각도인 16을 반환합니다. 생성된 UDF를 다시 검색해야 합니다.

코드 예제

입력 코드:
 -- Additional Params: -t JavaScript
CREATE procedure proc1()
as
BEGIN TRY  
    -- Generate a divide-by-zero error.  
    SELECT 1/0 from table1;  
END TRY  
BEGIN CATCH  
    return ERROR_SEVERITY();  
END CATCH;  
GO  
Copy
생성된 코드:
 CREATE OR REPLACE PROCEDURE proc1 ()
RETURNS STRING
LANGUAGE JAVASCRIPT
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"transact"}}'
EXECUTE AS CALLER
AS
$$
    // SnowConvert AI Helpers Code section is omitted.

    try {
        EXEC(`    -- Generate a divide-by-zero error.  
    SELECT
       TRUNC( 1/0) from
       table1`);
    } catch(error) {
        return SELECT(`   !!!RESOLVE EWI!!! /*** SSC-EWI-TS0025 - CUSTOM UDF 'ERROR_SEVERITY_UDF' INSERTED FOR ERROR_SEVERITY FUNCTION. ***/!!!
   ERROR_SEVERITY_UDF()`);
    }
$$;
Copy

모범 사례

SSC-EWI-TS0026

Delete From이 있는 쿼리가 Create Table로 변환되었습니다.

심각도

낮음

설명

이 EWI는 Delete From이 있는 공통 테이블 식이 Create Table 또는 Replace Table로 변환되는 경우에 추가됩니다.

코드 예제

입력 코드:
 WITH Duplicated AS (
SELECT *, ROW_NUMBER() OVER (PARTITION BY ID ORDER BY ID) AS RN
FROM WithQueryTest
)
DELETE FROM Duplicated
WHERE Duplicated.RN > 1
Copy
생성된 코드:
 !!!RESOLVE EWI!!! /*** SSC-EWI-TS0026 - WITH DELETE QUERY TURNED TO CREATE TABLE ***/!!!
CREATE OR REPLACE TABLE WithQueryTest AS
SELECT
*
FROM
WithQueryTest
QUALIFY
ROW_NUMBER()
OVER (PARTITION BY
ID
ORDER BY ID) = 1;
Copy

모범 사례

SSC-EWI-TS0032

대량 삽입이 부분적으로 변환되었습니다

경고

이 EWI는 Javascript가 저장 프로시저의 대상 언어인 경우에만 생성됩니다. Snowflake Scripting이 저장 프로시저에 권장되는 대상 언어이므로 이 기능은 더 이상 사용되지 않는 변환 기능입니다.

심각도

높음

참고

JavasScript를 대상 언어로 사용하고 -t JavaScript 또는 –PLTargetLanguage JavaScript 플래그를 추가해 프로시저 및 매크로를 생성합니다.

참고

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

설명

이 EWI는 포함된 코드에 BULK INSERT 문이 있는 경우 원래 연결이었던 리터럴에 추가됩니다. BULK INSERT 변환의 결과로 생성된 PUT 명령은 원래 동적 SQL이었던 코드를 실행할 때 지원되지 않습니다.

따라서 PUT 명령은 출력 코드에서 추출하여 이를 포함하는 프로시저 외부에서 수동으로 실행해야 합니다. 프로시저 내부의 동적 SQL 문장에 많은 BULK INSERT 문이 있는 경우, 변환된 각 BULK INSERT에 해당 PUT 명령을 수동으로 실행할 수 있도록 이 프로시저를 분할하는 것이 좋습니다.

코드 예제

입력 코드:
 -- Additional Params: -t JavaScript
CREATE PROCEDURE  [dbo].[Load_FuelMgtMasterData]
AS
    BEGIN
        SET NOCOUNT ON;

        DECLARE
            @SQLString VARCHAR(500)
        ,   @ImportName VARCHAR(200)
        ,   @Today DATE
        ,   @Yesterday DATE
        ,   @SourceAffiliates VARCHAR(200);

        SET @Today = GETDATE();
        SET @Yesterday = DATEADD(DAY, -1, @Today);
        TRUNCATE TABLE dbo.SourceFM_Affiliates;
        SET @ImportName = '\\' + +@@ServerName
            + '\WorkA\merchantportal\affiliates.txt';
        SET @SQLString = 'BULK INSERT ' + @SourceAffiliates + ' FROM '''
            + @ImportName + '''';
        EXEC (@SQLString);
    END;
Copy
생성된 코드:
 CREATE OR REPLACE PROCEDURE dbo.Load_FuelMgtMasterData ()
RETURNS STRING
LANGUAGE JAVASCRIPT
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"transact"}}'
EXECUTE AS CALLER
AS
$$
    // SnowConvert AI Helpers Code section is omitted.

    /*** SSC-EWI-0040 - THE 'SET' CLAUSE IS NOT SUPPORTED IN SNOWFLAKE ***/
    /*        SET NOCOUNT ON*/
    ;
    let SQLSTRING;
    let IMPORTNAME;
    let TODAY;
    let YESTERDAY;
    let SOURCEAFFILIATES;
    TODAY = SELECT(`   CURRENT_TIMESTAMP() :: TIMESTAMP`);
    YESTERDAY = SELECT(`   DATEADD(DAY, -1, ?)`,[TODAY]);
    EXEC(`        TRUNCATE TABLE dbo.SourceFM_Affiliates`);
    IMPORTNAME = `\\` + SERVERNAME + `\WorkA\merchantportal\affiliates.txt`;
    SQLSTRING =
        // ** SSC-EWI-TS0032 - THE BULK INSERT WAS PART OF A DYNAMIC SQL, WHICH MAKES SOME OF THE TRANSLATED ELEMENTS INVALID UNLESS EXECUTED OUTSIDE DYNAMIC CODE. **
        `CREATE OR REPLACE FILE FORMAT FILE_FORMAT_638923328992788100;

CREATE OR REPLACE STAGE STAGE_638923328992788100
FILE_FORMAT = FILE_FORMAT_638923328992788100;

PUT file://${IMPORTNAME} @STAGE_638923328992788100 AUTO_COMPRESS = FALSE;

COPY INTO ${SOURCEAFFILIATES}
FROM @STAGE_638923328992788100/${IMPORTNAME}`;
    EXEC(`${SQLSTRING}`);
$$;
Copy

모범 사례

  • 동적 BULK INSERT 문에서 생성된 PUT 명령을 추출하여 프로시저를 호출하기 전에 실행합니다.

  • 추가 지원이 필요한 경우 snowconvert-support@snowflake.com으로 이메일을 보내주세요.

SSC-EWI-TS0034

누락된 기호로 인해 RETURNS 절이 불완전합니다

심각도

높음

설명

이 EWI는 CREATE FUNCTIONRETURNS TABLE 절을 올바르게 생성할 수 없는 경우 출력 코드에 추가됩니다. 이는 결과 RETURNS TABLE 절에 지정해야 하는 열을 SnowConvert AI가 유추할 수 없어 RETURNS TABLE 절이 비어 있는 경우에 발생합니다.

코드 예제

입력 코드:
 CREATE FUNCTION Sales.ufn_SalesByStore2()
RETURNS TABLE
AS
RETURN
(
  WITH CTE AS (
  SELECT DepartmentID, Name, GroupName
  FROM HumanResources.Department
  )
  SELECT tab.* FROM CTE tab
);

GO

SELECT * FROM GetDepartmentInfo();
Copy
생성된 코드:
 --** SSC-FDM-0007 - MISSING DEPENDENT OBJECT "HumanResources.Department" **
CREATE OR REPLACE FUNCTION Sales.ufn_SalesByStore2 ()
RETURNS TABLE(
  DepartmentID STRING /*** SSC-FDM-TS0012 - INFORMATION FOR THE COLUMN DepartmentID WAS NOT FOUND. STRING DATATYPE USED TO MATCH CAST AS STRING OPERATION ***/,
  Name STRING /*** SSC-FDM-TS0012 - INFORMATION FOR THE COLUMN Name WAS NOT FOUND. STRING DATATYPE USED TO MATCH CAST AS STRING OPERATION ***/,
  GroupName STRING /*** SSC-FDM-TS0012 - INFORMATION FOR THE COLUMN GroupName WAS NOT FOUND. STRING DATATYPE USED TO MATCH CAST AS STRING OPERATION ***/
)
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "transact",  "convertedOn": "07/14/2025",  "domain": "no-domain-provided" }}'
AS
$$
  --** SSC-PRF-TS0001 - PERFORMANCE WARNING - RECURSION FOR CTE NOT CHECKED. MIGHT REQUIRE RECURSIVE KEYWORD **
    WITH CTE AS (
    SELECT
      DepartmentID,
      Name,
      GroupName
    FROM
      HumanResources.Department
    )
    SELECT tab.* FROM
    CTE tab
$$;

--** SSC-FDM-0007 - MISSING DEPENDENT OBJECT "GetDepartmentInfo" **

SELECT
    *
FROM
    TABLE(GetDepartmentInfo());
Copy

모범 사례

  • 이 문제의 원인은 다양할 수 있습니다. 코드에 필요한 모든 오브젝트를 포함해야 합니다. 마이그레이션에서 필요한 모든 오브젝트에 액세스할 수 있음에도 문제가 지속되는 경우 구체적인 시나리오에 대한 정보와 함께 당사에 문의합니다.

  • 추가 지원이 필요한 경우 snowconvert-support@snowflake.com으로 이메일을 보내주세요.

SSC-EWI-TS0035

초기화되지 않은 커서 변수 선언은 지원되지 않습니다.

심각도

Medium

참고

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

설명

현재, 선언되었지만 초기화되지 않은 커서 변수는 SnowFlake에서 지원되지 않습니다. 따라서 이 EWI가 추가되고 코드가 주석 처리됩니다.

코드 예제

입력 코드:
 CREATE OR ALTER PROCEDURE notInitializedCursorTest
AS
BEGIN
    -- Should be marked with SSC-EWI-TS0035
    DECLARE @MyCursor CURSOR, @MyCursor2 CURSOR;
    -- Should not be marked
    DECLARE cursorVar CURSOR FORWARD_ONLY STATIC READ_ONLY
        FOR
        SELECT someCol
        FROM someTable;
    RETURN 'DONE';
END;
Copy
생성된 코드:
 CREATE OR REPLACE PROCEDURE notInitializedCursorTest ()
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"transact"}}'
EXECUTE AS CALLER
AS
$$
    DECLARE
        -- Should be marked with SSC-EWI-TS0035
        !!!RESOLVE EWI!!! /*** SSC-EWI-TS0035 - CURSOR VARIABLE DECLARED BUT NEVER INITIALIZED, THIS IS NOT SUPPORTED IN SNOWFLAKE SCRIPTING ***/!!!
        MYCURSOR CURSOR;
        !!!RESOLVE EWI!!! /*** SSC-EWI-TS0035 - CURSOR VARIABLE DECLARED BUT NEVER INITIALIZED, THIS IS NOT SUPPORTED IN SNOWFLAKE SCRIPTING ***/!!!
        MYCURSOR2 CURSOR;
        -- Should not be marked
        cursorVar CURSOR
        FOR
            SELECT
                someCol
            FROM
                someTable;
    BEGIN
         
         
        RETURN 'DONE';
    END;
$$;
Copy

모범 사례

SSC-EWI-TS0036

Snowflake Scripting은 로컬 커서만 지원합니다.

심각도

Medium

참고

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

설명

이 EWI는 로컬 커서 이외의 커서가 식별되는 경우에 추가됩니다. 현재, Snowflake Scripting은 로컬 커서만 지원합니다. 따라서 모든 커서는 로컬 커서로 변환됩니다.

코드 예제

입력 코드:
 CREATE OR ALTER PROCEDURE globalCursorTest
AS
BEGIN
    -- Should be marked with SSC-EWI-TS0036
    DECLARE MyCursor CURSOR GLOBAL STATIC READ_ONLY
        FOR
        SELECT *
        FROM exampleTable;
    -- Should not be marked
    DECLARE MyCursor2 CURSOR LOCAL STATIC READ_ONLY
        FOR
        SELECT testCol
        FROM myTable;
    RETURN 'DONE';
END;
Copy
 CREATE OR REPLACE PROCEDURE globalCursorTest ()
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"transact"}}'
EXECUTE AS CALLER
AS
$$
    DECLARE
        -- Should be marked with SSC-EWI-TS0036
        !!!RESOLVE EWI!!! /*** SSC-EWI-TS0036 - SNOWFLAKE SCRIPTING ONLY SUPPORTS LOCAL CURSORS ***/!!!
        MyCursor CURSOR
        FOR
            SELECT
                *
            FROM
                exampleTable;
        -- Should not be marked
        MyCursor2 CURSOR
        FOR
            SELECT
                testCol
            FROM
                myTable;
    BEGIN
         
         
        RETURN 'DONE';
    END;
$$;
Copy
 
Copy

모범 사례

SSC-EWI-TS0037

Snowflake Scripting 커서는 스크롤할 수 없습니다.

심각도

Medium

참고

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

설명

Snowflake Scripting 커서는 스크롤할 수 없습니다. 현재는 FETCH NEXT만 지원됩니다.

코드 예제

입력 코드:
 CREATE OR ALTER PROCEDURE scrollablecursorTest
AS
BEGIN
    -- Should be marked with SSC-EWI-TS0037
    DECLARE CursorVar CURSOR SCROLL STATIC READ_ONLY
	FOR  
	SELECT FirstName
	FROM vEmployee;
    -- Should not be marked
    DECLARE CursorVar2 CURSOR STATIC READ_ONLY
	FOR  
	SELECT FirstName
	FROM vEmployee;
    DECLARE CursorVar3 CURSOR FORWARD_ONLY STATIC READ_ONLY
	FOR  
	SELECT FirstName
	FROM vEmployee;
    RETURN 'DONE';
END;
Copy
생성된 코드:
 CREATE OR REPLACE PROCEDURE scrollablecursorTest ()
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"transact"}}'
EXECUTE AS CALLER
AS
$$
	DECLARE
		-- Should be marked with SSC-EWI-TS0037
		!!!RESOLVE EWI!!! /*** SSC-EWI-TS0037 - SNOWFLAKE SCRIPTING CURSORS ARE NON-SCROLLABLE, ONLY FETCH NEXT IS SUPPORTED ***/!!!
		CursorVar CURSOR
		FOR
			SELECT
				FirstName
			FROM
				vEmployee;
		-- Should not be marked
		CursorVar2 CURSOR
		FOR
			SELECT
				FirstName
			FROM
				vEmployee;
		CursorVar3 CURSOR
		FOR
			SELECT
				FirstName
			FROM
				vEmployee;
	BEGIN
		 
		 
		 
		RETURN 'DONE';
	END;
$$;
Copy

모범 사례

SSC-EWI-TS0039

동일한 커서에 대한 여러 SET 문이 발견되었습니다.

심각도

Medium

설명

이 EWI는 동일한 커서에 대해 여러 SET 문이 발견되는 경우에 추가됩니다. 모든 추가 SET 문도 주석 처리됩니다. 이는 Snowflake Scripting에서는 동일한 커서에 대해 여러 SET 문을 사용하는 것이 유효하지 않기 때문에 발생합니다.

코드 예시:

이 EWI는 동일한 커서에 대해 여러 SET 문이 발견되는 경우에 추가됩니다. 모든 추가 SET 문도 주석 처리됩니다. 이는 Snowflake Scripting에서는 동일한 커서에 대해 여러 SET 문을 사용하는 것이 유효하지 않기 때문에 발생합니다.

코드 예시:

입력 코드:
 CREATE OR ALTER PROCEDURE multipleSetExample
AS
BEGIN
    DECLARE @MyCursor CURSOR;
    DECLARE @MyCursor2 CURSOR STATIC READ_ONLY
	FOR  
	SELECT FirstName
	FROM vEmployee;
    DECLARE @MyCursor3 CURSOR;
    
    SET @MyCursor = CURSOR STATIC READ_ONLY
        FOR
        SELECT col3
        FROM defaultTable;
        
    SET @MyCursor3 = CURSOR STATIC READ_ONLY
    FOR
    SELECT *
    FROM someTable;
    
    SET @MyCursor = CURSOR DYNAMIC
        FOR
        SELECT col2
        FROM exampleTable;
        
    SET @MyCursor2 = CURSOR STATIC READ_ONLY
        FOR
        SELECT col3
        FROM defaultTable;
        
    RETURN 'DONE';
END;
Copy
생성된 코드:
 CREATE OR REPLACE PROCEDURE multipleSetExample ()
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"transact"}}'
EXECUTE AS CALLER
AS
$$
	DECLARE
		MYCURSOR CURSOR
		FOR
			SELECT col3
			FROM defaultTable;
		MYCURSOR2 CURSOR
		FOR
			SELECT
				FirstName
			FROM
				vEmployee;
		MYCURSOR3 CURSOR
		FOR
			SELECT *
			FROM someTable;
	BEGIN
		 
		 
		 
		 
		 
		DECLARE
		MYCURSOR CURSOR
		FOR
			SELECT col3
			FROM defaultTable;
		MYCURSOR2 CURSOR
		FOR
			SELECT
				FirstName
			FROM
				vEmployee;
		MYCURSOR3 CURSOR
		FOR
			SELECT *
			FROM someTable;
	BEGIN
		 
		 
		 
		 
		 
		!!!RESOLVE EWI!!! /*** SSC-EWI-0040 - THE 'SET CURSOR' CLAUSE IS NOT SUPPORTED IN SNOWFLAKE ***/!!!!!!RESOLVE EWI!!! /*** SSC-EWI-TS0039 - CURSOR VARIABLE MYCURSOR SET MULTIPLE TIMES, THIS IS NOT VALID IN SNOWFLAKE SCRIPTING ***/!!!

		SET @MyCursor = CURSOR DYNAMIC
		    FOR
		    SELECT col2
		    FROM exampleTable;
		!!!RESOLVE EWI!!! /*** SSC-EWI-0040 - THE 'SET CURSOR' CLAUSE IS NOT SUPPORTED IN SNOWFLAKE ***/!!!!!!RESOLVE EWI!!! /*** SSC-EWI-TS0039 - CURSOR VARIABLE MYCURSOR2 SET MULTIPLE TIMES, THIS IS NOT VALID IN SNOWFLAKE SCRIPTING ***/!!!

    SET @MyCursor2 = CURSOR STATIC READ_ONLY
        FOR
        SELECT col3
        FROM defaultTable;
		RETURN 'DONE';
	END;
$$;
Copy

모범 사례

SSC-EWI-TS0041

XML 데이터 타입 메서드는 Snowflake에서 지원되지 않습니다.

심각도

Medium

설명

이 EWI는 Snowflake SQL에서 지원되지 않는 다음의 XML 데이터 타입 메서드에 추가됩니다.

  • 쿼리

  • 존재

  • 수정

  • 노드

코드 예제

입력 코드:
 CREATE PROCEDURE xml_procedure
    @inUserGroupsXML XML
AS
BEGIN
    SELECT  entities.entity.value('TypeID[1]', 'VARCHAR(100)') AS TypeID
        ,entities.entity.value('Name[1]', 'VARCHAR(100)') AS Name
    INTO  #tmpUserGroups
    FROM  @inUserGroupsXML.nodes('/entities/entity') entities(entity)
END;
Copy
생성된 코드:
 CREATE OR REPLACE PROCEDURE xml_procedure (INUSERGROUPSXML TEXT)
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"transact"}}'
EXECUTE AS CALLER
AS
$$
    BEGIN
        CREATE OR REPLACE TEMPORARY TABLE T_tmpUserGroups AS
            SELECT
                XMLGET(entity, '$') :: VARCHAR(100) AS TypeID
                ,
                XMLGET(entity, '$') :: VARCHAR(100) AS Name
            FROM
                !!!RESOLVE EWI!!! /*** SSC-EWI-TS0041 - XML TYPE METHOD nodes IS NOT SUPPORTED IN SNOWFLAKE ***/!!!
                T_inUserGroupsXML('/entities/entity') entities (
                    entity
                );
    END;
$$;
Copy

모범 사례

  • 소스 코드의 동작을 에뮬레이트하기 위해 UDFs를 사용합니다.

  • 이 설명서를 참조하여 Snowflake에서 XML을 사용할 수 있는 몇 가지 방식을 검토할 수 있습니다.

  • 추가 지원이 필요한 경우 snowconvert-support@snowflake.com으로 이메일을 보내주세요.

SSC-EWI-TS0043

WITH XMLNAMESPACES는 Snowflake에서 지원되지 않습니다.

심각도

Medium

참고

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

설명

이 EWI는 Snowflake SQL에서 지원되지 않는 WITHXMLNAMESPACES 절에 추가됩니다.

코드 예제

입력 코드:
 WITH XMLNAMESPACES ('uri' as ns1)
SELECT ProductID as 'ns1:ProductID',
Name      as 'ns1:Name',
Color     as 'ns1:Color'
FROM Production.Product
WHERE ProductID = 316
FOR XML RAW, ELEMENTS XSINIL
Copy
생성된 코드:
 --** SSC-PRF-TS0001 - PERFORMANCE WARNING - RECURSION FOR CTE NOT CHECKED. MIGHT REQUIRE RECURSIVE KEYWORD **
WITH
     !!!RESOLVE EWI!!! /*** SSC-EWI-TS0043 - WITH XMLNAMESPACES IS NOT SUPPORTED IN SNOWFLAKE ***/!!!
 XMLNAMESPACES ('uri' as VARIANT !!!RESOLVE EWI!!! /*** SSC-EWI-TS0015 - DATA TYPE NS1 IS NOT SUPPORTED IN SNOWFLAKE ***/!!! NOT NULL)
SELECT
ProductID AS "ns1:ProductID",
Name AS "ns1:Name",
Color AS "ns1:Color"
FROM
Production.Product
WHERE
ProductID = 316
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0044 - FOR XML RAW CLAUSE IS NOT SUPPORTED IN SNOWFLAKE ***/!!!
FOR XML RAW, ELEMENTS XSINIL;
Copy

모범 사례

  • 소스 코드의 동작을 에뮬레이트하기 위해 UDFs를 사용합니다. 다음 코드는 원래 동작을 다시 만드는 데 사용할 수 있는 UDFs를 제안합니다.

SQL 서버
 CREATE  TABLE PRODUCT (ProductID INTEGER, Name VarChar(20), Color VarChar(20));
INSERT INTO PRODUCT(PRODUCTID, NAME, COLOR) VALUES(1,'UMBRELLA','RED');
INSERT INTO PRODUCT(PRODUCTID, NAME, COLOR) VALUES(2,'SHORTS','BLUE');
INSERT INTO PRODUCT(PRODUCTID, NAME, COLOR) VALUES(3,'BALL','YELLOW');

WITH XMLNAMESPACES ('uri' as ns1)  
SELECT ProductID as 'ns1:ProductID',  
       Name      as 'ns1:Name',  
       Color     as 'ns1:Color'  
FROM Product  
FOR XML RAW
Copy
Snowflake SQL
 CREATE OR REPLACE TABLE PRODUCT (
       ProductID INTEGER,
       Name VARCHAR(20),
       Color VARCHAR(20))
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "transact",  "convertedOn": "07/12/2024" }}'
;

INSERT INTO PRODUCT (PRODUCTID, NAME, COLOR) VALUES(1,'UMBRELLA','RED');
INSERT INTO PRODUCT (PRODUCTID, NAME, COLOR) VALUES(2,'SHORTS','BLUE');
INSERT INTO PRODUCT (PRODUCTID, NAME, COLOR) VALUES(3,'BALL','YELLOW');

--** SSC-PRF-TS0001 - PERFORMANCE WARNING - RECURSION FOR CTE NOT CHECKED. MIGHT REQUIRE RECURSIVE KEYWORD **

WITH
     !!!RESOLVE EWI!!! /*** SSC-EWI-TS0043 - WITH XMLNAMESPACES IS NOT SUPPORTED IN SNOWFLAKE ***/!!! XMLNAMESPACES ('uri' as ns1)
SELECT
       ProductID AS "ns1:ProductID",
       Name AS "ns1:Name",
       Color AS "ns1:Color"
FROM
       Product
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0044 - FOR XML RAW CLAUSE IS NOT SUPPORTED IN SNOWFLAKE ***/!!!
FOR XML RAW;
Copy

관련 EWI

  1. SSC-PRF-TS0001: 성능 경고 - CTE에 대한 재귀가 확인되지 않았습니다. 재귀 키워드가 필요할 수 있습니다.

  2. SSC-EWI-TS0044: FOR XML 절은 Snowflake에서 지원되지 않습니다.

  3. SSC-EWI-TS0015: Snowflake에서 지원되지 않는 데이터 타입

SSC-EWI-TS0044

FOR XML 절은 Snowflake에서 지원되지 않습니다.

심각도

중요

참고

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

설명

이 EWI는 Snowflake SQL에서 지원되지 않는 FOR XML 절에 추가됩니다.

코드 예제

입력 코드:
 SELECT TOP 1 LastName
FROM AdventureWorks2019.Person.Person
FOR XML AUTO;
Copy
생성된 코드:
 SELECT TOP 1
LastName
FROM
AdventureWorks2019.Person.Person
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0044 - FOR XML AUTO CLAUSE IS NOT SUPPORTED IN SNOWFLAKE ***/!!!
FOR XML AUTO;
Copy

모범 사례

  • 소스 코드의 동작을 에뮬레이트하기 위해 UDFs를 사용합니다. 다음 코드는 원래 동작을 다시 만드는 데 사용할 수 있는 UDFs를 제안합니다.

SQL 서버

쿼리
 CREATE TABLE TEMPTABLE (Ref INT, Des NVARCHAR(100), Qty INT)

INSERT INTO tempTable VALUES (100001, 'Normal', 1), (100002, 'Foobar', 1), (100003, 'Hello World', 2)

GO

-- FOR XML
SELECT *
FROM TempTable
FOR XML AUTO

GO
 
-- FOR XML RAW
SELECT *
FROM TempTable
FOR XML RAW
Copy
결과
 -- FOR XML
<TempTable Ref="100001" Des="Normal" Qty="1"/><TempTable Ref="100002" Des="Foobar" Qty="1"/><TempTable Ref="100003" Des="Hello World" Qty="2"/>

-- FOR XML RAW
<row Ref="100001" Des="Normal" Qty="1"/><row Ref="100002" Des="Foobar" Qty="1"/><row Ref="100003" Des="Hello World" Qty="2"/>
Copy
Snowflake
쿼리
 CREATE OR REPLACE TABLE TEMPTABLE (
Ref INT,
Des VARCHAR(100),
Qty INT
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"transact"}}'
;

INSERT INTO tempTable VALUES (100001, 'Normal', 1), (100002, 'Foobar', 1), (100003, 'Hello World', 2);

-- FOR XML
SELECT
*
FROM
TempTable
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0044 - FOR XML AUTO CLAUSE IS NOT SUPPORTED IN SNOWFLAKE ***/!!!
FOR XML AUTO;

-- FOR XML RAW
SELECT
*
FROM
TempTable
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0044 - FOR XML RAW CLAUSE IS NOT SUPPORTED IN SNOWFLAKE ***/!!!
FOR XML RAW;
Copy
결과
 -- FOR XML
<TempTable DES="Normal" QTY="1" REF="100001"  /><TempTable DES="Foobar" QTY="1" REF="100002"  /><TempTable DES="Hello World" QTY="2" REF="100003"  />

-- FOR XML RAW
<row DES="Normal" QTY="1" REF="100001"  /><row DES="Foobar" QTY="1" REF="100002"  /><row DES="Hello World" QTY="2" REF="100003"  />
Copy

SSC-EWI-TS0045

레이블이 지정된 문은 Snowflake Scripting에서 지원되지 않습니다.

심각도

낮음

참고

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

설명

이 EWI는 SQL Server에서 GOTO 문과 함께 사용되는 모든 LABELS에 추가됩니다.

코드 예제

입력 코드:
 CREATE PROCEDURE GoToProcedure
AS
BEGIN
DECLARE @TotalMaarks INT
SET @TotalMaarks = 49
IF @TotalMaarks >= 50
    GOTO Pass
IF @TotalMaarks < 50
    GOTO Fail
Pass:
    SELECT 1;
    SELECT * FROM TABLE1;
    RETURN 1;
Fail:
    SELECT 2;
    SELECT * FROM TABLE2;
    RETURN 2;
END
Copy
생성된 코드:
 CREATE OR REPLACE PROCEDURE GoToProcedure ()
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"transact"}}'
EXECUTE AS CALLER
AS
$$
    DECLARE
        TOTALMAARKS INT;
    BEGIN
         
        TOTALMAARKS := 49;
        IF (:TOTALMAARKS >= 50) THEN
            !!!RESOLVE EWI!!! /*** SSC-EWI-0073 - PENDING FUNCTIONAL EQUIVALENCE REVIEW FOR 'GOTO' NODE ***/!!!
            GOTO Pass
        END IF;
        IF (:TOTALMAARKS < 50) THEN
            !!!RESOLVE EWI!!! /*** SSC-EWI-0073 - PENDING FUNCTIONAL EQUIVALENCE REVIEW FOR 'GOTO' NODE ***/!!!
            GOTO Fail
        END IF;
        !!!RESOLVE EWI!!! /*** SSC-EWI-TS0045 - LABELED STATEMENT IS NOT SUPPORTED IN SNOWFLAKE SCRIPTING ***/!!!
        Pass:
        SELECT 1;
    SELECT
            *
        FROM
            TABLE1;
        RETURN 1;

        !!!RESOLVE EWI!!! /*** SSC-EWI-TS0045 - LABELED STATEMENT IS NOT SUPPORTED IN SNOWFLAKE SCRIPTING ***/!!!
        Fail:
        SELECT 2;
    SELECT
            *
        FROM
            TABLE2;
        RETURN 2;

    END;
$$;
Copy

모범 사례

관련 EWI

  1. SSC-EWI-0073: 기능적 동등성 검토가 보류 중입니다.

SSC-EWI-TS0046

시스템 테이블은 Snowflake에서 지원되지 않습니다.

심각도

Medium

설명

이 EWI는 Snowflake SQL에서 지원되지 않거나 동등한 기능이 없는 SQL Server 시스템 테이블을 참조하는 경우에 추가됩니다. 지원되는 시스템 테이블과 지원되지 않는 시스템 테이블의 전체 목록을 보려면 여기를 클릭하세요.

코드 예제

입력 코드:
 SELECT *
FROM 
    sys.all_sql_modules
WHERE 
    [STATE] = 0; -- state must be ONLINE
Copy
생성된 코드:
 SELECT
    *
FROM
    !!!RESOLVE EWI!!! /*** SSC-EWI-TS0046 - SYSTEM TABLE sys.all_sql_modules IS NOT SUPPORTED IN SNOWFLAKE ***/!!!
    sys.all_sql_modules
WHERE
    STATE = 0; -- state must be ONLINE
Copy

모범 사례

SSC-EWI-TS0047

RAISERROR 오류 메시지는 SQL Server 문자열 형식으로 인해 다를 수 있습니다.

참고

이 EWI는 더 이상 사용되지 않습니다. SSC-FDM-TS0019 설명서를 참조하세요.

심각도

낮음

설명

이 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
		!!!RESOLVE EWI!!! /*** SSC-EWI-TS0047 - RAISERROR ERROR MESSAGE MAY DIFFER BECAUSE OF THE SQL SERVER STRING FORMAT ***/!!!
		SELECT
			RAISERROR_UDF('This is a sample error message with the first parameter %d and the second parameter %*.*s',
			10,
			1, array_construct(
			123,
7,
7,
'param2'));
	END;
$$;
Copy

모범 사례

SSC-EWI-TS0049

여러 라인 If 본문 변환은 향후 제공될 예정입니다.

참고

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

심각도

Medium

설명

IF 문 본문에 Begin ... End 블록이 포함된 대부분의 경우는 지원됩니다. 이는 성공적인 시나리오입니다( SSC-EWI-TS0049가 발생하지 않음).

코드 예제

입력 코드:
 CREATE OR ALTER FUNCTION [PURCHASING].[FOO](@status INT)
Returns INT
As
Begin
    declare @result as int = 10;
    SELECT @result = quantity FROM TABLE1 WHERE COL1 = @status;
    IF @result = 3
    BEGIN
        IF @result>0 SELECT @result=0  ELSE SELECT @result=1
        SELECT @result = 1 
    END
    return @result;
End
Copy
생성된 코드:
 !!!RESOLVE EWI!!! /*** SSC-EWI-0068 - USER DEFINED FUNCTION WAS TRANSFORMED TO SNOWFLAKE PROCEDURE ***/!!!
--** SSC-FDM-0007 - MISSING DEPENDENT OBJECT "TABLE1" **
CREATE OR REPLACE PROCEDURE PURCHASING.FOO (STATUS INT)
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "transact",  "convertedOn": "07/14/2025",  "domain": "no-domain-provided" }}'
EXECUTE AS CALLER
AS
$$
    DECLARE
        RESULT INT := 10;
    BEGIN
         
        SELECT
            quantity
        INTO
            :RESULT
        FROM
            TABLE1
        WHERE
            COL1 = :STATUS;
        IF (:RESULT = 3) THEN
            BEGIN
                IF (:RESULT >0) THEN SELECT
                        0
                    INTO
                        :RESULT;
                ELSE
                    SELECT
                        1
                    INTO
                        :RESULT;
                END IF;
        SELECT
                    1
                INTO
                    :RESULT;
            END;
        END IF;
        RETURN :RESULT;
    END;
$$;
Copy

참고

일반 코드 예제(위의 예제와 같이)에서는 변환이 성공적으로 수행됩니다. 그러나 “IF” 문은 변환되지 않으며 EWI가 생성됩니다.

수동 지원

케이스 1: 단일 문

이러한 경우에는 변환된 문이 SELECT 절에 나타나므로 변환이 간단합니다.

 IF @result = 0
BEGIN 
    SET @result =1
END
Copy
 CASE WHEN (SELECT RESULT FROM CTE2)= 0 THEN
( SELECT 1 AS RESULT )
Copy
케이스 2: 여러 개의 문

여러 문이 변환되는 경우 N개의 문을 변환하고 이를 N+1개 문의 소스 테이블로 사용해야 합니다.

 IF @result = 0
BEGIN 
    Statement1
    Statement2
    Statement3
END
Copy
 CASE WHEN (SELECT RESULT FROM CTE2)= 0 THEN
(
    SELECT TransformedStatement3
    FROM (
        SELECT TransformedStatement2
        FROM (
            SELECT TransformedStatement1
        ) T1
    ) T2
)
Copy
케이스 3: 여러 세트 문

이러한 경우 각 세트 문에 대해 변환을 복제해야 합니다.

 IF @result = 0
BEGIN 
    SET @var1 = 1
    SET @var2 = 3
    SET @var3 = @var2
END
Copy
 WITH CTE1 AS (
    SELECT 
        CASE WHEN (SELECT
                        RESULT
                    FROM
                        CTE0) = 0 THEN
        (SELECT 1) AS VAR1)
WITH CTE2 AS (
    SELECT
        CASE WHEN (SELECT
                        RESULT
                    FROM
                        CTE0)= 0 THEN
        (SELECT 3) AS VAR2)
WITH CTE3 AS (
    SELECT
        CASE WHEN (SELECT
                        RESULT
                    FROM
                        CTE0)= 0 THEN
        (SELECT T1.VAR2 
        FROM ((SELECT 3) AS VAR2) AS T1) AS VAR3) 
...
Copy

모범 사례

SSC-EWI-TS0055

기본 제약 조건이 주석 처리되어 테이블 정의에 추가되었을 수 있습니다.

참고

이 EWI는 더 이상 사용되지 않습니다. SSC-FDM-TS0020 설명서를 참조하세요.

심각도

Medium

설명

이 EWI은 Alter Table 문에 기본 제약 조건이 있는 경우에 추가됩니다.

현재, 해당 제약 조건은 지원되지 않습니다. 이를 변환하는 데 사용할 수 있는 해결 방법은 Alter Table 사용 전에 테이블을 정의하는 것입니다. 그러면 참조를 식별하고 기본 제약 조건이 테이블 정의에 통합됩니다. 해당 작업을 하지 않은 경우 제약 조건이 주석으로만 처리됩니다.

코드 예제

입력 코드:
 CREATE TABLE table1(
  col1 integer,
  col2 varchar collate Latin1_General_CS,
  col3 date
);

ALTER TABLE table1
ADD col4 integer,
  CONSTRAINT col1_constraint DEFAULT 50 FOR col1,
  CONSTRAINT col1_constraint DEFAULT 30 FOR col1;
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,
  CONSTRAINT col1_constraint
                             !!!RESOLVE EWI!!! /*** SSC-EWI-TS0055 - DEFAULT CONSTRAINT MAY HAVE BEEN ADDED TO TABLE DEFINITION ***/!!!
                             DEFAULT 50 FOR col1,
  CONSTRAINT col1_constraint
                             !!!RESOLVE EWI!!! /*** SSC-EWI-TS0055 - DEFAULT CONSTRAINT MAY HAVE BEEN ADDED TO TABLE DEFINITION ***/!!!
                             DEFAULT 30 FOR col1;
Copy

참고

Alter Table의 모든 내용이 유효하지 않은 경우 Alter Table이 주석 처리됩니다.

Known Issues

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

모범 사례

SSC-EWI-TS0056

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

참고

이 EWI는 더 이상 사용되지 않습니다. SSC-FDM-TS0021 설명서를 참조하세요.

심각도

낮음

참고

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

설명

이 EWI는 Alter Table 문에 MASKED WITH 절이 포함된 경우에 추가됩니다. MASKED WITH 함수를 대체하기 위해 대략적인 MASKING POLICY가 생성되었음을 알리기 위해 추가됩니다.

코드 예제

입력 코드:
 ALTER TABLE table_name
ALTER COLUMN column_name
ADD MASKED WITH (FUNCTION = 'default()');
Copy
생성된 코드:
 !!!RESOLVE EWI!!! /*** SSC-EWI-TS0057 - MASKING ROLE MUST BE DEFINED PREVIOUSLY BY THE USER ***/!!!
CREATE OR REPLACE MASKING POLICY "default" AS
(val STRING)
RETURNS STRING ->
CASE
WHEN current_role() IN ('YOUR_DEFINED_ROLE_HERE')
THEN val
ELSE 'xxxxx'
END;

ALTER TABLE IF EXISTS table_name MODIFY COLUMN column_name!!!RESOLVE EWI!!! /*** SSC-EWI-TS0056 - A MASKING POLICY WAS CREATED AS SUBSTITUTE FOR MASKED WITH ***/!!!  SET MASKING POLICY "default";
Copy

참고

MASKING POLICY는 ALTER TABLE 문보다 먼저 생성됩니다. 그리고 대략적인 동작이 있을 것으로 예상됩니다. 역할 및 사용자 권한과 관련하여 약간의 조정이 필요할 수 있습니다. <!– TODO: You can relate to Broken link broken-reference “mention” for further details.>

모범 사례

SSC-EWI-TS0057

사용자는 미리 마스킹 역할을 정의해야 합니다.

참고

이 EWI는 더 이상 사용되지 않습니다. SSC-FDM-TS0022 설명서 설명서를 참조하세요.

심각도

낮음

참고

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

설명

이 EWI는 MASKING POLICY가 생성되고 데이터 마스킹이 올바르게 작동할 수 있도록 역할 또는 권한을 연결해야 하는 경우에 발생합니다.

코드 예제

입력 코드
 ALTER TABLE tableName
ALTER COLUMN columnName
ADD MASKED WITH (FUNCTION = 'partial(1, "xxxxx", 1)');
Copy
생성된 코드:
 !!!RESOLVE EWI!!! /*** SSC-EWI-TS0057 - MASKING ROLE MUST BE DEFINED PREVIOUSLY BY THE USER ***/!!!
CREATE OR REPLACE MASKING POLICY "partial_1_xxxxx_1" AS
(val STRING)
RETURNS STRING ->
CASE
WHEN current_role() IN ('YOUR_DEFINED_ROLE_HERE')
THEN val
ELSE LEFT(val, 1) || 'xxxxx' || RIGHT(val, 1)
END;

ALTER TABLE IF EXISTS tableName MODIFY COLUMN columnName!!!RESOLVE EWI!!! /*** SSC-EWI-TS0056 - A MASKING POLICY WAS CREATED AS SUBSTITUTE FOR MASKED WITH ***/!!!  SET MASKING POLICY "partial_1_xxxxx_1";
Copy

참고

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

모범 사례

SSC-EWI-TS0060

날짜 및 시간 간격은 Snowflake에서 지원되지 않습니다.

심각도

Medium

설명

이 EWI는 Snowflake에서 지원되지 않아 다음 시간 부분 중 하나가 날짜 관련 함수의 매개 변수로 사용되는 경우에 추가됩니다. 자세한 내용은 ‘지원되는 날짜 및 시간 부분(날짜 및 시간 함수 | Snowflake 설명서)을 참조하세요.

코드 예제

입력 코드
 SELECT
    -- Supported
    DATEPART(second, getdate()),
    -- Not supported
    DATEPART(millisecond, getdate()),
    DATEPART(microsecond, getdate());
Copy
생성된 코드:
 SELECT
    -- Supported
    DATE_PART(second, CURRENT_TIMESTAMP() :: TIMESTAMP),
    -- Not supported
    !!!RESOLVE EWI!!! /*** SSC-EWI-TS0060 - TIME PART 'millisecond' NOT SUPPORTED AS A FUNCTION PARAMETER ***/!!!
    DATEPART(millisecond, CURRENT_TIMESTAMP() :: TIMESTAMP),
    !!!RESOLVE EWI!!! /*** SSC-EWI-TS0060 - TIME PART 'microsecond' NOT SUPPORTED AS A FUNCTION PARAMETER ***/!!!
    DATEPART(microsecond, CURRENT_TIMESTAMP() :: TIMESTAMP);
Copy

모범 사례

  • UDF를 생성하여 Snowflake에서 지원되지 않는 시간 부분을 수동으로 추출할 수 있습니다.

  • 추가 지원이 필요한 경우 snowconvert-support@snowflake.com으로 이메일을 보내주세요.

SSC-EWI-TS0061

ALTER COLUMN은 지원되지 않습니다

심각도

Medium

참고

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

설명

이 EWI는 지원되지 않는 ALTER COLUMN 문이 있을 때마다 추가됩니다.

코드 예제

입력 코드:
 ALTER TABLE SampleTable
ALTER COLUMN SampleColumn INT NULL SPARSE;
Copy
생성된 코드:
 ALTER TABLE IF EXISTS SampleTable
ALTER COLUMN SampleColumn
                          !!!RESOLVE EWI!!! /*** SSC-EWI-TS0061 - ALTER COLUMN COMMENTED OUT BECAUSE SPARSE COLUMN IS NOT SUPPORTED IN SNOWFLAKE ***/!!!
                          INT NULL SPARSE;
Copy

모범 사례

SSC-EWI-TS0063

Snowflake에서 지원되지 않는 타임존입니다.

심각도

중요

설명

이 EWI는 Snowflake에서 지원되지 않는 타임존이 있는 경우에 추가됩니다.

코드 예제

입력 코드:
 SELECT current_timestamp at time zone 'Turks And Caicos Standard Time';
Copy
생성된 코드:
 SELECT
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0063 - TIME ZONE NOT SUPPORTED IN SNOWFLAKE ***/!!!
CURRENT_TIMESTAMP() at time zone 'Turks And Caicos Standard Time'
                                                                 ;
Copy

모범 사례

  • 여러 타임존을 지원하기 위해 사용자 정의 함수를 만들 수 있습니다.

  • 추가 지원이 필요한 경우 snowconvert-support@snowflake.com으로 이메일을 보내주세요.

SSC-EWI-TS0067

OPENXML 테이블 반환 함수에 유효하지 않은 매개 변수가 있습니다.

심각도

중요

참고

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

설명

이 EWI는 OPENXML에 유효하지 않은 매개 변수가 있는 경우, 특히 XML 경로에 액세스할 수 없는 경우에 추가됩니다.

이를 EWI를 방지하려면 매개 변수를 통해 명시적 노드 경로를 전송하세요.

입력 코드:
 SELECT
    *
FROM
    OPENXML (@idoc, @path, 1) WITH (
        CustomerID VARCHAR(10),
        ContactName VARCHAR(20)
    );
Copy
생성된 코드:
 SELECT
    *
FROM
    !!!RESOLVE EWI!!! /*** SSC-EWI-TS0067 - INVALID PARAMETERS IN OPENXML TABLE-VALUED FUNCTION ***/!!!
    OPENXML(@idoc, @path, 1);
Copy
입력 코드(명시적 매개 변수)
 SELECT
    *
FROM
    OPENXML (@idoc, '/ROOT/Customer', 1) WITH(
        CustomerID VARCHAR(10),
        ContactName VARCHAR(20)
    );
Copy
생성된 코드(명시적 매개 변수)
 SELECT
    Left(value:Customer['@CustomerID'], '10') AS 'CustomerID',
    Left(value:Customer['@ContactName'], '20') AS 'ContactName'
FROM
    OPENXML_UDF($idoc, ':ROOT:Customer');
Copy

모범 사례

  • 경로를 매개 변수로 명시적으로 전달할 수 있는지 확인합니다.

  • 추가 지원이 필요한 경우 snowconvert-support@snowflake.com으로 이메일을 보내주세요.

SSC-EWI-TS0070

At Time Zone 문의 CURRENT_TIMESTAMP는 특정 상황에서 다르게 동작할 수 있습니다.

참고

EWI는 더 이상 사용되지 않습니다. SSC-FDM-TS0024 설명서를 참조하세요.

설명

이 EWI는 At Time Zone에 CURRENT_TIMESTAMP가 있는 경우에 추가됩니다. 이는 경우에 따라 결과가 다를 수 있기 때문입니다.

주요 차이점은 SQL Server의 CURRENT_TIMESTAMP는 서버 타임존의 현재 시스템 날짜 및 시간을 반환하며, Snowflake의 CURRENT_TIMESTAMP는 UTC(협정 세계시) 타임존의 현재 날짜 및 시간을 반환합니다.

입력 코드:

Sql Server
 SELECT current_timestamp at time zone 'Hawaiian Standard Time';
Copy
결과

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

생성된 코드:
Snowflake
 SELECT
CONVERT_TIMEZONE('Pacific/Honolulu', CURRENT_TIMESTAMP() !!!RESOLVE EWI!!! /*** SSC-EWI-TS0070 - CURRENT_TIMESTAMP in At Time Zone statement may have a different behavior in certain cases ***/!!!);
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-EWI-TS0072

RETURN 문이 이전 RETURN 문으로 인해 무시됩니다.

심각도

낮음

참고

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

설명

이 EWI는 SELECT 문 및 OUPUT 매개 변수가 반환되는 경우에 추가됩니다. 이 경우 SELECT 문의 결과 세트가 우선시됩니다.

입력 코드:
 CREATE PROCEDURE SOMEPROC(@product_count INT OUTPUT,  @123 INT OUTPUT)
AS
BEGIN
		SELECT * from AdventureWorks.HumanResources.Department;
        SELECT * from AdventureWorks.HumanResources.Employee;
END
Copy
생성된 코드:
--** SSC-FDM-0007 - MISSING DEPENDENT OBJECTS "AdventureWorks.HumanResources.Department", "AdventureWorks.HumanResources.Employee" **
CREATE OR REPLACE PROCEDURE SOMEPROC (PRODUCT_COUNT OUT INT, _123 OUT INT)
RETURNS ARRAY
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "transact",  "convertedOn": "07/16/2025",  "domain": "no-domain-provided" }}'
EXECUTE AS CALLER
AS
$$
	DECLARE
		ProcedureResultSet1 VARCHAR;
		ProcedureResultSet2 VARCHAR;
		return_arr ARRAY := array_construct();
	BEGIN
		ProcedureResultSet1 := 'RESULTSET_' || REPLACE(UPPER(UUID_STRING()), '-', '_');
		CREATE OR REPLACE TEMPORARY TABLE IDENTIFIER(:ProcedureResultSet1) AS
			SELECT
				*
			from
				AdventureWorks.HumanResources.Department;
		return_arr := array_append(return_arr, :ProcedureResultSet1);
		ProcedureResultSet2 := 'RESULTSET_' || REPLACE(UPPER(UUID_STRING()), '-', '_');
		CREATE OR REPLACE TEMPORARY TABLE IDENTIFIER(:ProcedureResultSet2) AS
			SELECT
				*
			from
				AdventureWorks.HumanResources.Employee;
		return_arr := array_append(return_arr, :ProcedureResultSet2);
		--** SSC-FDM-0020 - MULTIPLE RESULT SETS ARE RETURNED IN TEMPORARY TABLES **
		RETURN return_arr;
	END;
$$;
Copy

모범 사례

관련 EWI

  1. SSC-FDM-0020: 여러 결과 세트가 임시 테이블에 반환됩니다.

SSC-EWI-TS0073

Snowflake에서는 오류 메시지가 다를 수 있음

참고

이 EWI는 더 이상 사용되지 않습니다. SSC-FDM-TS0023 설명서를 참조하세요.

심각도

낮음

설명

이 EWI는 ERROR_MESSAGE()의 변환에 추가됩니다. 오류의 정확한 메시지는 Snowflake에서 변경될 수 있습니다.

입력 코드:
 SET @varErrorMessage = ERROR_MESSAGE()
Copy
생성된 코드
 BEGIN
VARERRORMESSAGE := SQLERRM !!!RESOLVE EWI!!! /*** SSC-EWI-TS0073 - ERROR MESSAGE COULD BE DIFFERENT IN SNOWFLAKE ***/!!!;
END;
Copy

권장 사항

추가 지원이 필요한 경우 snowconvert-support@snowflake.com으로 이메일을 보내주세요.

SSC-EWI-TS0074

종속성 누락으로 인해 캐스트 결과가 TRY_CAST 및 TRY_CONVERT 함수와 다를 수 있습니다

심각도

낮음

참고

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

설명

이 EWI는 TRY_CAST 및 TRY_CONVERT 함수 변환 시 추가됩니다. 이러한 함수의 정확한 결과는 종속성 누락으로 인해 Snowflake에서 변경될 수 있습니다(SnowConvert AI가 일부 데이터 타입을 확인할 수 없음). 이는 소스 코드에 종속성이 없기 때문일 수 있습니다.

입력 코드:
 SELECT TRY_CONVERT( INT, col1) FROM TABLE1;

SELECT TRY_CAST(COL1 AS FLOAT) FROM TABLE1
Copy
생성된 코드
 SELECT
CAST(col1 AS INT) /*** SSC-FDM-TS0005 - TRY_CONVERT/TRY_CAST COULD NOT BE CONVERTED TO TRY_CAST ***/!!!RESOLVE EWI!!! /*** SSC-EWI-TS0074 - CAST RESULT MAY BE DIFFERENT FROM TRY_CONVERT FUNCTION DUE TO MISSING DEPENDENCIES ***/!!!
FROM
TABLE1;

SELECT
CAST(COL1 AS FLOAT) /*** SSC-FDM-TS0005 - TRY_CONVERT/TRY_CAST COULD NOT BE CONVERTED TO TRY_CAST ***/!!!RESOLVE EWI!!! /*** SSC-EWI-TS0074 - CAST RESULT MAY BE DIFFERENT FROM TRY_CAST FUNCTION DUE TO MISSING DEPENDENCIES ***/!!!
FROM
TABLE1;
Copy

권장 사항

추가 지원이 필요한 경우 snowconvert-support@snowflake.com으로 이메일을 보내주세요.

SSC-EWI-TS0075

기본 제공 프로시저가 지원되지 않습니다

심각도

Medium

설명

기본 제공 프로시저에 대한 변환은 현재 지원되지 않습니다.

코드 예시

입력 코드:
 EXEC sp_column_privileges_rowset_rmt 'Caption';
Copy
생성된 코드:
 !!!RESOLVE EWI!!! /*** SSC-EWI-TS0075 - TRANSLATION FOR BUILT-IN PROCEDURE 'sp_column_privileges_rowset_rmt' IS NOT CURRENTLY SUPPORTED. ***/!!!
EXEC sp_column_privileges_rowset_rmt 'Caption';
Copy

모범 사례

SSC-EWI-TS0076

기본 매개 변수를 재정렬해야 할 수 있습니다

참고

이 EWI는 더 이상 사용되지 않습니다. SSC-EWI-0002 설명서를 참조하세요.

심각도

Medium

설명

기본 매개 변수를 재정렬해야 할 수도 있습니다. Snowflake는 매개 변수 선언 끝에 있는 기본 매개 변수만 지원합니다.

코드 예시

입력 코드:
 CREATE PROCEDURE MySampleProc
    @Param1 NVARCHAR(50) = NULL,
    @Param2 NVARCHAR(10),
    @Param3 NVARCHAR(10) = NULL,
    @Param4 NVARCHAR(10)
AS   
    SELECT 1;
Copy
생성된 코드:
 !!!RESOLVE EWI!!! /*** SSC-EWI-TS0076 - DEFAULT PARAMETERS MAY NEED TO BE REORDERED. SNOWFLAKE ONLY SUPPORTS DEFAULT PARAMETERS AT THE END OF THE PARAMETERS DECLARATIONS. ***/!!!
CREATE OR REPLACE PROCEDURE MySampleProc (PARAM1 STRING DEFAULT NULL, PARAM2 STRING, PARAM3 STRING DEFAULT NULL, PARAM4 STRING)
RETURNS TABLE()
LANGUAGE SQL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"transact"}}'
EXECUTE AS CALLER
AS
$$
    DECLARE
        ProcedureResultSet RESULTSET;
    BEGIN
        ProcedureResultSet := (
        SELECT 1);
        RETURN TABLE(ProcedureResultSet);
    END;
$$;
Copy

모범 사례

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'
--           !!!RESOLVE EWI!!! /*** SSC-EWI-TS0077 - COLLATION Albanian_BIN NOT SUPPORTED ***/!!!
-- COLLATE Albanian_BIN
                     ;

SELECT 'a'
--           !!!RESOLVE EWI!!! /*** SSC-EWI-TS0077 - COLLATION Albanian_CI_AI NOT SUPPORTED ***/!!!
-- COLLATE Albanian_CI_AI
                       ;

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

모범 사례

SSC-EWI-TS0078

기본값은 Snowflake에서 허용되지 않습니다.

심각도

Medium

설명

이 오류는 함수 호출, 변수 이름 또는 명명된 상수와 같은 식이 기본 옵션 뒤에 올 때 코드에 추가됩니다.

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
                         !!!RESOLVE EWI!!! /*** SSC-EWI-TS0078 - DEFAULT OPTION NOT ALLOWED IN SNOWFLAKE ***/!!!
                         DEFAULT RANDOM(10);
Copy

모범 사례

SSC-EWI-TS0079

데이터베이스 콘솔 명령은 지원되지 않습니다

심각도

Medium

설명

이 EWI은 SnowConvert AI가 입력 코드 내부에서 DBCC 문을 발견한 경우 추가됩니다. 대부분의 DBCC 문은 Snowflake에서 지원되지 않습니다.

코드 예제

입력 코드:
 DBCC CHECKIDENT(@a, RESEED, @b) WITH NO_INFOMSGS
Copy
생성된 코드:
 !!!RESOLVE EWI!!! /*** SSC-EWI-TS0079 - DATABASE CONSOLE COMMAND 'CHECKIDENT' IS NOT SUPPORTED. ***/!!!
DBCC CHECKIDENT(@a, RESEED, @b) WITH NO_INFOMSGS;
Copy

모범 사례

  • 추가 사용자 작업이 필요하지 않습니다. 이는 단지 정보 제공용입니다.

  • 추가 지원이 필요한 경우 snowconvert-support@snowflake.com으로 이메일을 보내주세요.

SSC-EWI-TS0080

런타임 시 실행 컨텍스트 변경은 Snowflake에서 지원되지 않습니다

심각도

높음

설명

SQL Server의 사용자는 실행 컨텍스트를 일시적으로 변경하기 위해 EXECUTE AS 명령을 사용할 수 있는데, 이로 인해 실행 권한이 수정되고 USER_NAME()과 같은 컨텍스트 종속 함수의 결과에 영향을 미칩니다. REVERT 명령을 사용하여 이전의 컨텍스트를 마지막 EXECUTE AS로 복원할 수 있습니다.

Snowflake는 CREATE PROCEDURE 또는 ALTER PROCEDURE 문을 사용하여 프로시저에서 실행 컨텍스트 정의만 지원합니다. 런타임 시 컨텍스트 변경은 지원되지 않습니다.

코드 예제

입력 코드:

 CREATE PROCEDURE proc1()
WITH EXECUTE AS OWNER
AS
BEGIN
	SELECT USER_NAME();
	EXECUTE AS CALLER;
	SELECT USER_NAME();
	REVERT;
	SELECT USER_NAME();
END

GO
Copy

출력 코드:

 CREATE OR REPLACE PROCEDURE proc1 ()
RETURNS ARRAY
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "transact",  "convertedOn": "07/05/2024" }}'
EXECUTE AS OWNER
AS
$$
	DECLARE
		ProcedureResultSet1 VARCHAR;
		ProcedureResultSet2 VARCHAR;
		ProcedureResultSet3 VARCHAR;
		return_arr ARRAY := array_construct();
	BEGIN
		ProcedureResultSet1 := 'RESULTSET_' || REPLACE(UPPER(UUID_STRING()), '-', '_');
		CREATE OR REPLACE TEMPORARY TABLE IDENTIFIER(:ProcedureResultSet1) AS
			SELECT
				CURRENT_USER();
		return_arr := array_append(return_arr, :ProcedureResultSet1);
		!!!RESOLVE EWI!!! /*** SSC-EWI-TS0080 - CHANGING THE EXECUTION CONTEXT AT RUNTIME IS NOT SUPPORTED IN SNOWFLAKE. ***/!!!
	EXECUTE AS CALLER;
		ProcedureResultSet2 := 'RESULTSET_' || REPLACE(UPPER(UUID_STRING()), '-', '_');
		CREATE OR REPLACE TEMPORARY TABLE IDENTIFIER(:ProcedureResultSet2) AS
			SELECT
				CURRENT_USER();
		return_arr := array_append(return_arr, :ProcedureResultSet2);
		!!!RESOLVE EWI!!! /*** SSC-EWI-TS0080 - CHANGING THE EXECUTION CONTEXT AT RUNTIME IS NOT SUPPORTED IN SNOWFLAKE. ***/!!!
	REVERT;
		ProcedureResultSet3 := 'RESULTSET_' || REPLACE(UPPER(UUID_STRING()), '-', '_');
		CREATE OR REPLACE TEMPORARY TABLE IDENTIFIER(:ProcedureResultSet3) AS
			SELECT
				CURRENT_USER();
		return_arr := array_append(return_arr, :ProcedureResultSet3);
		--** SSC-FDM-0020 - MULTIPLE RESULT SETS ARE RETURNED IN TEMPORARY TABLES **
		RETURN return_arr;
	END;
$$;
Copy

모범 사례

  • 컨텍스트를 전환하지 않고도 작동하도록 코드를 리팩터링합니다.

  • 추가 지원이 필요한 경우 snowconvert-support@snowflake.com으로 이메일을 보내주세요.

SSC-EWI-TS0081

DELETE 문에서 FULL JOIN을 사용하는 것은 지원되지 않습니다

설명

DELETE 문을 변환할 때 SnowConvert AI는 해당 문의 FROM 절에서 찾은 테이블 참조를 추출하여 Snowflake DELETE 문의 USING 절로 이동합니다.

원본 코드에 사용된 LEFT 및 RIGHT JOINs를 유지하기 위해 OUTER JOIN 구문(+)이 조건에 추가되어 이러한 동작을 나타냅니다. 그러나 Snowflake에서는 (+) 구문을 사용하여 FULL JOINs를 나타낼 수 없습니다. 이 EWI는 이러한 제한 사항을 경고하기 위해 사용됩니다.

코드 예시

입력 코드:
DELETE Employees
FROM Employees FULL OUTER JOIN Departments
ON Employees.DepartmentID = Departments.DepartmentID
WHERE Departments.DepartmentID IS NULL;
Copy
생성된 코드:
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0081 - USING A FULL JOIN IN A DELETE STATEMENT IS NOT SUPPORTED IN SNOWFLAKE ***/!!!
DELETE FROM
Employees
USING Departments
WHERE
Departments.DepartmentID IS NULL
AND Employees.DepartmentID = Departments.DepartmentID;
Copy

모범 사례

  • FULL JOIN의 논리를 확인합니다. 다른 JOIN 유형으로 다시 작성할 수 있습니다. 예를 들어, 예제 코드에 포함된 코드는 기본적으로 LEFT JOIN과 동일합니다.

입력:

DELETE Employees
FROM Employees LEFT OUTER JOIN Departments
ON Employees.DepartmentID = Departments.DepartmentID
WHERE Departments.DepartmentID IS NULL;
Copy

출력:

 DELETE FROM
    Employees
USING Departments
WHERE
    Departments.DepartmentID IS NULL
    AND Employees.DepartmentID = Departments.DepartmentID(+);
Copy

SSC-EWI-TS0082

CROSS APPLY가 LEFT OUTER JOIN으로 변환되었으며 수동 유효성 검사가 필요합니다.

설명

CROSS APPLY에서 LEFT OUTER JOIN으로 변환되면 Snowflake에서 잘못된 결과나 예기치 않은 동작이 발생할 수 있으므로 수동 유효성 검사가 필요합니다. 두 함수는 비슷해 보일 수 있지만, 특히 하위 쿼리에 일치하는 항목이 없거나 하위 쿼리가 외부 테이블과 상관 관계가 있는 경우 특정 상황을 다르게 처리합니다.

코드 예시

설정 데이터
-- Create a table to store monthly sales or metric data
CREATE TABLE sales_metrics (
    metric_id INT PRIMARY KEY,
    january_value VARCHAR(35),
    february_value VARCHAR(35),
    march_value VARCHAR(35)
);

-- Insert sample data
INSERT INTO sales_metrics (metric_id, january_value, february_value, march_value) VALUES
(1, 'sales-jan-1', 'sales-feb-1', 'sales-march-1'),
(2, 'sales-jan-2', 'sales-feb-2', 'sales-march-2');
Copy
입력 코드:
SELECT
    m.metric_id,
    monthly_data.metric_value,
    monthly_data.month_number
FROM
    sales_metrics m
CROSS APPLY (
    SELECT m.january_value AS metric_value, '01' AS month_number
    UNION ALL
    SELECT m.february_value AS metric_value, '02' AS month_number
    UNION ALL
    SELECT m.march_value AS metric_value, '03' AS month_number
) AS monthly_data;
Copy
생성된 코드:
SELECT
    m.metric_id,
    monthly_data.metric_value,
    monthly_data.month_number
FROM
    sales_metrics m
    !!!RESOLVE EWI!!! /*** SSC-EWI-TS0082 - CROSS APPLY HAS BEEN CONVERTED TO LEFT OUTER JOIN AND REQUIRES MANUAL VALIDATION. ***/!!!
    LEFT OUTER JOIN
        (
               SELECT
                m.january_value AS metric_value, '01' AS month_number
               UNION ALL
               SELECT
                m.february_value AS metric_value, '02' AS month_number
               UNION ALL
               SELECT
                m.march_value AS metric_value, '03' AS month_number
           ) AS monthly_data;
Copy

모범 사례

LEFT OUTER JOIN이 실패할 수 있는 주요 시나리오

  • 필터링 동작: 원래 CROSS APPLY는 기본 테이블에서 하위 쿼리에 일치 항목이 없는 행을 필터링하기 위한 것이며, LEFT OUTER JOIN은 이 동작을 복제하지 않습니다. 대신, 조인된 열에 NULL 값이 있는 행을 포함하며, 이는 의도한 결과가 아닐 수 있습니다.

  • 상관 관계가 있는 하위 쿼리: CROSS APPLY는 하위 쿼리가 외부 쿼리의 열을 참조하는 상관 관계가 있는 하위 쿼리를 지원하도록 특별히 설계되었습니다. 표준 LEFT OUTER JOIN은 동일한 방식으로 이 패턴을 지원하지 않습니다. 상관 관계가 있는 CROSS APPLYLEFT OUTER JOIN으로 변환하려고 시도하면 구문 오류, 데카르트 곱(중복 행) 또는 논리적으로 잘못된 결과가 발생할 수 있습니다.

  • 결과 세트 차이점: CROSS APPLYLEFT OUTER JOIN의 의미 체계는 다르며, 특히 하위 쿼리가 행을 반환하지 않는 경우에는 더욱 그렇습니다. CROSS APPLY는 이러한 행을 결과에서 제외하지만, LEFT OUTER JOINNULL 값이 있는 행을 포함합니다.

권장 사항: 항상 CROSS APPLYLEFT OUTER JOIN으로 변환된 쿼리의 출력을 검토하고 테스트하여 정확성을 보장합니다.

SSC-EWI-TS0083

Error Message

ROLLBACK TRANSACTION requires the appropriate setup to work as intended.

심각도

Low

설명

This EWI is generated when a ROLLBACK TRANSACTION statement is encountered, indicating that SnowConvert has successfully transformed the statement into a Snowflake-compatible format. However, the transformation requires manual verification because Snowflake’s transaction rollback behavior differs significantly from SQL Server’s ROLLBACK TRANSACTION functionality.

코드 예시

Input (SQL Server):

BEGIN TRANSACTION MyTransaction;

    -- Some operations
    INSERT INTO Employees (Name, Department) VALUES ('Alice', 'Engineering');

    IF @@ERROR <> 0
    BEGIN
        ROLLBACK TRANSACTION MyTransaction;  -- Named transaction rollback
    END
    ELSE
    BEGIN
        COMMIT TRANSACTION MyTransaction;
    END
Copy

Output (Snowflake Scripting):

BEGIN
    !!!RESOLVE EWI!!! /*** SSC-EWI-0073 - PENDING FUNCTIONAL EQUIVALENCE REVIEW FOR 'BeginTransaction' NODE ***/!!!
    BEGIN TRANSACTION MyTransaction;

        -- Some operations
    --** SSC-FDM-0007 - MISSING DEPENDENT OBJECT "Employees" **
        INSERT INTO Employees (Name, Department) VALUES ('Alice', 'Engineering');
    IF (:ERROR <> 0) THEN
        BEGIN
            !!!RESOLVE EWI!!! /*** SSC-EWI-TS0083 - ROLLBACK TRANSACTION REQUIRES THE APPROPRIATE SETUP TO WORK AS INTENDED. ***/!!!
            ROLLBACK TRANSACTION MyTransaction;  -- Named transaction rollback

        END;
    ELSE
        BEGIN
            COMMIT;
        END;
    END IF;
END;
Copy