SnowConvert: Teradata 문제

SSC-EWI-TD0069

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

심각도

낮음

설명

Teradata 함수 ST_SPHERICALDISTANCE 및 Snowflake의 ST_DISTANCE 함수는 지리적 지점 간의 거리를 다르게 계산합니다. Teradata는 지구와 같은 구의 두 점 사이의 거리를 측정하기 위해 Haversine 공식을 사용하는 반면, Snowflake의 ST_DISTANCE 는 다른 방법을 사용하여 두 지리적 좌표 사이의 최소 거리를 결정합니다.

코드 예시

입력 코드:

--The distance between New York and Los Angeles
Select Cast('POINT(-73.989308 40.741895)' As ST_GEOMETRY) As location1,
	Cast('POINT(40.741895 34.053691)' As ST_GEOMETRY) As location2,
	location1.ST_SPHERICALDISTANCE(location2) As Distance_In_km;
Copy

출력 코드

--The distance between New York and Los Angeles
SELECT
	Cast('POINT(-73.989308 40.741895)' As GEOGRAPHY) As location1,
	Cast('POINT(40.741895 34.053691)' As GEOGRAPHY) As location2,
	!!!RESOLVE EWI!!! /*** SSC-EWI-TD0069 - ST_DISTANCE RESULTS ARE SLIGHTLY DIFFERENT FROM ST_SPHERICALDISTANCE ***/!!!
	ST_DISTANCE(
	location1, location2) As Distance_In_km;
Copy

권장 사항

SSC-EWI-TD0079

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

심각도

낮음

설명

정규화 절 기능을 복제하는 데 필요한 ‘기간’ 열을 찾을 수 없기 때문에 이 경고가 표시됩니다.

코드 예시

입력 코드:

SELECT NORMALIZE emp_id, duration2 FROM project;
Copy

출력 코드

!!!RESOLVE EWI!!! /*** SSC-EWI-TD0079 - THE REQUIRED PERIOD TYPE COLUMN WAS NOT FOUND ***/!!!
// SnowConvert Helpers Code section is omitted.
WITH NormalizeCTE AS
(
SELECT
T1.*,
SUM(GroupStartFlag)
OVER (
PARTITION BY
emp_id, duration2
ORDER BY
PeriodColumn_begin
ROWS UNBOUNDED PRECEDING) GroupID
FROM
(
SELECT 
emp_id,
duration2,
PUBLIC.PERIOD_BEGIN_UDF(PeriodColumn) PeriodColumn_begin,
PUBLIC.PERIOD_END_UDF(PeriodColumn) PeriodColumn_end,
(CASE
WHEN PeriodColumn_begin <= LAG(PeriodColumn_end)
OVER (
PARTITION BY
emp_id, duration2
ORDER BY
PeriodColumn_begin,
PeriodColumn_end)
THEN 0
ELSE 1
END) GroupStartFlag FROM 
project
) T1
)
SELECT
emp_id,
duration2,
PUBLIC.PERIOD_UDF(MIN(PeriodColumn_begin), MAX(PeriodColumn_end))
FROM
NormalizeCTE
GROUP BY
emp_id,
duration2,
GroupID;
Copy

권장 사항

  • 이 경고를 해결하려면 코드에서 첫 번째 기간 열의 위치를 찾고 처음에 정의된 곳을 제외하고 해당 열에 대한 모든 참조를 제거하십시오. 그런 다음 ‘PeriodColumn’ 를 찾은 열의 이름으로 바꿉니다.

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

SSC-EWI-TD0008

심각도

낮음

설명

현재 Snowflake에는 특정 문자열 비교 함수에 대한 직접적인 등가 함수가 없습니다.

이 EWI 는 다음 문자열 비교 메서드를 사용할 때 표시: jaro, n_gram, LD (레벤슈타인 거리), LDWS (치환을 사용한 레벤슈타인 거리), OSA (최적화 문자열 정렬), DL (다메라우-레벤슈타인), hamming, LCS (최장 공통 서열), jaccard, cosine 또는 soundexcode.

코드 예시

Teradata는 대규모 데이터 웨어하우스 및 데이터 분석을 전문적으로 처리하는 관계형 데이터베이스 관리 시스템입니다.

SELECT * FROM StringSimilarity (
  ON (
    SELECT CAST(a AS VARCHAR(200)) AS a, CAST(b AS VARCHAR(200)) AS b
    FROM table_1
  ) PARTITION BY ANY
  USING
  ComparisonColumnPairs ('ld(a,b) AS sim_fn')
) AS dt ORDER BY 1;
Copy

Snowflake Scripting:

SELECT
  * FROM
  !!!RESOLVE EWI!!! /*** SSC-EWI-TD0008 - FUNCTION FOR COMPARING STRINGS IS NOT SUPPORTED ***/!!! StringSimilarity (
   ON (
     SELECT CAST(a AS VARCHAR(200)) AS a, CAST(b AS VARCHAR(200)) AS b
     FROM table_1
   ) PARTITION BY ANY
   USING
   ComparisonColumnPairs ('ld(a,b) AS sim_fn')
 ) AS dt ORDER BY 1;
Copy

권장 사항

SSC-EWI-TD0059

심각도

낮음

설명

Teradata와 마찬가지로 사용자에 대한 기본 타임존을 설정하면 세션에 대해 다른 타임존을 지정할 때까지 모든 세션에서 해당 타임존을 사용합니다.

이 경고는 이전에 Teradata 사용자에 대해 정의한 것과 동일한 타임존을 Snowflake에 설정하라는 메시지를 표시합니다. Snowflake에서 타임존을 설정하려면 다음 쿼리를 실행합니다.

ALTER SESSION SET TIMEZONE = 'equivalent_timezone'

참고: Snowflake는 IANA 타임존 데이터베이스 의 타임존만 허용합니다.

코드 예시

입력 코드:

SET TIME ZONE USER;
Copy

출력 코드:

!!!RESOLVE EWI!!! /*** SSC-EWI-TD0059 - SNOWFLAKE USER DEFAULT TIME ZONE MAY REQUIRE CONFIGURATION TO MATCH TERADATA VALUE ***/!!!
ALTER SESSION UNSET TIMEZONE;
Copy

권장 사항

  • 사용자의 기본 타임존을 원래 Teradata 사용자의 타임존 설정과 일치하도록 구성해야 합니다.

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

SSC-EWI-TD0049

심각도

높음

설명

도구가 TPT 의 DML 문을 처리 및 변환할 수 없습니다. 이는 일반적으로 다음과 같은 경우에 발생합니다.

  • 스크립트 변수는 문 내에서 연결됩니다

  • 문에 이스케이프 따옴표가 포함되어 있습니다

코드 예시

입력 코드:

-- Script1.tpt
DEFINE JOB load_job
DESCRIPTION 'LOAD TABLE FROM A FILE'
  (
     DEFINE SCHEMA schema_name
     DESCRIPTION 'define SCHEMA'
   (
       var1 VARCHAR (50)
   );

   STEP setup_tables
   (
      APPLY
       ('RELEASE MLOAD database_name.table_name;')
     TO OPERATOR (DDL_OPERATOR() );

   );
);
Copy

출력 코드:

#*** Generated code is based on the SnowConvert Python Helpers version 2.0.6 ***

import os
import sys
import snowconvert.helpers
from snowconvert.helpers import Export
from snowconvert.helpers import exec
from snowconvert.helpers import BeginLoading
import argparse
args = None
# Script1.tpt
class load_job:
    #'LOAD TABLE FROM A FILE'

  jobname = "load_job"
    #'define SCHEMA'

  schema_name = """(
var1 VARCHAR(50)
);"""
  def setup_tables(self):
    self.DDL_OPERATOR()
    !!!RESOLVE EWI!!! /*** SSC-EWI-TD0049 - THE FOLLOWING STATEMENT COULD NOT BE PROCESSED ***/!!!
      #'RELEASE MLOAD database_name.table_name;'


con = None
def main():
  snowconvert.helpers.configure_log()
  con = snowconvert.helpers.log_on()
  _load_job = load_job()
  _load_job.setup_tables()
  snowconvert.helpers.quit_application()

if __name__ == "__main__":
  main()
Copy

권장 사항

  • 이 문제를 해결하려면 INSERT 문을 직접 작성하거나 SnowConvert 팀에 문의하여 현재 지원되지 않는 특정 DML 문에 대한 지원을 요청할 수 있습니다.

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

SSC-EWI-TD0009

심각도

낮음

설명

Teradata의 임시 테이블은 파생된 기간 열을 사용하여 열 수준에서 시간 기반 데이터를 추적합니다. 이 기능은 현재 Snowflake에서 사용할 수 없습니다.

코드 예시

Teradata:

CREATE MULTISET TABLE Policy(
      Policy_ID INTEGER,
      Customer_ID INTEGER,
      Policy_Type CHAR(2) NOT NULL,
      Policy_Details CHAR(40),
      Policy_Start DATE NOT NULL,
      Policy_End DATE NOT NULL,
      PERIOD FOR Validity(Policy_Start,Policy_End) AS VALIDTIME
      )
   PRIMARY INDEX(Policy_ID);
Copy

Snowflake Scripting:

CREATE OR REPLACE TABLE Policy (
   Policy_ID INTEGER,
   Customer_ID INTEGER,
   Policy_Type CHAR(2) NOT NULL,
   Policy_Details CHAR(40),
   Policy_Start DATE NOT NULL,
   Policy_End DATE NOT NULL,
   !!!RESOLVE EWI!!! /*** SSC-EWI-TD0009 - TEMPORAL COLUMN NOT SUPPORTED ***/!!!
         PERIOD FOR Validity(Policy_Start,Policy_End) AS VALIDTIME
         )
         COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"teradata"}}'
         ;
Copy

권장 사항

SSC-EWI-TD0039

심각도

Medium

설명

사용하려는 파일 형식이 Snowflake와 호환되지 않습니다.

코드 예시

입력:

SELECT
    CAST('01-12-2020' AS DATE FORMAT 'dd-mm-yyyy'),
    CAST('01-12-2020' AS DATE FORMAT 'DDDBEEEE');
Copy

출력:

SELECT
    TO_DATE('01-12-2020', 'DD-MM-YYYY') !!!RESOLVE EWI!!! /*** SSC-EWI-TD0025 - OUTPUT FORMAT 'dd-mm-yyyy' NOT SUPPORTED. ***/!!!,
    TO_DATE('01-12-2020', 'DDD EEEE') !!!RESOLVE EWI!!! /*** SSC-EWI-TD0025 - OUTPUT FORMAT 'DDDBEEEE' NOT SUPPORTED. ***/!!!!!!RESOLVE EWI!!! /*** SSC-EWI-TD0039 - INPUT FORMAT 'DDD EEEE' NOT SUPPORTED ***/!!!;
Copy

권장 사항

SSC-EWI-TD0068

심각도

Medium

설명

Teradata 프로필을 사용하면 저장소 공간을 제어하고 비밀번호 제한을 관리하는 여러 공유 매개 변수를 설정할 수 있습니다.

