SnowConvert: SQLServer 문제

SSC-EWI-TS0060

심각도

Medium

설명

이 경고는 지원되지 않는 시간 구성 요소를 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-TS0070

EWI 기능은 더 이상 사용되지 않습니다. 최신 정보는 SSC-FDM-TS0024 설명서를 참조하십시오.

설명

AT TIME ZONE 절과 함께 CURRENT_TIMESTAMP 를 사용할 때 이 경고가 표시됩니다. 이 경고는 CURRENT_TIMESTAMP 의 동적 특성으로 인해 여러 시나리오에서 결과가 일관되지 않을 수 있음을 나타냅니다.

Microsoft SQL 서버와 Snowflake CURRENT_TIMESTAMP 함수의 핵심적인 차이점은 타임존 처리입니다.

  • SQL 서버: 서버: 서버의 현지 타임존을 기준으로 시스템 날짜 및 시간을 반환합니다

  • Snowflake: UTC (협정 세계시)의 날짜와 시간을 반환합니다

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

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

SELECT
CONVERT_TIMEZONE('Pacific/Honolulu', CURRENT_TIMESTAMP() !!!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에서 일관된 형식을 유지하는 방법의 예입니다.

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

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

Snowflake에서는 ALTERSESSION 명령을 사용하여 기본 타임존을 수정할 수 있습니다. 예:

ALTER SESSION SET TIMEZONE = 'Pacific/Honolulu';

SELECT
CONVERT_TIMEZONE('Pacific/Honolulu', 'UTC', CURRENT_TIMESTAMP());
Copy

2024-02-08 16:33:49.143

SSC-EWI-TS0044

심각도

중요

예제를 명확하고 간결하게 하기 위해 코드의 일부가 생략되었습니다.

설명

이 경고는 Snowflake SQL 에서 사용할 수 없는 FORXML 절을 사용할 때 표시됩니다.

코드 예제

입력 코드:

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

심각도

중요

예제를 더 명확하고 쉽게 따라할 수 있도록 출력 코드의 일부가 제거되었습니다.

설명

이 오류 경고 표시기(EWI)는 SnowConvert 변환 중에 함수 본문을 생성할 수 없는 심각한 오류가 발생하면 표시됩니다.

코드 예시

SQL 서버

CREATE FUNCTION func1 ()
RETURNS VARCHAR
SELECT
   *
FROM
   TABLE1
Copy

Snowflake

CREATE OR REPLACE FUNCTION func1 ()
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"transact"}}'
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0001 - THE BODY WAS NOT GENERATED FOR FUNCTION 'func1' ***/!!!
AS
$$

$$;
Copy

권장 사항

SSC-EWI-TS0025

심각도

낮음

-t JavaScript 또는 --PLTargetLanguage JavaScript 플래그를 명령에 추가하여 JavaScript 에서 프로시저 및 매크로를 생성합니다.

예제를 더 명확하고 쉽게 따라할 수 있도록 출력 코드의 일부가 제거되었습니다.

설명

이 조기 경고 표시기(EWI)는 ERROR_SEVERITY 기본 제공 함수를 변환할 때 나타납니다. 이 함수는 SQL 서버에서 가장 일반적인 심각도 수준을 나타내는 기본값 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 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-TS0074

심각도

낮음

예제를 명확하고 간결하게 하기 위해 코드의 일부가 생략되었습니다.

설명

이 경고는 TRY_CAST 및 TRY_CONVERT 함수를 변환하는 동안 표시됩니다. 일부 데이터 타입 종속성을 해결할 수 없기 때문에 Snowflake의 결과가 원본과 다를 수 있습니다. 이는 일반적으로 필수가 소스 코드에 없는 종속성이 있을 때 발생합니다.

입력 코드:

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

심각도

높음

설명

이 경고는 코드 변환 중에 SnowConvert 에서 함수의 RETURNS TABLE 절에 대한 열 구조를 자동으로 확인할 수 없을 때 표시됩니다. 결과적으로 생성된 코드에서 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

출력 코드:

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":1, "minor":0},{"attributes":{"component":"transact"}}'
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
$$;

SELECT
    *