Snowflake는 클라우드 아키텍처를 통해 저장소를 관리하고 모든 최적화를 자동으로 처리 하므로 사용자 측에서 저장소를 구성할 필요가 없습니다. 또한 Snowflake는 모든 사용자에게 보편적으로 적용되고 사용자 정의할 수 없는 표준 비밀번호 정책을 시행 합니다.

이 오류는 Teradata 프로필 참조가 감지되어 Snowflake 역할 참조로 변환될 때 발생합니다. Snowflake의 역할은 Teradata 프로필과 가장 유사하지만, Teradata의 프로필 이름이 Snowflake의 역할 이름과 일치하지 않으면 쿼리 결과가 다를 수 있습니다.

코드 예시

입력 코드:

SELECT PROFILE;
Copy

출력 코드:

SELECT
CURRENT_ROLE() !!!RESOLVE EWI!!! /*** SSC-EWI-TD0068 - SNOWFLAKE DOES NOT SUPPORT PROFILES, REFERENCING ROLE INSTEAD ***/!!!;
Copy

권장 사항

  • 사용자 프로필은 지원되지 않으므로 쿼리에 사용자 프로필을 사용하지 마십시오. 사용자의 프로필 이름이 역할 이름과 다른 경우 쿼리 결과가 달라질 수 있습니다.

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

SSC-EWI-TD0029

심각도

낮음

설명

이 경고는 TABLE 을 사용하는 속성을 사용하는 QUEUE 특성을 사용할 때 표시됩니다. Snowflake는 QUEUE 키워드를 지원하지 않으므로 마이그레이션 중에 제거됩니다.

코드 예시

입력:

CREATE MULTISET TABLE SAMPLE_TABLE,
QUEUE,
NO FALLBACK
(
    COL1 INTEGER
);
Copy

출력:

!!!RESOLVE EWI!!! /*** SSC-EWI-TD0029 - QUEUE TABLE FUNCTIONALITY NOT SUPPORTED ***/!!!
CREATE OR REPLACE TABLE SAMPLE_TABLE
(
    COL1 INTEGER
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"teradata"}}'
;
Copy

권장 사항

SSC-EWI-TD0063

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

심각도

Medium

설명

이 오류는 SnowConvert 가 필수 JSON 형식을 따르지 않고 올바르게 역직렬화할 수 없는 JSON 경로 문자열을 발견할 때 발생합니다.

코드 예시

입력 코드:

SELECT
    *
FROM
JSON_TABLE (
    ON (
        SELECT
            id,
            trainSchedule as ts
        FROM
            demo.PUBLIC.Train T
    ) USING rowexpr('$weekShedule.Monday[*]') colexpr(
        '[{"jsonpath"  "$.time",
              "type"" : "CHAR ( 12 )"}]'
    )
) AS JT(Id, Ordinal, Time, City);
Copy

출력 코드:

SELECT
    *
FROM
    !!!RESOLVE EWI!!! /*** SSC-EWI-TD0063 - UNRECOGNIZED JSON PATH $weekShedule.Monday[*] ***/!!!
JSON_TABLE (
    ON
       !!!RESOLVE EWI!!! /*** SSC-EWI-0108 - THE FOLLOWING SUBQUERY MATCHES AT LEAST ONE OF THE PATTERNS CONSIDERED INVALID AND MAY PRODUCE COMPILATION ERRORS ***/!!! (
           SELECT
               id,
               trainSchedule as ts
FROM
               demo.PUBLIC.Train T
    ) USING rowexpr('$weekShedule.Monday[*]') colexpr(
        '[{"jsonpath"  "$.time",
              "type"" : "CHAR ( 12 )"}]'
    )
) AS JT(Id, Ordinal, Time, City);
Copy

권장 사항

  • JSON 경로의 형식이 올바르고 잘못된 문자가 포함되어 있지 않은지 확인합니다.

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

SSC-EWI-TD0057

심각도

낮음

설명

NEW JSON 함수는 문자열 또는 이진 형식의 JSON 데이터를 허용합니다. 데이터가 이진 형식인 경우 Snowflake는 JSON 오브젝트에 대한 이진 형식의 메타데이터를 해석할 수 없기 때문에 함수는 변경되지 않습니다. 자세한 내용은 NEW JSON 설명서 를 참조하십시오.

코드 예시

입력 코드

SELECT NEW JSON ('160000000268656C6C6F0006000000776F726C640000'xb, BSON);
Copy

출력 코드

SELECT
!!!RESOLVE EWI!!! /*** SSC-EWI-TD0057 - NEW JSON FUNCTION WITH BINARY DATA IS NOT SUPPORTED ***/!!!!!!RESOLVE EWI!!! /*** SSC-EWI-TD0039 - INPUT FORMAT 'BSON' NOT SUPPORTED ***/!!!
NEW JSON (TO_BINARY('160000000268656C6C6F0006000000776F726C640000'), BSON);
Copy

권장 사항

SSC-EWI-TD0006

심각도

낮음

설명

FLOAT 데이터 타입은 DEFAULT TIME, DEFAULT DATE, DEFAULT CURRENT_DATE, DEFAULT CURRENT_TIME 또는 DEFAULT CURRENT_TIMESTAMP 사양을 사용하는 기본값을 지원하지 않습니다.

코드 예시

Teradata:

CREATE TABLE T_2004
(
    -- In the output code all of these columns will be FLOAT type
    -- and will include the SSC-EWI-TD0006 message.
    COL1 FLOAT DEFAULT TIME,
    COL2 FLOAT DEFAULT DATE,
    COL3 FLOAT DEFAULT CURRENT_DATE,
    COL4 FLOAT DEFAULT CURRENT_TIME,
    COL5 FLOAT DEFAULT CURRENT_TIMESTAMP
);
Copy

Snowflake Scripting:

CREATE OR REPLACE TABLE T_2004
(
    -- In the output code all of these columns will be FLOAT type
    -- and will include the SSC-EWI-TD0006 message.
    COL1 FLOAT DEFAULT TIME !!!RESOLVE EWI!!! /*** SSC-EWI-TD0006 - DEFAULT CURRENT_TIME NOT VALID FOR DATA TYPE ***/!!!,
    COL2 FLOAT DEFAULT DATE !!!RESOLVE EWI!!! /*** SSC-EWI-TD0006 - DEFAULT CURRENT_DATE NOT VALID FOR DATA TYPE ***/!!!,
    COL3 FLOAT DEFAULT CURRENT_DATE !!!RESOLVE EWI!!! /*** SSC-EWI-TD0006 - DEFAULT CURRENT_DATE NOT VALID FOR DATA TYPE ***/!!!,
    COL4 FLOAT DEFAULT CURRENT_TIME !!!RESOLVE EWI!!! /*** SSC-EWI-TD0006 - DEFAULT CURRENT_TIME NOT VALID FOR DATA TYPE ***/!!!,
    COL5 FLOAT DEFAULT CURRENT_TIMESTAMP !!!RESOLVE EWI!!! /*** SSC-EWI-TD0006 - DEFAULT CURRENT_TIMESTAMP NOT VALID FOR DATA TYPE ***/!!!
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"teradata"}}'
;
Copy

권장 사항

SSC-EWI-TD0002

이 EWI 는 SnowConvert 28.1.100 릴리스부터 더 이상 사용되지 않습니다.

심각도

높음

설명

SQL 문에 INTERVAL 유형의 열 선택기가 포함된 경우 SnowConvert 는 EWI (오류, 경고, 정보) 메시지를 추가하고 stub 함수를 생성합니다. Snowflake는 INTERVAL 데이터 타입을 지원하지 않으므로 변환 프로세스가 완료된 후 수동 개입이 필요합니다.

코드 예시

Teradata:

SELECT
     CAST('07:00' AS INTERVAL HOUR(2) TO MINUTE),
     CAST('08:00' AS INTERVAL HOUR(2) TO MINUTE) As Test_Interval;
Copy

Snowflake Scripting:

SELECT
     !!!RESOLVE EWI!!! /*** SSC-EWI-TD0002 - INTERVAL TYPE NOT SUPPORTED IN SNOWFLAKE ***/!!!
     INTERVAL '07 hour, 00 min',
     !!!RESOLVE EWI!!! /*** SSC-EWI-TD0002 - INTERVAL TYPE NOT SUPPORTED IN SNOWFLAKE ***/!!!
     INTERVAL '08 hour, 00 min' As Test_Interval;
Copy

권장 사항

SSC-EWI-TD0053

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

생성된 varchar 표현의 전체 자릿수

PERIOD_UDF 함수는 Snowflake의 기본 타임스탬프와 시간 형식을 사용하여 기간의 문자열 표현을 생성합니다. 기본적으로 타임스탬프는 전체 자릿수에 소수점 이하 세 자리까지 포함하지만, 시간 변수에는 소수점 이하 자릿수가 없습니다. 출력 문자열의 전체 자릿수를 조정해야 하는 경우 두 가지 옵션을 사용할 수 있습니다.

PRECISIONDIGITS 매개 변수와 함께 PERIOD_UDF 의 세 매개 변수 버전을 사용합니다. 이 매개 변수는 0에서 9까지의 정수를 허용하며 결과의 분수 시간 부분의 소수점 이하 자릿수를 제어합니다. Snowflake는 소수점 이하 9자리까지 지원하지만, Teradata는 소수점 이하 6자리까지만 지원합니다. 예:

호출

결과

PUBLIC.PERIOD_UDF(time '13:30:45.870556', time '15:35:20.344891', 0)

'13:30:45*15:35:20'

PUBLIC.PERIOD_UDF(time '13:30:45.870556', time '15:35:20.344891', 2)

'13:30:45.87*15:35:20.34'

PUBLIC.PERIOD_UDF(time '13:30:45.870556', time '15:35:20.344891', 5)

'13:30:45.87055*15:35:20.34489'

  • 세션 출력의 시간 형식을 설정: ALTER SESSION SET TIMESTAMP_NTZ_OUTPUT_FORMAT = <format>ALTER SESSION SET TIME_OUTPUT_FORMAT = <format> 명령을 사용하여 세션에서 타임스탬프와 시간이 표시되는 방식을 수정했습니다.

현재 세션에 대한 Snowflake의 기본 형식을 수정하여 원하는 정밀 자릿수를 지정할 수 있습니다. 이러한 변경 사항은 세션 중 PERIOD_UDF 의 모든 후속 실행에 영향을 미칩니다.

코드 예시

입력 코드:

create table vacations (
    employeeName varchar(50),
    duration period(date)
);

insert into vacations values ('Richard', period(date '2021-05-15', date '2021-06-15'));

select end(duration) from vacations;
Copy

출력 코드:

CREATE OR REPLACE TABLE vacations (
    employeeName varchar(50),
    duration VARCHAR(24) !!!RESOLVE EWI!!! /*** SSC-EWI-TD0053 - SNOWFLAKE DOES NOT SUPPORT THE PERIOD DATATYPE, ALL PERIODS ARE HANDLED AS VARCHAR INSTEAD ***/!!!
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"teradata"}}'
;

INSERT INTO vacations
VALUES ('Richard', PUBLIC.PERIOD_UDF(date '2021-05-15', date '2021-06-15') !!!RESOLVE EWI!!! /*** SSC-EWI-TD0053 - SNOWFLAKE DOES NOT SUPPORT THE PERIOD DATATYPE, ALL PERIODS ARE HANDLED AS VARCHAR INSTEAD ***/!!!);