FROM GetDepartmentInfo() !!!RESOLVE EWI!!! /*** SSC-EWI-0073 - PENDING FUNCTIONAL EQUIVALENCE REVIEW FOR 'TableValuedFunctionCall' NODE ***/!!!;
Copy

권장 사항

  • 이 문제를 해결하려면 코드에서 모든 필수 오브젝트에 액세스할 수 있는지 확인하십시오. 필요한 모든 오브젝트가 사용 가능한지 확인한 후에도 문제가 계속되면, 당사에 문의하여 구체적인 사용 사례에 대한 세부 사항을 알아보십시오.

  • 추가 지원이 필요하면 snowconvert-support@Snowflake.com으로 이메일을 보내주십시오.

SSC-EWI-TS0041

심각도

Medium

설명

이 조기 경고 표시기(EWI)는 현재 Snowflake SQL에서 사용할 수 없는 다음 XML 데이터 타입 메서드 에 적용됩니다.

  • Value: 변수 또는 필드에 저장된 실제 데이터 또는 내용입니다

  • Query: 데이터베이스에서 특정 정보를 검색하는 요청입니다

  • Exist: 특정 요소 또는 조건이 있는지 확인합니다

  • Modify: 기존 데이터 또는 설정을 변경하거나 업데이트하려면 다음과 같이 하십시오

  • Nodes: 데이터 구조 내의 개별 요소 또는 연결 지점

코드 예제

입력 코드:

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

예제를 더 명확하고 쉽게 따라할 수 있도록 출력 코드의 일부가 제거되었습니다.

심각도

높음

설명

이 오류는 뷰 내에서 공통 테이블 식(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

권장 사항

SSC-EWI-TS0024

심각도

낮음

설명

이 경고는 저장 프로시저 내에서 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 Helpers Code
   // END REGION

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

권장 사항

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

이 조기 경고 표시기(EWI)는 더 이상 사용되지 않습니다. 업데이트된 정보는 SSC-FDM-TS0020에서 확인할 수 있습니다.

심각도

Medium

설명

이 경고는 테이블 변경 문에서 기본 제약 조건이 발견될 때 표시됩니다.

현재 이 제약 조건 유형은 지원되지 않습니다. 그러나 테이블이 테이블 변경 문 앞에 정의된 경우 참조를 식별하고 기본 제약 조건을 테이블 정의와 결합할 수 있는 해결 방법이 있습니다. 이것이 가능하지 않은 경우 변환된 코드에서 제약 조건이 설명됩니다.

코드 예제

입력 코드:

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

테이블 변경 명령 내의 모든 문이 유효하지 않은 경우 변환된 코드에서 전체 테이블 변경 명령이 설명됩니다.

Known Issues

동일한 열에 대해 여러 기본 제약 조건이 정의된 경우 첫 번째 제약 조건만 Create Table 문에 포함됩니다.

권장 사항

SSC-EWI-TS0061

심각도

Medium

예제를 더 명확하고 이해하기 쉽게 하기 위해 코드의 일부가 제거되었습니다.

설명

이 경고는 지원되지 않는 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-TS0045

심각도

낮음

예제를 명확하고 간결하게 유지하기 위해 코드 출력의 일부가 제거되었습니다.

설명

이 조기 경고 문제(EWI)는 SQL Server의 GOTO 문에 의해 참조되는 모든 레이블 이름에 대해 생성됩니다.

코드 예제

입력 코드:

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

예제를 더 명확하고 쉽게 따라할 수 있도록 출력 코드의 일부가 제거되었습니다.

심각도

높음

설명

이 오류는 SQL 서버의 기존 트랜잭션 내에서 새 트랜잭션이 시작될 때 발생하는 중첩된 트랜잭션이 있음을 나타냅니다. 첫 번째 문에 이어 BEGIN 문을 추가로 실행하면 새 트랜잭션이 생성되고 트랜잭션 카운터가 1개씩 증가합니다.

Snowflake는 중첩 트랜잭션을 지원하지 않습니다. 두 번째 BEGIN 문을 사용하면 이 문은 무시되고 1개의 트랜잭션만 유지됩니다. SQL 서버 트랜잭션 동작에 대한 자세한 내용은 SQL 서버 트랜잭션 을 참조하십시오.

코드 예제

입력 코드:

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. CODE '80'. **
--END

!!!RESOLVE EWI!!! /*** SSC-EWI-0040 - THE STATEMENT IS NOT SUPPORTED IN SNOWFLAKE ***/!!!
;
Copy

권장 사항

  • Snowflake는 컴파일 오류를 생성하는 대신 중첩된 트랜잭션을 무시합니다. 평가 보고서를 검토하여 코드에서 중첩된 트랜잭션을 식별할 수 있습니다.

  • 추가 지원이 필요하면 snowconvert-support@Snowflake.com으로 문의해 주십시오.

관련 EWI

  1. SSC-FDM-0020: 여러 쿼리 결과가 임시 테이블에 저장됩니다

  2. SSC-EWI-0001: 소스 코드 라인에서 알 수 없거나 잘못된 토큰을 발견했습니다

  3. SSC-EWI-0040: 문이 지원되지 않습니다

SSC-EWI-TS0039

심각도

Medium

설명

이 경고는 동일한 커서에 대해 여러 개의 SET 문이 발견되면 표시됩니다. Snowflake Scripting에서는 커서 1개당 1개의 SET 문만 가질 수 있습니다. 동일한 커서에 대한 추가 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





		!!!RESOLVE EWI!!! /*** SSC-EWI-0040 - THE STATEMENT 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 STATEMENT 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-TS0078

심각도

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

설명

이 경고는 SnowConvert 가 소스 코드에서 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-TS0049

이해하기 쉽도록 코드의 일부가 제거되었습니다.

심각도

Medium

설명

Begin ... End 블록이 포함된 대부분의 IF 문은 지원되며 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

출력 코드:

--** SSC-FDM-0029 - USER DEFINED FUNCTION WAS TRANSFORMED TO SNOWFLAKE PROCEDURE **
CREATE OR REPLACE PROCEDURE PURCHASING.FOO (STATUS INT)
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"transact"}}'
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: 여러 개의 문

여러 개의 SQL 문을 변환할 때는 순차적으로 변환하십시오. 첫 번째 문 (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: 여러 세트 문

이러한 상황에서는 각 SET 문에 대해 별도의 변환을 생성해야 합니다.

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

심각도

Medium

예제를 더 명확하고 쉽게 따라할 수 있도록 코드의 일부가 제거되었습니다.

설명

Snowflake Scripting의 커서는 결과 세트를 통해서만 앞으로 이동할 수 있습니다(스크롤 불가). FETCH NEXT 에서만 레코드를 한 번에 1개씩 검색할 수 있습니다.

코드 예제

입력 코드:

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

이 경고는 더 이상 유효하지 않습니다. 최신 설명서는 SSC-FDM-TS0013를 참조하십시오.

심각도

낮음

설명

이 경고는 SQL 서버 계산 열을 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-TS0076

이 경고 메시지는 더 이상 사용되지 않습니다. 최신 설명서는 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-TS0056

이 경고는 더 이상 유효하지 않습니다. 최신 설명서는 SSC-FDM-TS0021를 참조하십시오.

심각도

낮음

예제를 더 명확하고 이해하기 쉽게 하기 위해 코드의 일부가 제거되었습니다.

설명

이 조기 경고 표시기(EWI)는 테이블 변경 문에 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

ALTER TABLE 문을 실행하기 전에 MASKING POLICY 를 생성해야 합니다. 정책의 동작은 근사치일 수 있으며 역할 및 사용자 권한을 조정해야 할 수도 있다는 점에 유의하십시오.

권장 사항

SSC-EWI-TS0023

심각도

낮음

예제를 명확하고 간결하게 유지하기 위해 코드 출력의 일부가 제거되었습니다.

설명

BULK INSERT 옵션을 변환할 수 없는 경우 이 경고가 표시됩니다. 해당 옵션은 Snowflake에서 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: PUT 문은 사용자 인터페이스를 통해 실행할 수 없습니다.

SSC-EWI-TS0072

심각도

낮음

예제를 더 명확하고 쉽게 따라할 수 있도록 출력 코드의 일부가 제거되었습니다.

설명

이 경고는 SELECT 문과 OUTPUT 매개 변수를 모두 반환해야 할 때 나타납니다. 이러한 경우 SELECT 문의 결과가 OUTPUT 매개 변수보다 우선합니다.

입력 코드:

CREATE PROCEDURE SOMEPROC(@product_count INT OUTPUT,  @123 INT OUTPUT)
AS
BEGIN
		SELECT * from AdventureWorks.HumanResources.Department;
        SELECT * from AdventureWorks.HumanResources.Employee;
END
Copy

출력 코드:

CREATE OR REPLACE PROCEDURE SOMEPROC (PRODUCT_COUNT INT, _123 INT)
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;
		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;
		!!!RESOLVE EWI!!! /*** SSC-EWI-TS0072 - RETURN statement will be ignored due to previous RETURN statement ***/!!!
		RETURN OBJECT_CONSTRUCT('PRODUCT_COUNT', :PRODUCT_COUNT, '_123', :_123);
	END;
$$;
Copy

권장 사항

관련 EWI

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

SSC-EWI-TS0046

심각도

Medium

설명

이 경고는 코드가 SQL 해당하는 Snowflake가 없거나 Snowflake에서 지원되지 않는 SQL 서버 시스템 테이블 을 참조할 때 표시됩니다.

코드 예제

입력 코드:

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

심각도

낮음

설명

이 경고는 SnowConvert 가 CREATE TABLE 문에서 마스킹된 열을 감지할 때 표시됩니다. Snowflake에서는 열 정의에 옵션을 추가하는 것만으로는 열 마스킹을 구현할 수 없습니다. SQL 서버와 동일한 데이터 마스킹 기능을 사용하려면 마스킹 논리를 수작업으로 구현해야 합니다.

코드 예제

입력 코드:

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 는 현재 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 서버 마스킹 함수와 그에 상응하는 구현을 Snowflake에서 보여주는 예제를 보여드리겠습니다.

SQL 서버에서 이전에 마스킹이 활성화되어 있던 열에 마스킹 정책을 적용합니다.

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

이 조기 경고 표시기(EWI)는 더 이상 사용되지 않습니다. 최신 내용은 SSC-FDM-TS0022 설명서를 참조하십시오.

심각도

낮음

예제를 더 명확하고 이해하기 쉽게 하기 위해 코드의 일부가 제거되었습니다.

설명

이 오류는 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라인에 표시된 것처럼 쉼표로 구분하여 자리 표시자에 1개 이상의 역할 값을 추가할 수 있습니다. 각 역할 값은 작은따옴표로 묶어야 한다는 점을 기억하십시오.

권장 사항

SSC-EWI-TS0063

심각도

중요

설명

이 경고는 코드에 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-TS0032

외부 웹 인터페이스(EWI)는 저장 프로시저를 JavaScript 로 변환할 때만 생성됩니다. 그러나 이제 저장 프로시저에 선호되는 언어가 Snowflake Scripting이므로 이 기능은 더 이상 권장되지 않습니다.

심각도

높음

-t JavaScript 또는 --PLTargetLanguage JavaScript 플래그를 명령에 추가하여 JavaScript 에서 프로시저 및 매크로를 생성합니다.

예제를 더 명확하게 하기 위해 코드 출력의 일부가 제거되었습니다.

설명

이 경고는 BULK INSERT 문이 포함된 연결된 리터럴을 변환할 때 표시됩니다. 변환 프로세스는 BULK INSERT 를 Snowflake PUT 명령으로 변환합니다. 그러나 이 PUT 명령은 동적 SQL 에서 시작된 경우 실행할 수 없습니다.

BULK INSERT 문을 올바르게 처리하려면 프로시저와 별도로 PUT 명령을 실행해야 합니다. 프로시저에 여러 개의 BULK INSERT 문이 포함된 경우 동적 SQL 을 사용하는 것이 좋습니다.

  1. 프로시저를 더 작은 부분으로 나누기

  2. 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 Helpers Code section is omitted.

    /*** SSC-EWI-0040 - THE STATEMENT 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_638461213351333410;

CREATE OR REPLACE STAGE STAGE_638461213351333410
FILE_FORMAT = FILE_FORMAT_638461213351333410;

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

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

권장 사항

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

  • 추가 지원이 필요하면 snowconvert-support@Snowflake.com으로 문의해 주십시오.

SSC-EWI-TS0073

이 조기 경고 문제는 더 이상 지원되지 않습니다. 최신 설명서는 SSC-FDM-TS0023를 참조하십시오.

심각도

낮음

설명

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

심각도

높음

설명

SQL 서버의 EXECUTE AS 명령을 사용하면 사용자가 일시적으로 실행 컨텍스트를 변환할 수 있습니다. 이 변경 사항은 실행 권한과 USER_NAME() 같은 상황에 맞는 함수의 출력에 모두 영향을 미칩니다. 원래 컨텍스트로 돌아가려면 사용자는 작업을 완료한 후 REVERT 명령을 사용하면 됩니다.

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

이 경고는 더 이상 유효하지 않습니다. 최신 설명서는 SSC-FDM-TS0019를 참조하십시오.

심각도

낮음

설명

이 경고는 SQL 서버의 문자열 형식 규칙으로 인해 RAISERROR 오류 메시지가 다를 수 있음을 나타냅니다.

코드 예제

입력 코드:

CREATE PROCEDURE RAISERROR_PROCEDURE
AS
BEGIN
RAISERROR ('This is a sample error message with the first parameter %d and the second parameter %*.*s',
           10,
           1,
           123,
	   7,
	   7,
	   'param2');
END
Copy

출력 코드:

CREATE OR REPLACE PROCEDURE RAISERROR_PROCEDURE ()
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"transact"}}'
EXECUTE AS CALLER
AS
$$
	BEGIN
		!!!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-TS0016

예제를 더 명확하고 쉽게 따라할 수 있도록 코드의 일부가 제거되었습니다.

설명

이 경고는 SnowConvert 가 소스 코드에서 ODBC Scalar 함수를 감지하면 표시됩니다. ODBC Scalar 함수는 Snowflake에서 사용자 정의 함수로 변환할 수 없습니다.

코드 예제

입력 코드:

SELECT {fn CURRENT_DATE_UDF()};
Copy

출력 코드:

SELECT
!!!RESOLVE EWI!!! /*** SSC-EWI-0073 - PENDING FUNCTIONAL EQUIVALENCE REVIEW FOR 'CURRENT_DATE_UDF' NODE ***/!!!
CURRENT_DATE_UDF() !!!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-TS0036

심각도

Medium

예제를 명확하고 간결하게 하기 위해 코드의 일부가 생략되었습니다.

설명

이 경고는 코드에 로컬 커서가 아닌 커서 유형이 포함된 경우에 표시됩니다. 현재 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

권장 사항

SSC-EWI-TS0067

심각도

중요

예제를 명확하고 간결하게 유지하기 위해 코드 출력의 일부가 제거되었습니다.

설명

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

심각도

Medium

예제를 명확하고 간결하게 유지하기 위해 코드 출력의 일부가 제거되었습니다.

설명

이 경고는 Snowflake SQL 에서 사용할 수 있는 WITH XMLNAMESPACES 절에서 사용할 수 없습니다.

코드 예제

입력 코드:

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 /*** SSC-FDM-TS0015 - DATA TYPE NS1 IS NOT SUPPORTED IN SNOWFLAKE ***/)
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 의 예를 확인할 수 있습니다.

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
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)이 포함되어 있습니다. ‘RECURSIVE’ 키워드를 추가해야 하는지 확인하십시오.

  2. SSC-EWI-TS0044: ‘FOR XML’ 절은 지원되지 않으므로 Snowflake에서 사용할 수 없습니다.

  3. SSC-FDM-TS0015: Snowflake의 Regexp_Substr 함수는 POSIX 정규식에서만 작동한다는 점에 유의하십시오.

SSC-EWI-TS0077

심각도

낮음

설명

이 오류는 Snowflake가 지원하지 않는 데이터 정렬 절을 사용할 때 표시됩니다.

코드 예제

입력 코드:

SELECT 'a' COLLATE Albanian_BIN;

SELECT 'a' COLLATE Albanian_CI_AI;

CREATE TABLE ExampleTable (
    ID INT,
    Name VARCHAR(50) COLLATE collateName
);
Copy

출력 코드:

SELECT 'a'
--           !!!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-TS0026

심각도

낮음

설명

이 경고는 DELETE FROM 문이 포함된 공통 테이블 식(CTE)이 CREATE OR 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

권장 사항