SELECT
    PUBLIC.PERIOD_END_UDF(duration) !!!RESOLVE EWI!!! /*** SSC-EWI-TD0053 - SNOWFLAKE DOES NOT SUPPORT THE PERIOD DATATYPE, ALL PERIODS ARE HANDLED AS VARCHAR INSTEAD ***/!!! from
    vacations;
Copy

권장 사항

  • PERIOD 및 관련 함수는 varchar 데이터 타입을 사용하여 시뮬레이션되므로 결과의 정확성을 확인하는 것이 좋습니다.

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

SSC-EWI-TD0077

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

심각도

보통

설명

SnowConvert (SC)는 이진 비교 연산자(<=, >= 또는 =)를 사용하는 RESET WHEN 절만 지원합니다. IS NOT NULL 같은 다른 조건을 사용하는 경우 Snowflake는 이러한 조건을 지원하지 않으므로 SC 는 RESET WHEN 절을 제거하고 오류 메시지를 표시합니다.

이 오류 메시지는 RESET WHEN 조건이 마이그레이션 도구가 위치를 찾을 수 없는 식을 참조할 때 표시됩니다. 현재 이 도구는 동일한 쿼리 내에 정의된 열 별칭만 지원합니다.

코드 예시

조건이 이진법이 아닙니다

입력 코드:

SELECT
    account_id,
    month_id,
    balance,
    ROW_NUMBER() OVER (
        PARTITION BY account_id
        ORDER BY month_id
        RESET WHEN balance IS NOT NULL
        ROWS UNBOUNDED PRECEDING
    ) as balance_increase
FROM account_balance
ORDER BY 1,2;
Copy

출력 코드

// SnowConvert Helpers Code section is omitted.
SELECT
    account_id,
    month_id,
    balance,
    ROW_NUMBER() OVER (
        PARTITION BY account_id
    !!!RESOLVE EWI!!! /*** SSC-EWI-TD0077 - RESET WHEN CLAUSE IS NOT SUPPORTED IN THIS SCENARIO DUE TO ITS CONDITION ***/!!!
        ORDER BY month_id
        ROWS UNBOUNDED PRECEDING
    ) as balance_increase
FROM
    account_balance
ORDER BY 1,2;
Copy

조건 식을 찾을 수 없습니다

입력 코드:

SELECT
    account_id,
    month_id,
    balance,
    ROW_NUMBER() OVER (
        PARTITION BY account_id
        ORDER BY month_id
        RESET WHEN balance <= not_found_expresion
    ) as balance_increase
FROM account_balance
ORDER BY 1,2;
Copy

출력 코드

// SnowConvert Helpers Code section is omitted.
SELECT
    account_id,
    month_id,
    balance,
    ROW_NUMBER() OVER (
        PARTITION BY account_id
    !!!RESOLVE EWI!!! /*** SSC-EWI-TD0077 - RESET WHEN CLAUSE IS NOT SUPPORTED IN THIS SCENARIO DUE TO ITS CONDITION ***/!!!
        ORDER BY month_id
    ) as balance_increase
FROM
    account_balance
ORDER BY 1,2;
Copy

권장 사항

SSC-EWI-TD0012

심각도

낮음

설명

이 경고는 SnowConvert 에서 DEFAULT 값이 있는 BINARY 데이터 타입 열을 감지할 때 표시됩니다. Snowflake는 BINARY 열에 대한 기본값을 지원하지 않으므로 SnowConvert 는 DEFAULT 값 사양을 제거합니다.

코드 예시

Teradata:

CREATE TABLE TableExample
(
ColumnExample BINARY DEFAULT '00000000'XB NOT NULL
)
Copy

Snowflake Scripting:

CREATE OR REPLACE TABLE TableExample (
ColumnExample BINARY DEFAULT NOT TO_BINARY('00000000') !!!RESOLVE EWI!!! /*** SSC-EWI-TD0012 - BINARY DOES NOT SUPPORT DEFAULT NOT TO_BINARY('00000000') ***/!!! NULL
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"teradata"}}'
;
Copy

권장 사항

SSC-EWI-TD0003

심각도

낮음

설명

Snowflake에서 트림 함수(LTRIM, RTRIM 또는 TRIM`)는 빈 공간이나 공백 문자를 제거할 때만 데이터 정렬을 지원합니다. 다른 문자 유형에 대한 데이터 정렬은 지원하지 않습니다.

SnowConvert 가 데이터 정렬 열에서 LTRIM, RTRIM 또는 TRIM (LEADING 또는 TRAILING 옵션 포함) 함수를 만나면 자동으로 COLLATE 함수를 추가합니다. 이 함수는 다듬기 작업을 적용하기 전에 입력 열의 데이터 정렬되지 않은 복사본을 생성합니다. 조기 경고 표시기(EWI)는 트림 함수가 적용되기 전에 열의 데이터 정렬이 제거되었음을 경고합니다. 결과적으로 트리밍된 출력에는 데이터 정렬 설정이 없으며, 이 결과를 사용하는 후속 문자열 비교에 영향을 줄 수 있습니다.

코드 예시

Teradata:

CREATE TABLE collateTable (
	col1 VARCHAR(50) CHARACTER SET LATIN NOT CASESPECIFIC
);

SELECT
    TRIM(BOTH '0' FROM col1),
    TRIM(LEADING '  ' FROM col1),
    TRIM(TRAILING '0' FROM col1),
    LTRIM(col1, '0'),
    RTRIM(col1)
FROM
    collateTable;
Copy

Snowflake Scripting:

CREATE OR REPLACE TABLE collateTable (
	col1 VARCHAR(50) COLLATE 'en-cs'
)
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "teradata",  "convertedOn": "06/17/2024" }}'
;

SELECT
	TRIM(COLLATE(col1, ''), '0') !!!RESOLVE EWI!!! /*** SSC-EWI-TD0003 - COLLATION NOT SUPPORTED IN TRIM FUNCTIONS, ADD ORIGINAL COLLATION TO FUNCTION RESULT TO PRESERVE IT ***/!!!,
	LTRIM(col1, '  '),
	RTRIM(COLLATE(col1, ''), '0') !!!RESOLVE EWI!!! /*** SSC-EWI-TD0003 - COLLATION NOT SUPPORTED IN TRIM FUNCTIONS, ADD ORIGINAL COLLATION TO FUNCTION RESULT TO PRESERVE IT ***/!!!,
	LTRIM(COLLATE(col1, ''), '0') !!!RESOLVE EWI!!! /*** SSC-EWI-TD0003 - COLLATION NOT SUPPORTED IN TRIM FUNCTIONS, ADD ORIGINAL COLLATION TO FUNCTION RESULT TO PRESERVE IT ***/!!!,
	RTRIM(col1)
	FROM
	collateTable;
Copy

권장 사항

  • 일관된 비교 동작을 유지하려면 COLLATE 함수를 사용하여 원래 열의 데이터 정렬을 TRIM 함수 결과에 추가합니다. 두 번째 인자에 원래 데이터 정렬 값을 리터럴 문자열로 지정합니다.

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

SSC-EWI-TD0052

심각도

낮음

설명

숫자 매개 변수가 필요한 함수에 문자열 값을 전달할 때 Teradata와 Snowflake 모두 문자열 값을 자동으로 숫자로 변환합니다. 문자열 값은 구문 분석되어 해당 숫자에 해당하는 값으로 변환됩니다.

Teradata와 대상 언어는 숫자 문자열을 다르게 처리합니다. Teradata는 보다 유연하며 다양한 문자열 형식을 숫자로 구문 분석할 수 있습니다.

  • 빈 문자열 또는 공백만 있는 문자열

  • 대시가 포함된 문자열

  • 맨티사 또는 지수에 자릿수가 없는 숫자

  • 통화 기호

  • 자릿수 구분 기호가 있는 숫자

  • 자릿수 뒤에 기호가 표시되는 숫자

  • '1-2-3-4-5' -> 12345

  • '$50' -> 50

  • '5000-' -> -5000

  • '1,569,284.55' -> 1569284.55

Snowflake는 자동 낙관적 문자열 변환 을 사용하며 문자열이 TM9 또는 TME 형식과 일치할 것으로 예상합니다. 문자열이 이러한 형식과 일치하지 않으면 변환이 실패합니다. 이 문제를 해결하기 위해 SnowConvert 는 TM9 또는 TME 형식과 일치하는 문자열을 생성하여 숫자 값으로 변환이 필요한 문자열 리터럴을 처리합니다. 이렇게 하면 Snowflake가 올바르게 구문 분석할 수 있습니다. 이 변환은 리터럴 문자열 값에 대해서만 작동하며, 리터럴이 아닌 값은 Snowflake에서 성공적으로 구문 분석되지 않을 수 있습니다.

코드 예시

입력 코드:

create table myTable(
    stringCol varchar(30)
);

insert into myTable values ('   1,236,857.45-');

select cos('   1,236,857.45-');

select cos(stringCol) from myTable;
Copy

출력 코드:

CREATE OR REPLACE TABLE myTable (
    stringCol varchar(30)
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"teradata"}}'
;

INSERT INTO myTable
VALUES ('   1,236,857.45-');

SELECT
    cos('-1236857.45');

SELECT
    cos(stringCol !!!RESOLVE EWI!!! /*** SSC-EWI-TD0052 - SNOWFLAKE IMPLICIT CONVERSION TO NUMERIC DIFFERS FROM TERADATA AND MAY FAIL FOR NON-LITERAL STRING VALUES ***/!!!)
from
    myTable;
Copy

권장 사항

SSC-EWI-TD0066

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

심각도

낮음

설명

이 메시지는 Snowflake에서 지원되지 않는 문자가 SnowConvert 에 포함된 Teradata Unicode 구분 식별자가 있을 때 표시됩니다. 자세한 내용은 Teradata Unicode 구분 기호 를 참조하십시오.

코드 예시

입력 코드:

SELECT * FROM U&"#000f#ffff" UESCAPE '#';
Copy

출력 코드:

// SnowConvert Helpers Code section is omitted.
SELECT
* FROM
!!!RESOLVE EWI!!! /*** SSC-EWI-TD0066 - THE FOLLOWING IDENTIFIER HAS ONE OR MORE UNICODE ESCAPE CHARACTERS THAT ARE INVALID IN SNOWFLAKE ***/!!!
"\u000f\uffff";
Copy

권장 사항

  • Snowflake에서 식별자를 생성할 때는 유효한 Unicode 문자만 사용하십시오.

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

SSC-EWI-TD0027

심각도

낮음

설명

Snowflake는 VALIDTIME 또는 TRANSACTIONTIME 같은 Teradata의 기본 제공 임시 특성을 지원하지 않으므로 EWI (오류, 경고, 정보) 메시지가 표시됩니다.

코드 예시

Teradata 입력:

CREATE MULTISET TABLE SAMPLE_TABLE
(
    COL1 PERIOD(TIMESTAMP(6) WITH TIME ZONE) NOT NULL AS TRANSACTIONTIME
);
Copy

Snowflake 출력:

CREATE OR REPLACE TABLE SAMPLE_TABLE (
       COL1 VARCHAR(68) NOT NULL !!!RESOLVE EWI!!! /*** SSC-EWI-TD0027 - SNOWFLAKE DOES NOT SUPPORT 'TRANSACTIONTIME' COLUMN OPTION ***/!!!!!!RESOLVE EWI!!! /*** SSC-EWI-TD0053 - SNOWFLAKE DOES NOT SUPPORT THE PERIOD DATATYPE, ALL PERIODS ARE HANDLED AS VARCHAR INSTEAD ***/!!!
   )
   COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"teradata"}}'
;
Copy

권장 사항

  • TIMESTAMP 열을 수동으로 생성하고 기본값을 CURRENT_TIMESTAMP 로 설정합니다.

  • 테이블 스트림을 사용하여 데이터의 변경 사항을 추적하고 각 수정 사항에 대한 메타데이터를 캡처하십시오. (가이드)

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

SSC-EWI-TD0076

심각도

보통

설명

Teradata의 외부 테이블 을 사용하면 Amazon S3, Azure Blob 스토리지 및 Google Cloud Storage와 같은 외부 위치에 저장된 데이터에 액세스할 수 있습니다. Snowflake는 이 특정 구문을 지원하지 않지만, 다음을 사용하여 유사한 기능을 구현할 수 있습니다.

  • 외부 테이블

  • Iceberg 테이블

  • 표준 테이블

코드 예시

입력 코드:

SELECT cust_id, income, age FROM
FOREIGN TABLE (SELECT cust_id, income, age FROM twm_customer)@hadoop1 T1;
Copy

출력 코드:

SELECT
cust_id,
income,
age FROM
!!!RESOLVE EWI!!! /*** SSC-EWI-TD0076 - THE USE OF FOREIGN TABLES IS NOT SUPPORTED IN SNOWFLAKE. ***/!!!
 FOREIGN TABLE (SELECT cust_id, income, age FROM twm_customer)@hadoop1 T1;
Copy

권장 사항

  • Teradata 외부 테이블을 교체하려면 Snowflake 외부 테이블 을 사용하면 됩니다. 이 테이블은 클라우드 저장소 플랫폼(Amazon S3, Google Cloud Storage 또는 Microsoft Azure)에서 직접 데이터를 읽습니다. 이를 통해 데이터 레이크 파일을 마치 데이터베이스 테이블처럼 쿼리할 수 있습니다. 외부 테이블은 COPYINTO

  • Snowflake의 Iceberg 테이블 은 또 다른 옵션을 제공합니다. 이 테이블은 개방형 형식을 사용하며 데이터를 자체 클라우드 저장소에 Parquet 파일로 저장합니다.

  • 표준 Snowflake 테이블 은 Teradata 외부 테이블 기능을 대체할 수도 있습니다.

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

  • SSC-EWI-TD0091

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

    심각도

    Medium

    설명

    Teradata 스크립트에서 다음 구문과 함께 CAST 식을 사용하여 데이터 타입을 변환할 수 있습니다.

    <expression> ( <DataType> )
    
    Copy

    CAST 를 DATE 또는 TIME 로 데이터 타입을 변환할 때 이 키워드는 각각 CURRENT_DATECURRENT_TIME 함수로도 기능하기 때문에 모호한 경우가 발생할 수 있습니다.

    따라서 CAST 연산을 요구하는 식에 대한 추가 컨텍스트 없이 코드를 검사할 경우, 원본 CAST 연산과 단순히 DATE 또는 TIME 매개 변수를 입력으로 받는 함수를 구분하기 어려워집니다.

    <expression> 이 열인지 사용자 정의 함수(UDF)인지 확인하려면 코드를 변환할 때 해당 CREATE TABLE 또는 CREATE FUNCTION 문을 포함해야 합니다. 이는 식의 정의에 대한 필요한 컨텍스트를 제공합니다.

    예를 들어, 다음 SELECT 문을 살펴 보겠습니다. AMBIGUOUS_EXPR 을 만나면 추가 컨텍스트 없이는 이것이 함수 호출인지 DATE 로의 유형 변환을 나타내는지 확인할 수 없습니다. 그러나 COL1 은 테이블 TAB 의 열이므로 COL1 (DATE) 는 유형 변환(CAST) 작업임을 확신할 수 있습니다 .

    CREATE TABLE TAB (
        COL1 VARCHAR(23)
    )
    
    SELECT
        COL1 (DATE),
        AMBIGUOUS_EXPR (DATE)
    FROM TAB;
    
    Copy

    코드 예시

    입력 코드:

    CREATE TABLE TAB (
        COL1 VARCHAR(23)
    )
    
    SELECT
        COL1 (DATE),
        AMBIGUOUS_EXPR (DATE)
    FROM TAB;
    
    Copy

    출력 코드

    CREATE OR REPLACE TABLE TAB (
        COL1 VARCHAR(23)
    )
    COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"teradata"}}'
    ;
    
    SELECT
        TO_DATE(
        COL1, 'YYYY/MM/DD') AS COL1,
        !!!RESOLVE EWI!!! /*** SSC-EWI-TD0091 - EXPRESSION CONVERTED AS CAST BY DEFAULT. CONVERSION MIGHT PRESENT ERRORS DUE TO MISSING DEPENDENCIES FOR 'AMBIGUOUS_EXPR'. ***/!!!
        AMBIGUOUS_EXPR :: DATE
        FROM
        TAB;
    
    Copy

    권장 사항

    SSC-EWI-TD0017

    심각도

    낮음

    설명

    이 경고는 SnowConvert 에서 GLOBAL TEMPORARY TRACE 옵션이 포함된 Create Table 문을 감지할 때 표시됩니다. 이 기능은 Teradata(TRACE 기능))에만 해당되는 기능으로, Snowflake에서는 사용할 수 없으며 변환 중에 제거됩니다.

    코드 예시

    Teradata:

    CREATE GLOBAL TEMPORARY TRACE TABLE TableExample
    (
    ColumnExample Number
    )
    
    Copy

    Snowflake Scripting:

    !!!RESOLVE EWI!!! /*** SSC-EWI-TD0017 - GLOBAL TEMPORARY TABLE TRACE FUNCTIONALITY NOT SUPPORTED ***/!!!
    CREATE OR REPLACE TABLE TableExample (
    ColumnExample NUMBER(38, 18)
    )
    COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"teradata"}}'
    ;
    
    Copy

    권장 사항

    • 참고: EVENT TABLE 을 사용하여 Snowflake에서 추적 기능을 복제할 수 있습니다. 자세한 내용은 로깅 및 추적 에 대한 Snowflake 설명서를 참조하십시오.

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

    SSC-EWI-TD0046

    심각도

    Medium

    설명

    이 오류는 선택한 열과 일치하는 항목이 없는 DBC 테이블을 참조할 때 발생하며, 선택한 열이 Snowflake에서 일치하는 항목이 없습니다.

    코드 예시

    입력:

    CREATE VIEW SAMPLE_VIEW
    AS
    SELECT PROTECTIONTYPE FROM DBC.DATABASES;
    
    Copy

    출력:

    CREATE OR REPLACE VIEW SAMPLE_VIEW
    COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "teradata",  "convertedOn": "08/14/2024" }}'
    AS
    SELECT
    !!!RESOLVE EWI!!! /*** SSC-EWI-TD0046 - BUILT-IN REFERENCE TO PROTECTIONTYPE IS NOT SUPPORTED IN SNOWFLAKE ***/!!!
    PROTECTIONTYPE FROM
    INFORMATION_SCHEMA.DATABASES;
    
    Copy

    권장 사항

    SSC-EWI-TD0023

    심각도

    낮음

    설명

    ACTIVITY_COUNT 상태 변수는 임베디드 SQL 또는 저장 프로시저에 사용되는 경우 SQL DML 문(예: INSERT, UPDATE 또는 DELETE)에 의해 수정된 행 수를 표시합니다. 자세한 내용은 여기에서 확인할 수 있습니다.

    ACTIVITY_COUNT 의 동작을 복제하려면 변환 사양에 설명된 해결 방법을 사용할 수 있습니다.

    SELECT $1 FROM TABLE(RESULT_SCAN(LAST_QUERY_ID()));
    
    Copy

    SELECT 또는 SET INTO VARIABLE 문에 ACTIVITY_COUNT 를 사용하는 경우 앞서 언급한 해결 방법으로 직접 대체할 수 없습니다.

    코드 예시

    Teradata

    REPLACE PROCEDURE InsertEmployeeSalaryAndLog_4 ()
    BEGIN
        DECLARE rowCount INT;
        DECLARE message VARCHAR(100);
    
        INSERT INTO employees (employee_id, first_name, last_name, department_id, salary)
        VALUES (101, 'Alice', 'Smith', 10, 70000.00);
    
        SELECT ACTIVITY_COUNT INTO rowCount;
        SET message = 'ROWS INSERTED: ' || rowCount;
    
        -- Insert the ACTIVITY_COUNT into the activity_log table
        INSERT INTO activity_log (operation, row_count)
        VALUES (message, rowCount);
    END;
    
    Copy

    Snowflake

    CREATE OR REPLACE PROCEDURE InsertEmployeeSalaryAndLog_4 ()
    RETURNS VARCHAR
    LANGUAGE SQL
    COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "teradata",  "convertedOn": "07/15/2024" }}'
    EXECUTE AS CALLER
    AS
    $$
        DECLARE
                   rowCount INT;
                   message VARCHAR(100);
        BEGIN
    
    
                   INSERT INTO employees (employee_id, first_name, last_name, department_id, salary)
                   VALUES (101, 'Alice', 'Smith', 10, 70000.00);
                   SELECT
                ACTIVITY_COUNT !!!RESOLVE EWI!!! /*** SSC-EWI-TD0023 - ACTIVITY_COUNT INSIDE SELECT/SET INTO VARIABLE REQUIRES MANUAL FIX ***/!!! INTO
                :rowCount;
                message := 'ROWS INSERTED: ' || rowCount;
    
                -- Insert the ACTIVITY_COUNT into the activity_log table
                INSERT INTO activity_log (operation, row_count)
                VALUES (:message, :rowCount);
        END;
    $$;
    
    Copy

    수동 수정

    삽입, 업데이트 또는 삭제된 행 수를 검색하려면 위에서 설명한 해결 방법 중 일부를 사용할 수 있습니다.

    CREATE OR REPLACE PROCEDURE InsertEmployeeSalaryAndLog_4 ()
    RETURNS VARCHAR
    LANGUAGE SQL
    COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "teradata",  "convertedOn": "07/15/2024" }}'
    EXECUTE AS CALLER
    AS
    $$
        DECLARE
                   rowCount INT;
                   message VARCHAR(100);
        BEGIN
    
    
                   INSERT INTO employees (employee_id, first_name, last_name, department_id, salary)
                   VALUES (101, 'Alice', 'Smith', 10, 70000.00);
                   SELECT $1 INTO :rowCount FROM TABLE(RESULT_SCAN(LAST_QUERY_ID()));
                message := 'ROWS INSERTED: ' || rowCount;
    
                -- Insert the ACTIVITY_COUNT into the activity_log table
                INSERT INTO activity_log (operation, row_count)
                VALUES (:message, :rowCount);
        END;
    $$;
    
    Copy

    Snowflake에서 이 쿼리를 사용하려면 Snowflake의 SELECT INTO VARIABLE 구문을 사용하도록 수정해야 합니다.

    또한 RESULT_SCAN(LAST_QUERY_ID()) 를 사용할 때 잘못된 결과를 발견하면 SSC-FDM-TD0033의 잠재적인 제한 사항과 해결 방법에 대한 정보에서 확인할 수 있습니다.

    권장 사항

    • 제안된 해결 방법을 수동으로 적용하십시오.

    • SSC-FDM-TD0033를 검토하여 LAST_QUERY_ID 사용의 제한 사항과 처리 방법을 알아보십시오.

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

    SSC-EWI-TD0051

    심각도

    낮음

    설명

    바이트 데이터 타입으로 작업할 때 Teradata와 Snowflake 사이에는 중요한 차이점이 있습니다.

    • Teradata에서 BYTES 함수는 고정 길이 저장소를 사용하기 때문에 항상 후행 0을 계산합니다. 즉, 실제 데이터 크기가 아닌 열의 크기를 반환합니다.

    • Snowflake에서 LENGTH 함수는 이진 타입에 가변 길이 저장소를 사용하기 때문에 저장된 데이터의 실제 크기를 반환합니다.

    다음은 이 차이를 설명하는 예시입니다.

    Teradata:

    create table exampleTable(
    	bytecol byte(10)
    );
    
    insert into exampleTable values ('2B'XB);
    
    select bytes(bytecol) from exampleTable;
    -- Will return 10, the size of bytecol
    
    Copy

    Snowflake에 해당하는 코드:

    CREATE OR REPLACE TABLE exampleTable (
    	bytecol BINARY
    )
    COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"teradata"}}'
    ;
    
    INSERT INTO exampleTable
    VALUES (TO_BINARY('2B'));
    
    SELECT
    	LENGTH(bytecol) !!!RESOLVE EWI!!! /*** SSC-EWI-TD0051 - TERADATA BYTES FUNCTION RESULTS DIFFER FROM SNOWFLAKE LENGTH FUNCTION FOR BYTE TYPE COLUMNS ***/!!! from
    	exampleTable;
    	-- Will return 10, the size of bytecol
    
    Copy

    코드 예시:

    입력 코드:

    create table sampleTable(
        byteColumn byte(10),
        varbyteColumn varbyte(15)
    );
    
    select bytes(byteColumn), bytes(varbyteColumn) from sampleTable;
    
    Copy

    출력 코드:

    CREATE OR REPLACE TABLE sampleTable (
        byteColumn BINARY,
        varbyteColumn BINARY(15)
    )
    COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"teradata"}}'
    ;
    
    SELECT
        LENGTH(byteColumn) !!!RESOLVE EWI!!! /*** SSC-EWI-TD0051 - TERADATA BYTES FUNCTION RESULTS DIFFER FROM SNOWFLAKE LENGTH FUNCTION FOR BYTE TYPE COLUMNS ***/!!!,
        LENGTH(varbyteColumn) from
        sampleTable;
    
    Copy

    권장 사항

    • BYTES 함수 결과 분석 결과 Snowflake LENGTH 함수가 이미 원하는 동작을 제공하고 있으므로 수정이 필요하지 않습니다.

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

    SSC-EWI-TD0034

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

    심각도

    낮음

    설명

    단일 요청에서 여러 개의 SQL 문을 실행하는 것은 지원되지 않습니다. 요청이 단일 트랜잭션으로 처리되었습니다.

    이 오류 경고 정보(EWI)는 PL 대상 언어 플래그가 ‘–PLTargetLanguage Javascript’ 명령을 사용하여 Javascript로 설정된 경우에만 표시됩니다.

    코드 예시

    입력:

    -- Additional Params: --PLTargetLanguage Javascript
    REPLACE PROCEDURE proc1()
      BEGIN
        BEGIN REQUEST;
          SELECT* FROM TABLE1;
        END REQUEST;
    END;
    
    Copy

    출력:

    CREATE OR REPLACE PROCEDURE proc1 ()
    RETURNS STRING
    LANGUAGE JAVASCRIPT
    COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"teradata"}}'
    EXECUTE AS CALLER
    AS
    $$
      // SnowConvert Helpers Code section is omitted.
    
      var TRANSACTION_HANDLER = function (error) {
        throw error;
      };
      // ** SSC-EWI-TD0034 - MULTISTATEMENT SQL EXECUTION NOT SUPPORTED, REQUEST HANDLED AS TRANSACTION **
      try {
        EXEC(`BEGIN`);
        EXEC(`SELECT
       *
    FROM
       TABLE1`,[],undefined,TRANSACTION_HANDLER);
        EXEC(`COMMIT`);
      } catch(error) {
        EXEC(`ROLLBACK`);
      }
    $$;
    
    Copy

    권장 사항

    SSC-EWI-TD0024

    심각도

    낮음

    설명

    이 경고는 저장 프로시저 내에서 주석 처리된 ABORT 문 내에 AGGREGATE 함수를 사용할 때 표시됩니다.

    코드 예시

    Teradata:

    REPLACE PROCEDURE ABORT_SAMPLE()
    BEGIN
        ABORT WHERE SUM(TABLE1.COL1) < 2;
    END;
    
    Copy

    Snowflake Scripting:

    CREATE OR REPLACE PROCEDURE ABORT_SAMPLE()
    RETURNS VARCHAR
    LANGUAGE SQL
    COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"teradata"}}'
    EXECUTE AS CALLER
    AS
    $$
        BEGIN
            !!!RESOLVE EWI!!! /*** SSC-EWI-TD0024 - ABORT STATEMENT IS NOT SUPPORTED DUE TO AN AGGREGATE FUNCTION ***/!!!
            ABORT WHERE SUM(TABLE1.COL1) < 2;
        END;
    $$;
    
    Copy

    권장 사항

    SSC-EWI-TD0010

    심각도

    낮음

    설명

    텍스트를 대문자로 변환하는 데 사용되는 UPPERCASE 열 특성은 Snowflake에서 사용할 수 없습니다.

    코드 예시

    Teradata:

    CREATE TABLE T_2010
    (
        col1 VARCHAR(1) UPPERCASE
    );
    
    Copy

    Snowflake Scripting:

    CREATE OR REPLACE TABLE T_2010 (
        col1 VARCHAR(1)
                        !!!RESOLVE EWI!!! /*** SSC-EWI-TD0010 - UPPERCASE NOT SUPPORTED BY SNOWFLAKE ***/!!!
     UPPERCASE
    )
    COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"teradata"}}'
    ;
    
    Copy

    권장 사항

    • UPPERCASE 절은 데이터를 저장할 때 소문자를 대문자로 변환합니다. 예를 들어, ‘aaa’는 ‘AAA’로 저장됩니다. 이를 처리하려면 모든 삽입 문에 UPPER 함수를 모든 삽입 문에 추가하면 됩니다. 그러나 외부 데이터를 로딩하는 ETL 프로세스도 수정해야 한다는 점에 유의하십시오.

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

    SSC-EWI-TD0041

    심각도

    낮음

    설명

    제공한 파일 형식이 시스템에서 지원되지 않습니다.

    코드 예시

    입력:

    SELECT
        cast(T_2041.integer_column as integer);
    
    Copy

    출력:

    SELECT
        cast(TRUNC(T_2041.integer_column) as integer) !!!RESOLVE EWI!!! /*** SSC-EWI-TD0041 - TRUNC FUNCTION WAS ADDED TO ENSURE INTEGER. MAY NEED CHANGES IF NOT NUMERIC OR STRING. ***/!!!;
    
    Copy

    권장 사항

    SSC-EWI-TD0061

    심각도

    낮음

    설명

    SnowConvert 는 열 데이터를 테이블의 행으로 변환하는 TD_UNPIVOT 함수를 지원하거나 변환하지 않습니다.

    이 변환이 올바르게 작동하려면 테이블의 열 이름에 대한 정보가 필요합니다. 이 정보를 사용할 수 없는 경우 결과에서 열이 누락되는 등 변환이 불완전할 수 있습니다. 이러한 경우 EWI (오류, 경고, 정보) 메시지가 생성됩니다.

    코드 예시

    입력 코드:

    CREATE TABLE unpivotTable  (
    	myKey INTEGER NOT NULL PRIMARY KEY,
    	firstSemesterIncome DECIMAL(10,2),
    	secondSemesterIncome DECIMAL(10,2),
    	firstSemesterExpenses DECIMAL(10,2),
    	secondSemesterExpenses DECIMAL(10,2)
    );
    
    SELECT * FROM
     TD_UNPIVOT(
     	ON unpivotTable
     	USING
     	VALUE_COLUMNS('Income', 'Expenses')
     	UNPIVOT_COLUMN('Semester')
     	COLUMN_LIST('firstSemesterIncome, firstSemesterExpenses', 'secondSemesterIncome, secondSemesterExpenses')
     	COLUMN_ALIAS_LIST('First', 'Second')
     )X ORDER BY mykey;
    
    SELECT * FROM
     TD_UNPIVOT(
     	ON unknownTable
     	USING
     	VALUE_COLUMNS('MonthIncome')
     	UNPIVOT_COLUMN('Months')
     	COLUMN_LIST('januaryIncome', 'februaryIncome', 'marchIncome', 'aprilIncome')
     	COLUMN_ALIAS_LIST('January', 'February', 'March', 'April')
     )X ORDER BY yearKey;
    
    Copy

    출력 코드:

    CREATE OR REPLACE TABLE unpivotTable (
    	myKey INTEGER NOT NULL PRIMARY KEY,
    	firstSemesterIncome DECIMAL(10,2),
    	secondSemesterIncome DECIMAL(10,2),
    	firstSemesterExpenses DECIMAL(10,2),
    	secondSemesterExpenses DECIMAL(10,2)
    )
    COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"teradata"}}'
    ;
    
    --** SSC-FDM-0007 - MISSING DEPENDENT OBJECTS "VALUE_COLUMNS", "UNPIVOT_COLUMN", "COLUMN_LIST", "COLUMN_ALIAS_LIST" **
    SELECT
    	* FROM
    	(
    		SELECT
    			myKey,
    			TRIM(GET_IGNORE_CASE(OBJECT_CONSTRUCT('FIRSTSEMESTERINCOME', 'First', 'FIRSTSEMESTEREXPENSES', 'First', 'SECONDSEMESTERINCOME', 'Second', 'SECONDSEMESTEREXPENSES', 'Second'), Semester), '"') AS Semester,
    			Income,
    			Expenses
    		FROM
    			unpivotTable UNPIVOT(Income FOR Semester IN (
    				firstSemesterIncome,
    				secondSemesterIncome
    			)) UNPIVOT(Expenses FOR Semester1 IN (
    				firstSemesterExpenses,
    				secondSemesterExpenses
    			))
    		WHERE
    			Semester = 'FIRSTSEMESTERINCOME'
    			AND Semester1 = 'FIRSTSEMESTEREXPENSES'
    			OR Semester = 'SECONDSEMESTERINCOME'
    			AND Semester1 = 'SECONDSEMESTEREXPENSES'
    	) X ORDER BY mykey;
    
    	--** SSC-FDM-0007 - MISSING DEPENDENT OBJECTS "VALUE_COLUMNS", "UNPIVOT_COLUMN", "COLUMN_LIST", "COLUMN_ALIAS_LIST" **
    	SELECT
    	* FROM
    	!!!RESOLVE EWI!!! /*** SSC-EWI-TD0061 - TD_UNPIVOT TRANSFORMATION REQUIRES COLUMN INFORMATION THAT COULD NOT BE FOUND, COLUMNS MISSING IN RESULT ***/!!!
    	(
    		SELECT
    			TRIM(GET_IGNORE_CASE(OBJECT_CONSTRUCT('JANUARYINCOME', 'January', 'FEBRUARYINCOME', 'February', 'MARCHINCOME', 'March', 'APRILINCOME', 'April'), Months), '"') AS Months,
    			MonthIncome
    		FROM
    			unknownTable UNPIVOT(MonthIncome FOR Months IN (
    				januaryIncome,
    				februaryIncome,
    				marchIncome,
    				aprilIncome
    			))
    	) X ORDER BY yearKey;
    
    Copy

    권장 사항

    • 두 가지 방법 중 하나를 사용하여 변환 도구에 열 정보를 제공할 수 있습니다.

      • TD_UNPIVOT 호출과 동일한 파일에 테이블 사양을 포함합니다

      • SELECT * 또는 테이블 이름만 사용하는 대신 ON 식의 SELECT 쿼리에 특정 열을 나열합니다

    • 입력 테이블에서 ALL 열의 피벗을 해제하는 경우 이 문제를 무시할 수 있습니다. 그러나 일부 열만 피벗을 해제하는 경우 데이터가 누락됩니다.

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

    SSC-EWI-TD0004

    심각도

    낮음

    설명

    Snowflake 프로시저에는 Teradata의 계속 처리기 기능에 대한 직접적인 대응 기능이 없습니다. SnowConvert 는 일부 예외 코드를 처리하고 유사한 동작을 모방할 수 있지만 계속 처리기 문에서 지원되지 않는 예외 코드가 발생하면 EWI (오류, 경고 또는 정보) 메시지를 생성합니다.

    코드 예시

    Teradata:

    REPLACE PROCEDURE PURGING_ADD_TABLE
    (
     IN inDatabaseName     	VARCHAR(30),
     IN inTableName    		VARCHAR(30)
    )
    BEGIN
     DECLARE vCHAR_SQLSTATE CHAR(5);
     DECLARE vSUCCESS       CHAR(5);
    
      DECLARE CONTINUE HANDLER FOR SQLSTATE 'UNSUPPORTED'
      BEGIN
         SET vCHAR_SQLSTATE = SQLCODE;
         SET vSUCCESS    = SQLCODE;
      END;
    
      SELECT 1;
    
    END;
    
    Copy

    Snowflake Scripting:

    CREATE OR REPLACE PROCEDURE PURGING_ADD_TABLE
    (INDATABASENAME VARCHAR(30), INTABLENAME VARCHAR(30)
    )
    RETURNS VARCHAR
    LANGUAGE SQL
    COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "teradata",  "convertedOn": "07/04/2024" }}'
    EXECUTE AS CALLER
    AS
    $$
     DECLARE
      vCHAR_SQLSTATE CHAR(5);
      vSUCCESS       CHAR(5);
     BEGIN
    
    
      !!!RESOLVE EWI!!! /*** SSC-EWI-TD0004 - NOT SUPPORTED SQL EXCEPTION ON CONTINUE HANDLER ***/!!!
    
      DECLARE CONTINUE HANDLER FOR SQLSTATE 'UNSUPPORTED'
      BEGIN
       vCHAR_SQLSTATE := SQLCODE;
       vSUCCESS := SQLCODE;
      END;
      SELECT
       1;
     END;
    $$;
    
    Copy

    권장 사항

    SSC-EWI-TD0055

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

    세션 매개 변수에 종속되는 요소 형식 지정하기

    다음 Teradata 형식 요소는 특정 세션 매개 변수 설정이 필요한 Snowflake 함수에 매핑됩니다. Teradata와 Snowflake 간에 일관된 결과를 보장하려면 이러한 세션 매개 변수를 Teradata 설정과 일치하도록 구성해야 합니다.

    • D: DAYOFWEEK 함수에 매핑됩니다. 기본 설정이 다르기 때문에 Teradata와 Snowflake 간에 결과 세트가 다를 수 있습니다. Teradata는 일요일을 요일의 첫 번째 날로 사용하는 반면, Snowflake는 월요일을 사용합니다.

    • WW: WEEK 함수에 매핑됩니다. 주별 계산 정책에 따라 결과가 다를 수 있습니다. Snowflake는 기본적으로 ISO 표준을 사용하지만(첫 주에는 1월 중 최소 4일이 포함되어야 함), Teradata는 1월 1일을 첫 주의 시작으로 간주합니다.

    세션 매개 변수를 변경하려면 ALTER SESSION SET parameter_name = value 명령을 사용합니다. 사용 가능한 세션 매개 변수와 그 사용법에 대한 자세한 내용은 이 페이지 를 참조하십시오.

    TO_CHAR 의 단일 매개 변수 버전

    단일 매개 변수가 있는 TO_CHAR(Datetime) 함수는 세션 매개 변수에 정의된 기본 날짜 및 시간 형식을 사용합니다. 이러한 매개 변수에는 다음이 포함됩니다.

    • TIMESTAMP_LTZ_OUTPUT_FORMAT

    • TIMESTAMP_NTZ_OUTPUT_FORMAT

    • TIMESTAMP_TZ_OUTPUT_FORMAT

    • TIME_OUTPUT_FORMAT

    Teradata와 Snowflake 간의 일관된 동작을 보장하려면 이러한 매개 변수가 Teradata 설정과 일치하는지 확인하십시오.

    TO_CHAR(Numeric) 을 사용하여 숫자 값을 문자열로 변환하는 경우 Snowflake는 자동으로 TM9 또는 TME 형식을 사용하여 간결한 문자열 표현을 생성합니다. Teradata는 기본적으로 간결한 숫자 표현도 생성하므로 추가 형식 지정이 필요하지 않습니다.

    코드 예시

    입력 코드:

    select to_char(date '2008-09-13', 'DD/RM/YYYY');
    
    select to_char(date '2010-10-20', 'DS');
    
    select to_char(1255.495, 'SC9999.9999', 'nls_iso_currency = ''EUR''');
    
    select to_char(45620);
    
    Copy

    출력 코드:

    SELECT
    TO_CHAR(date '2008-09-13', 'DD/') || PUBLIC.ROMAN_NUMERALS_MONTH_UDF(date '2008-09-13') || TO_CHAR(date '2008-09-13', '/YYYY') !!!RESOLVE EWI!!! /*** SSC-EWI-TD0055 - SNOWFLAKE SUPPORTED FORMATS FOR TO_CHAR DIFFER FROM TERADATA AND MAY FAIL OR HAVE DIFFERENT BEHAVIOR ***/!!!;
    
    SELECT
    TO_CHAR(date '2010-10-20', 'MM/DD/YYYY') !!!RESOLVE EWI!!! /*** SSC-EWI-TD0055 - SNOWFLAKE SUPPORTED FORMATS FOR TO_CHAR DIFFER FROM TERADATA AND MAY FAIL OR HAVE DIFFERENT BEHAVIOR ***/!!!;
    
    SELECT
    PUBLIC.INSERT_CURRENCY_UDF(TO_CHAR(1255.495, 'S9999.0000'), 2, 'EUR') !!!RESOLVE EWI!!! /*** SSC-EWI-TD0055 - SNOWFLAKE SUPPORTED FORMATS FOR TO_CHAR DIFFER FROM TERADATA AND MAY FAIL OR HAVE DIFFERENT BEHAVIOR ***/!!!;
    
    SELECT
    TO_CHAR(45620) !!!RESOLVE EWI!!! /*** SSC-EWI-TD0055 - SNOWFLAKE SUPPORTED FORMATS FOR TO_CHAR DIFFER FROM TERADATA AND MAY FAIL OR HAVE DIFFERENT BEHAVIOR ***/!!!;
    
    Copy

    권장 사항

    • 형식 함수(FF)로 작업할 때는 Teradata의 전체 자릿수와 일치하는 DateTime 유형을 사용하거나 형식 요소에 전체 자릿수를 지정하여 일관된 동작을 보장합니다.

    • 타임존 형식의 경우 일관된 결과를 얻으려면 첫 번째 매개 변수가 TIMESTAMP_TZ 유형인지 확인하십시오. Snowflake의 TIME 데이터 타입은 타임존 정보를 지원하지 않습니다.

    • 일관된 동작을 유지하기 위해 세션 매개 변수를 Teradata의 기본값과 일치하도록 구성합니다.

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

    SSC-EWI-TD0082

    심각도

    Medium

    설명

    현재 인코딩 매개 변수가 있는 변환 함수는 Snowflake에서 사용할 수 없습니다. 변환 과정에서 이 함수는 설명이 추가됩니다.

    코드 예시

    입력 코드:

    SELECT Translate('abc' USING KANJISJIS_TO_LATIN);
    
    Copy

    출력 코드

    SELECT
    !!!RESOLVE EWI!!! /*** SSC-EWI-TD0082 - TRANSLATE FUNCTION USING KANJISJIS_TO_LATIN ENCODING IS NOT SUPPORTED ***/!!!
    Translate('abc' USING KANJISJIS_TO_LATIN);
    
    Copy

    권장 사항

    SSC-EWI-TD0020

    이 경고 메시지는 더 이상 사용되지 않습니다. 최신 설명서는 SSC-EWI-0009를 참조하십시오.

    심각도

    낮음

    설명

    Snowflake는 현재 POSIX 기본 정규식 구문만 지원합니다. 고급 정규식 기능은 사용할 수 없습니다.

    이 경고는 REGEX_SUBSTR, REGEX_REPLACE 또는 REGEX_INSTR 에 대한 함수 호출이 Snowflake로 변환될 때마다 표시됩니다. 사용자에게 일부 정규식 기능이 Snowflake에서 지원되지 않을 수 있음을 경고합니다. 중요한 지원되지 않는 기능에는 다음이 있습니다.

    • Lookahead

    • Lookbehind

    • Non-capturing groups

    코드 예시

    Teradata:

    SELECT REGEXP_SUBSTR('qaqequ','q(?=u)', 1, 1);
    
    Copy

    Snowflake Scripting:

    SELECT
    !!!RESOLVE EWI!!! /*** SSC-EWI-TD0020 - REGEXP_SUBSTR FUNCTION ONLY SUPPORTS POSIX REGULAR EXPRESSIONS ***/!!!
    REGEXP_SUBSTR('qaqequ','q(?=u)', 1, 1);
    
    Copy

    권장 사항

    • 각 정규식 패턴을 검토하여 수동 조정이 필요한지 식별합니다. Snowflake의 정규식 기능 및 대체 옵션에 대한 자세한 내용은 여기에서 확인할 수 있습니다.

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

    SSC-EWI-TD0060

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

    심각도

    낮음

    설명

    SnowConvert 도구는 JSON_TABLE 함수를 변환할 수 있지만, 변환을 올바르게 수행하려면 JSON_TABLE ON 하위 쿼리에서 선택되는 특정 열 이름을 알아야 합니다.

    이 경고는 열 이름이 하위 쿼리에 명시적으로 지정되지 않은 경우(예: SELECT *)와 같이 시스템이 테이블의 구조 정보를 찾을 수 없는 경우에 표시됩니다. 이 정보가 없으면 열 이름을 자동으로 결정할 수 없습니다.

    JSON 데이터를 테이블에 로딩하는 방법을 알아보려면 설명서 페이지 를 참조하십시오.

    코드 예시

    입력 코드:

    CREATE TABLE demo.Train (
        firstCol INT,
        jsonCol JSON(400),
        thirdCol VARCHAR(30)
    );
    
    SELECT * FROM JSON_TABLE
    (ON (SELECT T.*
               FROM demo.Train T)
    USING rowexpr('$.schools[*]')
                   colexpr('[ {"jsonpath" : "$.name",
                               "type" : "CHAR(20)"},
                              {"jsonpath" : "$.type",
                               "type" : "VARCHAR(20)"}]')
    )
    AS JT;
    
    SELECT * FROM JSON_TABLE
    (ON (SELECT T.*
               FROM demo.missingTable T)
    USING rowexpr('$.schools[*]')
                   colexpr('[ {"jsonpath" : "$.name",
                               "type" : "CHAR(20)"},
                              {"jsonpath" : "$.type",
                               "type" : "VARCHAR(20)"}]')
    )
    AS JT;
    
    Copy

    출력 코드:

    CREATE OR REPLACE TABLE demo.Train (
        firstCol INT,
        jsonCol VARIANT,
        thirdCol VARCHAR(30)
    )
    COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "teradata",  "convertedOn": "12/16/2024",  "domain": "test" }}'
    ;
    
    SELECT
        * FROM
        (
            SELECT
                firstCol,
                rowexpr.value:name :: CHAR(20) AS Column_0,
                rowexpr.value:type :: VARCHAR(20) AS Column_1,
                thirdCol
            FROM
                demo.Train T,
                TABLE(FLATTEN(INPUT => jsonCol:schools)) rowexpr
        ) JT;
    
        SELECT
        * FROM
        !!!RESOLVE EWI!!! /*** SSC-EWI-TD0060 - JSON_TABLE NOT TRANSFORMED, COLUMN NAMES COULD NOT BE RETRIEVED FROM SEMANTIC INFORMATION ***/!!! JSON_TABLE
       (ON (
            SELECT
                T.*
                      FROM
                demo.missingTable T)
       USING rowexpr('$.schools[*]')
                      colexpr('[ {"jsonpath" : "$.name",
                               "type" : "CHAR(20)"},
                              {"jsonpath" : "$.type",
                               "type" : "VARCHAR(20)"}]')
       )
       AS JT;
    
    Copy

    권장 사항

    • SnowConvert 에 코드를 제공할 때 테이블 정의를 포함해야 합니다. 이 기능이 없으면 코드를 다시 실행해야 합니다.

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

    SSC-EWI-TD0031

    심각도

    낮음

    설명

    Teradata와 Snowflake의 CHAR 데이터 타입을 비교할 때 주목해야 할 중요한 차이점이 있습니다. Teradata에서 CHAR 은 길이가 고정되어 있으므로 LIKE 함수는 후행 공백을 포함하여 전체 열 길이를 일치시키려고 시도합니다. 이로 인해 예상치 못한 결과가 발생할 수 있습니다. 반면, Snowflake의 CHAR 유형은 길이가 변수이므로 LIKE 함수는 후행 공백을 고려하지 않고 실제 저장된 값과만 일치시킵니다. 다음은 이 동작을 설명하는 예제입니다.

    코드 예시

    입력:

    CREATE TABLE table1
    (
        col1 VARCHAR(36),
        col2 CHAR(36)
    );
    
    INSERT INTO table1 VALUES ('Gabriel', 'Gabriel');
    INSERT INTO table1 VALUES ('Barnum', 'Barnum');
    INSERT INTO table1 VALUES ('Sergio', 'Sergio');
    
    SELECT col1 FROM table1 where col1 LIKE 'Barnum';
    -- The result is a single row with 'Barnum'
    SELECT col2 FROM table1 where col2 LIKE 'Barnum';
    -- It does not return any row
    
    Copy

    출력:

    CREATE OR REPLACE TABLE table1
    (
        col1 VARCHAR(36),
        col2 CHAR(36)
    )
    COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"teradata"}}'
    ;
    
    INSERT INTO table1
    VALUES ('Gabriel', 'Gabriel');
    
    INSERT INTO table1
    VALUES ('Barnum', 'Barnum');
    
    INSERT INTO table1
    VALUES ('Sergio', 'Sergio');
    
    SELECT
        col1 FROM
        table1
    where col1 LIKE 'Barnum';
    -- The result is a single row with 'Barnum'
        SELECT
        col2 FROM
        table1
        where
        !!!RESOLVE EWI!!! /*** SSC-EWI-TD0031 - THE RESULT OF LIKE MAY DIFFER DUE TO CHAR TYPE HAVING A FIXED LENGTH IN TERADATA ***/!!! col2 LIKE 'Barnum';
        -- It does not return any row
    
    Copy

    권장 사항

    SSC-EWI-TD0005

    심각도

    중요

    설명

    코드가 성공적으로 변환되었지만 이 기능이 아직 완전히 구현되지 않았기 때문에 의도한 대로 작동하지 않을 수 있습니다.

    이 경고는 사용자에게 이 문을 사용하면 원래 스크립트와 다른 기능이 생성된다는 것을 알려줍니다.

    예제 소스

    BTEQ 입력 코드:

    .SET SIDETITLES ON
    
    Copy

    Python 출력 코드:

    #*** Generated code is based on the SnowConvert Python Helpers version 2.0.6 ***
    
    import os
    import sys
    import snowconvert.helpers
    from snowconvert.helpers import Export
    from snowconvert.helpers import exec
    from snowconvert.helpers import BeginLoading
    con = None
    def main():
      snowconvert.helpers.configure_log()
      con = snowconvert.helpers.log_on()
      #** SSC-EWI-TD0005 - THE STATEMENT WAS CONVERTED BUT ITS FUNCTIONALITY IS NOT IMPLEMENTED YET **
      Export.side_titles(True)
      snowconvert.helpers.quit_application()
    
    if __name__ == "__main__":
      main()
    
    Copy

    권장 사항

    SSC-EWI-TD0083

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

    심각도

    Medium

    설명

    SnowConvert 는 여러 개의 복잡한 SELECT 문을 동시에 처리할 수 없습니다. 이러한 문을 변환하려면 공통 테이블 식(CTEs) 또는 복합 FROM 절에 매핑해야 하므로 컴파일 오류 또는 무한 논리 루프가 발생할 수 있기 때문에 이러한 제한이 존재합니다.

    SELECT 복합 절은 무엇으로 간주해야 하나요?

    공통 테이블 표현식(CTE) 또는 복합 FROM 절에 매핑해야 하는 문으로 NORMALIZE, EXPAND ON, RESET WHEN 함수를 포함합니다.

    코드 예시

    입력 코드:

    SELECT
       NORMALIZE emp_id,
       duration,
       dept_id,
       balance,
       (
         ROW_NUMBER() OVER (
           PARTITION BY emp_id
           ORDER BY
             dept_id RESET WHEN balance <= SUM(balance) OVER (
               PARTITION BY emp_id
               ORDER BY dept_id
               ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING
             )
         ) -1
       ) AS balance_increase
    FROM project
    EXPAND ON duration AS bg BY ANCHOR ANCHOR_SECOND
    ORDER BY 1, 2;
    
    Copy

    출력 코드

    // SnowConvert Helpers Code section is omitted.
    SELECT
    !!!RESOLVE EWI!!! /*** SSC-EWI-TD0083 - NOT ABLE TO TRANSFORM TWO OR MORE COMPLEX SELECT CLAUSES AT A TIME ***/!!!
    NORMALIZE emp_id,
       duration,
       dept_id,
       balance,
       (
         ROW_NUMBER() OVER (
       PARTITION BY
          emp_id, new_dynamic_part
       ORDER BY
             dept_id
         ) -1
       ) AS balance_increase
    FROM
       (
          SELECT
             emp_id,
             duration,
             dept_id,
             balance,
             previous_value,
             SUM(dynamic_part) OVER (
                     PARTITION BY emp_id
                     ORDER BY dept_id
             ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
                   ) AS new_dynamic_part
          FROM
             (
                SELECT
                   emp_id,
                   duration,
                   dept_id,
                   balance,
                   SUM(balance) OVER (
                           PARTITION BY emp_id
                           ORDER BY dept_id
                           ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING
                         ) AS previous_value,
                   (CASE
                      WHEN balance <= previous_value
                         THEN 1
                      ELSE 0
                   END) AS dynamic_part
                FROM
                   project
             )
       )
    !!!RESOLVE EWI!!! /*** SSC-EWI-TD0083 - NOT ABLE TO TRANSFORM TWO OR MORE COMPLEX SELECT CLAUSES AT A TIME ***/!!!
    EXPAND ON duration AS bg BY ANCHOR ANCHOR_SECOND
    ORDER BY 1, 2;
    
    Copy

    권장 사항

    SSC-EWI-TD0070

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

    심각도

    Medium

    설명

    SC 에서 Goto 문을 레이블 섹션으로 대체할 때 반환 문이 없는 경우 섹션 끝에 자동으로 반환 문이 추가됩니다. 이렇게 하면 프로그램의 실행 플로우가 원본 코드와 동일하게 유지됩니다.

    BTEQ Goto 명령이 실행되면 Goto 명령과 해당 레이블 사이의 모든 문은 건너뜁니다. 레이블에 도달한 후 의도하지 않은 실행을 방지하려면 레이블 섹션에 반환 문을 포함해야 합니다.

    Goto 명령이 실행되면 일치하는 레이블에 도달할 때까지 모든 문을 건너뛴다는 점에 유의하십시오. 그러면 해당 레이블에서 프로그램 실행이 계속됩니다. Goto 명령 이전에 정의된 모든 레이블 섹션은 실행되지 않습니다.

    코드 예시

    입력 코드:

    -- Additional Params: --scriptsTargetLanguage SnowScript
    .LOGON dbc,dbc;
    select 'STATEMENTS';
    .GOTO LABEL_B
    select 'IGNORED STATEMENTS';
    .label LABEL_B
    select 'LABEL_B STATEMENTS';
    
    Copy

    출력 코드

    EXECUTE IMMEDIATE
    $$
      DECLARE
        STATUS_OBJECT OBJECT := OBJECT_CONSTRUCT('SQLCODE', 0);
      BEGIN
        --.LOGON dbc,dbc
        !!!RESOLVE EWI!!! /*** SSC-EWI-0073 - PENDING FUNCTIONAL EQUIVALENCE REVIEW FOR 'BTLogOn' NODE ***/!!!
        null;
        BEGIN
          SELECT
            'STATEMENTS';
          STATUS_OBJECT := OBJECT_CONSTRUCT('SQLROWCOUNT', SQLROWCOUNT);
        EXCEPTION
          WHEN OTHER THEN
            STATUS_OBJECT := OBJECT_CONSTRUCT('SQLCODE', SQLCODE, 'SQLERRM', SQLERRM, 'SQLSTATE', SQLSTATE);
        END;
    
        /*.label LABEL_B*/
    
        BEGIN
          SELECT
            'LABEL_B STATEMENTS';
          STATUS_OBJECT := OBJECT_CONSTRUCT('SQLROWCOUNT', SQLROWCOUNT);
        EXCEPTION
          WHEN OTHER THEN
            STATUS_OBJECT := OBJECT_CONSTRUCT('SQLCODE', SQLCODE, 'SQLERRM', SQLERRM, 'SQLSTATE', SQLSTATE);
        END;
        !!!RESOLVE EWI!!! /*** SSC-EWI-TD0070 - A RETURN STATEMENT WAS ADDED AT THE END OF THE LABEL SECTION LABEL_B TO ENSURE THE SAME EXECUTION FLOW ***/!!!
        RETURN 0;
        BEGIN
          SELECT
            'IGNORED STATEMENTS';
          STATUS_OBJECT := OBJECT_CONSTRUCT('SQLROWCOUNT', SQLROWCOUNT);
        EXCEPTION
          WHEN OTHER THEN
            STATUS_OBJECT := OBJECT_CONSTRUCT('SQLCODE', SQLCODE, 'SQLERRM', SQLERRM, 'SQLSTATE', SQLSTATE);
        END;
        /*.label LABEL_B*/
        --** SSC-FDM-0027 - REMOVED NEXT STATEMENT, NOT APPLICABLE IN SNOWFLAKE.  **
    
        BEGIN
          SELECT
            'LABEL_B STATEMENTS';
          STATUS_OBJECT := OBJECT_CONSTRUCT('SQLROWCOUNT', SQLROWCOUNT);
        EXCEPTION
          WHEN OTHER THEN
            STATUS_OBJECT := OBJECT_CONSTRUCT('SQLCODE', SQLCODE, 'SQLERRM', SQLERRM, 'SQLSTATE', SQLSTATE);
        END;
      END
    $$
    
    Copy

    권장 사항

    SSC-EWI-TD0001

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

    심각도

    낮음

    설명

    이 경고는 SnowConvert 가 별칭이 지정된 식의 재귀 패턴을 식별할 때 표시됩니다. 이러한 경우 SnowConvert 는 Snowflake에서 별칭이 올바르게 작동하는 데 필요한 정방향 별칭 변환을 수행할 수 없습니다.

    재귀 별칭은 2개 이상의 별칭이 순환 패턴으로 서로를 참조할 때 발생합니다. 이는 Alias A가 Alias B를 참조하고 Alias B가 Alias A를 참조하는 직접적으로 발생할 수도 있고, 여러 개의 Medium 별칭을 통해 순환 참조가 발생하는 간접적으로(경유적으로) 발생할 수도 있습니다.

    코드 예시

    참고: Snowflake는 일반적으로 재귀 별칭을 지원하지 않지만 일부 기본적인 경우는 지원됩니다.

    참고: Snowflake는 일반적으로 재귀 별칭을 지원하지 않습니다. 그러나 아래 예시와 같이 몇 가지 기본 케이스는 지원됩니다.

    아래 코드는 마이그레이션 프로세스를 완료한 후 Snowflake에서 성공적으로 실행되는 모습을 보여줍니다.

    Teradata:

    SELECT
        COL1 AS COL2,
        COL2 AS COL1
    FROM
        TABLE_EXAMPLE;
    
    Copy

    Snowflake Scripting:

    // SnowConvert Helpers Code section is omitted.
    SELECT
        COL1 AS COL2,
        !!!RESOLVE EWI!!! /*** SSC-EWI-TD0001 - 'COL1' HAS RECURSIVE REFERENCES. FORWARD ALIAS CONVERSION COULD NOT BE COMPLETED ***/!!!
        COL2 AS COL1
    FROM
        TABLE_EXAMPLE;
    
    Copy

    아래 코드 예제는 올바르게 실행되지 않습니다.

    Teradata:

    SELECT
        A + B as C,
        COL2 + C AS A,
        COL3 AS B
    FROM
        TABLE_EXAMPLE;
    
    Copy

    Snowflake Scripting:

    // SnowConvert Helpers Code section is omitted.
    SELECT
        !!!RESOLVE EWI!!! /*** SSC-EWI-TD0001 - 'A' HAS RECURSIVE REFERENCES. FORWARD ALIAS CONVERSION COULD NOT BE COMPLETED ***/!!!
        COL2 + C AS A,
        COL3 AS B,
        A + B as C
    FROM
        TABLE_EXAMPLE;
    
    Copy

    권장 사항

    • 코드에 재귀 정방향 별칭이 있는지 확인하십시오. EWI 는 첫 번째 재귀 별칭을 식별하지만 코드에 주의가 필요한 다른 별칭이 있을 수 있습니다.

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

    SSC-EWI-TD0087

    이 설명서는 더 이상 유지 관리되지 않습니다. 최신 정보는 SSC-FDM-TD0026를 참조하십시오.

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

    심각도

    Medium

    설명

    SQL IF 문 기능을 복제할 때 개발자는 종종 GOTO 명령과 IF 및 LABEL 명령을 결합합니다. 이러한 조합은 if, if-else 또는 if-elseif-else 문으로 직접 변환할 수 있습니다. 이러한 경우 GOTO 명령은 중복되므로 LABEL 섹션으로 대체되지 않도록 제거해야 합니다.

    코드 예시

    입력 코드:

    -- Additional Params: --scriptsTargetLanguage SnowScript
    .If ActivityCount = 0 THEN .GOTO endIf
    DROP TABLE TABLE1;
    .Label endIf
    SELECT A FROM TABLE1;
    
    Copy

    출력 코드

    EXECUTE IMMEDIATE
    $$
      DECLARE
        STATUS_OBJECT OBJECT := OBJECT_CONSTRUCT('SQLCODE', 0);
      BEGIN
        IF (NOT (STATUS_OBJECT['SQLROWCOUNT'] = 0)) THEN
          !!!RESOLVE EWI!!! /*** SSC-EWI-TD0087 - GOTO endIf WAS REMOVED DUE TO IF STATEMENT INVERSION ***/!!!
    
          BEGIN
            DROP TABLE TABLE1;
            STATUS_OBJECT := OBJECT_CONSTRUCT('SQLROWCOUNT', SQLROWCOUNT);
          EXCEPTION
            WHEN OTHER THEN
              STATUS_OBJECT := OBJECT_CONSTRUCT('SQLCODE', SQLCODE, 'SQLERRM', SQLERRM, 'SQLSTATE', SQLSTATE);
          END;
        END IF;
        /*.Label endIf*/
        --** SSC-FDM-0027 - REMOVED NEXT STATEMENT, NOT APPLICABLE IN SNOWFLAKE.  **
    
        BEGIN
          SELECT
            A
          FROM
            TABLE1;
          STATUS_OBJECT := OBJECT_CONSTRUCT('SQLROWCOUNT', SQLROWCOUNT);
        EXCEPTION
          WHEN OTHER THEN
            STATUS_OBJECT := OBJECT_CONSTRUCT('SQLCODE', SQLCODE, 'SQLERRM', SQLERRM, 'SQLSTATE', SQLSTATE);
        END;
      END
    $$
    
    Copy

    권장 사항

    SSC-EWI-TD0025

    심각도

    낮음

    설명

    이 경고는 Snowflake 스크립팅이 지원하지 않는 출력 형식의 CAST 함수를 사용할 때 표시됩니다.

    코드 예제

    Teradata:

    CREATE TABLE SAMPLE_TABLE
    (
        VARCHAR_TYPE VARCHAR
    );
    
    REPLACE VIEW SAMPLE_VIEW
    AS
    SELECT
    CAST(VARCHAR_TYPE AS FLOAT FORMAT 'ZZZ.ZZZZZ'),
    CAST('01:02.030405' AS TIME(1) WITH TIME ZONE FORMAT 'MI:SS.S(6)'),
    CAST('01-12-2020' AS DATE FORMAT 'dd-mm-yyyy')
    FROM SAMPLE_TABLE;
    
    Copy

    Snowflake Scripting:

    CREATE OR REPLACE TABLE SAMPLE_TABLE (
        VARCHAR_TYPE VARCHAR
    )
    COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"teradata"}}'
    ;
    
    CREATE OR REPLACE VIEW SAMPLE_VIEW
    COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"teradata"}}'
    AS
    SELECT
        TO_NUMBER(VARCHAR_TYPE, '999.00000', 38, 10) !!!RESOLVE EWI!!! /*** SSC-EWI-TD0025 - OUTPUT FORMAT 'ZZZ.ZZZZZ' NOT SUPPORTED. ***/!!!,
        TO_TIME('01:02.030405', 'MI:SS.FF6') !!!RESOLVE EWI!!! /*** SSC-EWI-TD0025 - OUTPUT FORMAT 'MI:SS.S(6)' NOT SUPPORTED. ***/!!!,
        TO_DATE('01-12-2020', 'DD-MM-YYYY') !!!RESOLVE EWI!!! /*** SSC-EWI-TD0025 - OUTPUT FORMAT 'dd-mm-yyyy' NOT SUPPORTED. ***/!!!
       FROM
        SAMPLE_TABLE;
    
    Copy

    권장 사항

    • 변환된 코드가 소스 코드와 동일한 방식으로 기능하는지 확인합니다.

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

    SSC-EWI-TD0040

    심각도

    낮음

    설명

    제공한 파일 형식이 시스템에서 지원되지 않습니다.

    코드 예시

    입력:

    CREATE TABLE T_2040
    (
        C1 VARCHAR(255) CHARACTER SET LATIN NOT CASESPECIFIC FORMAT 'X(50)',
        C2 VARCHAR(255) CHARACTER SET LATIN NOT CASESPECIFIC FORMAT 'X(75)'
    );
    
    Copy

    출력:

    CREATE OR REPLACE TABLE T_2040
    (
        C1 VARCHAR(255) COLLATE 'en-cs' FORMAT 'X(50)' !!!RESOLVE EWI!!! /*** SSC-EWI-TD0040 - FORMAT IN TABLE T_2040 NOT SUPPORTED ***/!!!,
        C2 VARCHAR(255) COLLATE 'en-cs' FORMAT 'X(75)' !!!RESOLVE EWI!!! /*** SSC-EWI-TD0040 - FORMAT IN TABLE T_2040 NOT SUPPORTED ***/!!!
    )
    COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "teradata",  "convertedOn": "06/17/2024" }}'
    ;
    
    Copy

    권장 사항

    명령과 함께 작동하는 모든 파일 형식을 지원합니다.