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;
출력 코드¶
--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;
권장 사항¶
추가 지원이 필요하면 지원 팀에 snowconvert-support@Snowflake.com으로 문의해 주십시오.
SSC-EWI-TD0079¶
예제를 더 명확하고 쉽게 따라할 수 있도록 출력 코드의 일부가 제거되었습니다.
심각도¶
낮음
설명¶
정규화 절 기능을 복제하는 데 필요한 ‘기간’ 열을 찾을 수 없기 때문에 이 경고가 표시됩니다.
코드 예시¶
입력 코드:¶
SELECT NORMALIZE emp_id, duration2 FROM project;
출력 코드¶
!!!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;
권장 사항¶
이 경고를 해결하려면 코드에서 첫 번째 기간 열의 위치를 찾고 처음에 정의된 곳을 제외하고 해당 열에 대한 모든 참조를 제거하십시오. 그런 다음 ‘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;
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;
권장 사항¶
추가 지원이 필요하면 지원 팀에 snowconvert-support@Snowflake.com으로 문의해 주십시오.
SSC-EWI-TD0059¶
심각도¶
낮음
설명¶
Teradata와 마찬가지로 사용자에 대한 기본 타임존을 설정하면 세션에 대해 다른 타임존을 지정할 때까지 모든 세션에서 해당 타임존을 사용합니다.
이 경고는 이전에 Teradata 사용자에 대해 정의한 것과 동일한 타임존을 Snowflake에 설정하라는 메시지를 표시합니다. Snowflake에서 타임존을 설정하려면 다음 쿼리를 실행합니다.
ALTER SESSION SET TIMEZONE = 'equivalent_timezone'
참고: Snowflake는 IANA 타임존 데이터베이스 의 타임존만 허용합니다.
코드 예시¶
입력 코드:¶
SET TIME ZONE USER;
출력 코드:¶
!!!RESOLVE EWI!!! /*** SSC-EWI-TD0059 - SNOWFLAKE USER DEFAULT TIME ZONE MAY REQUIRE CONFIGURATION TO MATCH TERADATA VALUE ***/!!!
ALTER SESSION UNSET TIMEZONE;
권장 사항¶
사용자의 기본 타임존을 원래 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() );
);
);
출력 코드:¶
#*** 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()
권장 사항¶
이 문제를 해결하려면 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);
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"}}'
;
권장 사항¶
추가 지원이 필요하면 snowconvert-support@Snowflake.com으로 문의해 주십시오.
SSC-EWI-TD0039¶
심각도¶
Medium
설명¶
사용하려는 파일 형식이 Snowflake와 호환되지 않습니다.
코드 예시¶
입력:¶
SELECT
CAST('01-12-2020' AS DATE FORMAT 'dd-mm-yyyy'),
CAST('01-12-2020' AS DATE FORMAT 'DDDBEEEE');
출력:¶
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 ***/!!!;
권장 사항¶
추가 지원이 필요하면 지원 팀에 snowconvert-support@Snowflake.com으로 문의해 주십시오.
SSC-EWI-TD0068¶
심각도¶
Medium
설명¶
Teradata 프로필을 사용하면 저장소 공간을 제어하고 비밀번호 제한을 관리하는 여러 공유 매개 변수를 설정할 수 있습니다.
Snowflake는 클라우드 아키텍처를 통해 저장소를 관리하고 모든 최적화를 자동으로 처리 하므로 사용자 측에서 저장소를 구성할 필요가 없습니다. 또한 Snowflake는 모든 사용자에게 보편적으로 적용되고 사용자 정의할 수 없는 표준 비밀번호 정책을 시행 합니다.
이 오류는 Teradata 프로필 참조가 감지되어 Snowflake 역할 참조로 변환될 때 발생합니다. Snowflake의 역할은 Teradata 프로필과 가장 유사하지만, Teradata의 프로필 이름이 Snowflake의 역할 이름과 일치하지 않으면 쿼리 결과가 다를 수 있습니다.
코드 예시¶
입력 코드:¶
SELECT PROFILE;
출력 코드:¶
SELECT
CURRENT_ROLE() !!!RESOLVE EWI!!! /*** SSC-EWI-TD0068 - SNOWFLAKE DOES NOT SUPPORT PROFILES, REFERENCING ROLE INSTEAD ***/!!!;
권장 사항¶
사용자 프로필은 지원되지 않으므로 쿼리에 사용자 프로필을 사용하지 마십시오. 사용자의 프로필 이름이 역할 이름과 다른 경우 쿼리 결과가 달라질 수 있습니다.
추가 지원이 필요하면 snowconvert-support@Snowflake.com으로 문의해 주십시오.
SSC-EWI-TD0029¶
심각도¶
낮음
설명¶
이 경고는 TABLE
을 사용하는 속성을 사용하는 QUEUE 특성을 사용할 때 표시됩니다. Snowflake는 QUEUE
키워드를 지원하지 않으므로 마이그레이션 중에 제거됩니다.
코드 예시¶
입력:¶
CREATE MULTISET TABLE SAMPLE_TABLE,
QUEUE,
NO FALLBACK
(
COL1 INTEGER
);
출력:¶
!!!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"}}'
;
권장 사항¶
추가 지원이 필요하면 지원 팀에 snowconvert-support@Snowflake.com으로 문의해 주십시오.
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);
출력 코드:¶
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);
권장 사항¶
JSON 경로의 형식이 올바르고 잘못된 문자가 포함되어 있지 않은지 확인합니다.
추가 지원이 필요하면 snowconvert-support@Snowflake.com으로 문의해 주십시오.
SSC-EWI-TD0057¶
심각도¶
낮음
설명¶
NEW JSON 함수는 문자열 또는 이진 형식의 JSON 데이터를 허용합니다. 데이터가 이진 형식인 경우 Snowflake는 JSON 오브젝트에 대한 이진 형식의 메타데이터를 해석할 수 없기 때문에 함수는 변경되지 않습니다. 자세한 내용은 NEW JSON 설명서 를 참조하십시오.
코드 예시¶
입력 코드¶
SELECT NEW JSON ('160000000268656C6C6F0006000000776F726C640000'xb, BSON);
출력 코드¶
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);
권장 사항¶
추가 지원이 필요하면 지원 팀에 snowconvert-support@Snowflake.com으로 문의해 주십시오.
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
);
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"}}'
;
권장 사항¶
사용자 측의 작업은 필요하지 않습니다.
추가 지원이 필요하면 snowconvert-support@Snowflake.com으로 문의해 주십시오.
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;
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;
권장 사항¶
추가 지원이 필요하면 snowconvert-support@Snowflake.com으로 문의해 주십시오.
SSC-EWI-TD0053¶
예제를 더 명확하고 이해하기 쉽게 하기 위해 코드의 일부가 제거되었습니다.
생성된 varchar 표현의 전체 자릿수¶
PERIOD_UDF 함수는 Snowflake의 기본 타임스탬프와 시간 형식을 사용하여 기간의 문자열 표현을 생성합니다. 기본적으로 타임스탬프는 전체 자릿수에 소수점 이하 세 자리까지 포함하지만, 시간 변수에는 소수점 이하 자릿수가 없습니다. 출력 문자열의 전체 자릿수를 조정해야 하는 경우 두 가지 옵션을 사용할 수 있습니다.
PRECISIONDIGITS
매개 변수와 함께 PERIOD_UDF 의 세 매개 변수 버전을 사용합니다. 이 매개 변수는 0에서 9까지의 정수를 허용하며 결과의 분수 시간 부분의 소수점 이하 자릿수를 제어합니다. Snowflake는 소수점 이하 9자리까지 지원하지만, Teradata는 소수점 이하 6자리까지만 지원합니다. 예:
호출 |
결과 |
---|---|
|
|
|
|
|
|
세션 출력의 시간 형식을 설정:
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;
출력 코드:¶
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;
권장 사항¶
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;
출력 코드¶
// 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;
조건 식을 찾을 수 없습니다¶
입력 코드:¶
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;
출력 코드¶
// 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;
권장 사항¶
추가 지원이 필요하면 지원 팀에 snowconvert-support@Snowflake.com으로 문의해 주십시오.
SSC-EWI-TD0012¶
심각도¶
낮음
설명¶
이 경고는 SnowConvert 에서 DEFAULT 값이 있는 BINARY 데이터 타입 열을 감지할 때 표시됩니다. Snowflake는 BINARY 열에 대한 기본값을 지원하지 않으므로 SnowConvert 는 DEFAULT 값 사양을 제거합니다.
코드 예시¶
Teradata:¶
CREATE TABLE TableExample
(
ColumnExample BINARY DEFAULT '00000000'XB NOT NULL
)
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"}}'
;
권장 사항¶
추가 지원이 필요하면 지원 팀에 snowconvert-support@Snowflake.com으로 문의해 주십시오.
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;
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;
권장 사항¶
일관된 비교 동작을 유지하려면
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;
출력 코드:¶
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;
권장 사항¶
사용자 측의 작업은 필요하지 않습니다.
추가 지원이 필요하면 snowconvert-support@Snowflake.com으로 문의해 주십시오.
SSC-EWI-TD0066¶
예제를 더 명확하고 쉽게 따라할 수 있도록 출력 코드의 일부가 제거되었습니다.
심각도¶
낮음
설명¶
이 메시지는 Snowflake에서 지원되지 않는 문자가 SnowConvert 에 포함된 Teradata Unicode 구분 식별자가 있을 때 표시됩니다. 자세한 내용은 Teradata Unicode 구분 기호 를 참조하십시오.
코드 예시¶
입력 코드:¶
SELECT * FROM U&"#000f#ffff" UESCAPE '#';
출력 코드:¶
// 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";
권장 사항¶
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
);
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"}}'
;
권장 사항¶
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;
출력 코드:¶
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;
권장 사항¶
Teradata 외부 테이블을 교체하려면 Snowflake 외부 테이블 을 사용하면 됩니다. 이 테이블은 클라우드 저장소 플랫폼(Amazon S3, Google Cloud Storage 또는 Microsoft Azure)에서 직접 데이터를 읽습니다. 이를 통해 데이터 레이크 파일을 마치 데이터베이스 테이블처럼 쿼리할 수 있습니다. 외부 테이블은 COPYINTO
Snowflake의 Iceberg 테이블 은 또 다른 옵션을 제공합니다. 이 테이블은 개방형 형식을 사용하며 데이터를 자체 클라우드 저장소에 Parquet 파일로 저장합니다.
표준 Snowflake 테이블 은 Teradata 외부 테이블 기능을 대체할 수도 있습니다.
추가 지원이 필요하면 당사에 snowconvert-support@Snowflake.com으로 문의해 주십시오.
추가 지원이 필요하면 snowconvert-support@Snowflake.com으로 문의해 주십시오.
참고:
EVENT TABLE
을 사용하여 Snowflake에서 추적 기능을 복제할 수 있습니다. 자세한 내용은 로깅 및 추적 에 대한 Snowflake 설명서를 참조하십시오.추가 지원이 필요하면 snowconvert-support@Snowflake.com으로 문의해 주십시오.
추가 지원이 필요하면 지원 팀에 snowconvert-support@Snowflake.com으로 문의해 주십시오.
제안된 해결 방법을 수동으로 적용하십시오.
SSC-FDM-TD0033를 검토하여
LAST_QUERY_ID
사용의 제한 사항과 처리 방법을 알아보십시오.추가 지원이 필요하면 snowconvert-support@Snowflake.com으로 문의해 주십시오.
Teradata에서 BYTES 함수는 고정 길이 저장소를 사용하기 때문에 항상 후행 0을 계산합니다. 즉, 실제 데이터 크기가 아닌 열의 크기를 반환합니다.
Snowflake에서 LENGTH 함수는 이진 타입에 가변 길이 저장소를 사용하기 때문에 저장된 데이터의 실제 크기를 반환합니다.
BYTES 함수 결과 분석 결과 Snowflake LENGTH 함수가 이미 원하는 동작을 제공하고 있으므로 수정이 필요하지 않습니다.
추가 지원이 필요하면 snowconvert-support@Snowflake.com으로 문의해 주십시오.
추가 지원이 필요하면 지원 팀에 snowconvert-support@Snowflake.com으로 문의해 주십시오.
추가 지원이 필요하면 snowconvert-support@Snowflake.com으로 문의해 주십시오.
UPPERCASE
절은 데이터를 저장할 때 소문자를 대문자로 변환합니다. 예를 들어, ‘aaa’는 ‘AAA’로 저장됩니다. 이를 처리하려면 모든 삽입 문에 UPPER 함수를 모든 삽입 문에 추가하면 됩니다. 그러나 외부 데이터를 로딩하는 ETL 프로세스도 수정해야 한다는 점에 유의하십시오.추가 지원이 필요하면 snowconvert-support@Snowflake.com으로 문의해 주십시오.
추가 지원이 필요하면 snowconvert-support@Snowflake.com으로 문의해 주십시오.
두 가지 방법 중 하나를 사용하여 변환 도구에 열 정보를 제공할 수 있습니다.
TD_UNPIVOT 호출과 동일한 파일에 테이블 사양을 포함합니다
SELECT * 또는 테이블 이름만 사용하는 대신 ON 식의 SELECT 쿼리에 특정 열을 나열합니다
입력 테이블에서 ALL 열의 피벗을 해제하는 경우 이 문제를 무시할 수 있습니다. 그러나 일부 열만 피벗을 해제하는 경우 데이터가 누락됩니다.
추가 지원이 필요하면 snowconvert-support@Snowflake.com으로 문의해 주십시오.
Continue Handler Translation Reference에 표시된 예와 유사하게 예외를 유발할 수 있는 문을 식별하고 코드 블록으로 감싸십시오.
추가 지원이 필요하면 지원 팀에 snowconvert-support@Snowflake.com으로 문의해 주십시오.
D:
DAYOFWEEK
함수에 매핑됩니다. 기본 설정이 다르기 때문에 Teradata와 Snowflake 간에 결과 세트가 다를 수 있습니다. Teradata는 일요일을 요일의 첫 번째 날로 사용하는 반면, Snowflake는 월요일을 사용합니다.WW:
WEEK
함수에 매핑됩니다. 주별 계산 정책에 따라 결과가 다를 수 있습니다. Snowflake는 기본적으로 ISO 표준을 사용하지만(첫 주에는 1월 중 최소 4일이 포함되어야 함), Teradata는 1월 1일을 첫 주의 시작으로 간주합니다.TIMESTAMP_LTZ_OUTPUT_FORMAT
TIMESTAMP_NTZ_OUTPUT_FORMAT
TIMESTAMP_TZ_OUTPUT_FORMAT
TIME_OUTPUT_FORMAT
형식 함수(FF)로 작업할 때는 Teradata의 전체 자릿수와 일치하는 DateTime 유형을 사용하거나 형식 요소에 전체 자릿수를 지정하여 일관된 동작을 보장합니다.
타임존 형식의 경우 일관된 결과를 얻으려면 첫 번째 매개 변수가
TIMESTAMP_TZ
유형인지 확인하십시오. Snowflake의TIME
데이터 타입은 타임존 정보를 지원하지 않습니다.일관된 동작을 유지하기 위해 세션 매개 변수를 Teradata의 기본값과 일치하도록 구성합니다.
추가 지원이 필요하면 snowconvert-support@Snowflake.com으로 문의해 주십시오.
추가 지원이 필요하면 snowconvert-support@Snowflake.com으로 문의해 주십시오.
Lookahead
Lookbehind
Non-capturing groups
각 정규식 패턴을 검토하여 수동 조정이 필요한지 식별합니다. Snowflake의 정규식 기능 및 대체 옵션에 대한 자세한 내용은 여기에서 확인할 수 있습니다.
추가 지원이 필요하면 지원 팀에 snowconvert-support@Snowflake.com으로 문의해 주십시오.
SnowConvert 에 코드를 제공할 때 테이블 정의를 포함해야 합니다. 이 기능이 없으면 코드를 다시 실행해야 합니다.
추가 지원이 필요하면 snowconvert-support@Snowflake.com으로 문의해 주십시오.
추가 지원이 필요하면 snowconvert-support@Snowflake.com으로 문의해 주십시오.
BTEQ - Python 변환에 대한 자세한 내용은 BTEQ 에서 Python으로의 변환 사양에서 확인할 수 있습니다.
추가 지원이 필요하면 snowconvert-support@Snowflake.com으로 문의해 주십시오.
추가 지원이 필요하면 지원 팀에 snowconvert-support@Snowflake.com으로 문의해 주십시오.
추가 지원이 필요하면 지원 팀에 snowconvert-support@Snowflake.com으로 문의해 주십시오.
코드에 재귀 정방향 별칭이 있는지 확인하십시오. EWI 는 첫 번째 재귀 별칭을 식별하지만 코드에 주의가 필요한 다른 별칭이 있을 수 있습니다.
추가 지원이 필요하면 snowconvert-support@Snowflake.com으로 문의해 주십시오.
추가 지원이 필요하면 지원 팀에 snowconvert-support@Snowflake.com으로 문의해 주십시오.
변환된 코드가 소스 코드와 동일한 방식으로 기능하는지 확인합니다.
추가 지원이 필요하면 지원 팀에 snowconvert-support@Snowflake.com으로 문의해 주십시오.
추가 지원이 필요하면 지원 팀에 snowconvert-support@Snowflake.com으로 문의해 주십시오.
SSC-EWI-TD0091¶
이해하기 쉽도록 출력 코드의 일부 섹션이 제거되었습니다.
심각도¶
Medium
설명¶
Teradata 스크립트에서 다음 구문과 함께 CAST 식을 사용하여 데이터 타입을 변환할 수 있습니다.
<expression> ( <DataType> )
CAST 를 DATE
또는 TIME
로 데이터 타입을 변환할 때 이 키워드는 각각 CURRENT_DATE
및 CURRENT_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;
코드 예시¶
입력 코드:¶
CREATE TABLE TAB (
COL1 VARCHAR(23)
)
SELECT
COL1 (DATE),
AMBIGUOUS_EXPR (DATE)
FROM TAB;
출력 코드¶
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;
권장 사항¶
SSC-EWI-TD0017¶
심각도¶
낮음
설명¶
이 경고는 SnowConvert 에서 GLOBAL TEMPORARY TRACE 옵션이 포함된 Create Table 문을 감지할 때 표시됩니다. 이 기능은 Teradata(TRACE 기능))에만 해당되는 기능으로, Snowflake에서는 사용할 수 없으며 변환 중에 제거됩니다.
코드 예시¶
Teradata:¶
CREATE GLOBAL TEMPORARY TRACE TABLE TableExample
(
ColumnExample Number
)
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"}}'
;
권장 사항¶
SSC-EWI-TD0046¶
심각도¶
Medium
설명¶
이 오류는 선택한 열과 일치하는 항목이 없는 DBC 테이블을 참조할 때 발생하며, 선택한 열이 Snowflake에서 일치하는 항목이 없습니다.
코드 예시¶
입력:¶
CREATE VIEW SAMPLE_VIEW
AS
SELECT PROTECTIONTYPE FROM DBC.DATABASES;
출력:¶
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;
권장 사항¶
SSC-EWI-TD0023¶
심각도¶
낮음
설명¶
ACTIVITY_COUNT
상태 변수는 임베디드 SQL 또는 저장 프로시저에 사용되는 경우 SQL DML 문(예: INSERT, UPDATE 또는 DELETE)에 의해 수정된 행 수를 표시합니다. 자세한 내용은 여기에서 확인할 수 있습니다.
ACTIVITY_COUNT
의 동작을 복제하려면 변환 사양에 설명된 해결 방법을 사용할 수 있습니다.
SELECT $1 FROM TABLE(RESULT_SCAN(LAST_QUERY_ID()));
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;
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;
$$;
수동 수정¶
삽입, 업데이트 또는 삭제된 행 수를 검색하려면 위에서 설명한 해결 방법 중 일부를 사용할 수 있습니다.
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;
$$;
Snowflake에서 이 쿼리를 사용하려면 Snowflake의 SELECT INTO VARIABLE 구문을 사용하도록 수정해야 합니다.
또한 RESULT_SCAN(LAST_QUERY_ID())
를 사용할 때 잘못된 결과를 발견하면 SSC-FDM-TD0033의 잠재적인 제한 사항과 해결 방법에 대한 정보에서 확인할 수 있습니다.
권장 사항¶
SSC-EWI-TD0051¶
심각도¶
낮음
설명¶
바이트 데이터 타입으로 작업할 때 Teradata와 Snowflake 사이에는 중요한 차이점이 있습니다.
다음은 이 차이를 설명하는 예시입니다.
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
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
코드 예시:¶
입력 코드:¶
create table sampleTable(
byteColumn byte(10),
varbyteColumn varbyte(15)
);
select bytes(byteColumn), bytes(varbyteColumn) from sampleTable;
출력 코드:¶
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;
권장 사항¶
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;
출력:¶
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`);
}
$$;
권장 사항¶
SSC-EWI-TD0024¶
심각도¶
낮음
설명¶
이 경고는 저장 프로시저 내에서 주석 처리된 ABORT
문 내에 AGGREGATE
함수를 사용할 때 표시됩니다.
코드 예시¶
Teradata:¶
REPLACE PROCEDURE ABORT_SAMPLE()
BEGIN
ABORT WHERE SUM(TABLE1.COL1) < 2;
END;
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;
$$;
권장 사항¶
SSC-EWI-TD0010¶
심각도¶
낮음
설명¶
텍스트를 대문자로 변환하는 데 사용되는 UPPERCASE 열 특성은 Snowflake에서 사용할 수 없습니다.
코드 예시¶
Teradata:¶
CREATE TABLE T_2010
(
col1 VARCHAR(1) UPPERCASE
);
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"}}'
;
권장 사항¶
SSC-EWI-TD0041¶
심각도¶
낮음
설명¶
제공한 파일 형식이 시스템에서 지원되지 않습니다.
코드 예시¶
입력:¶
SELECT
cast(T_2041.integer_column as integer);
출력:¶
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. ***/!!!;
권장 사항¶
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;
출력 코드:¶
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;
권장 사항¶
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;
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;
$$;
권장 사항¶
SSC-EWI-TD0055¶
이 조기 경고 문제(EWI)는 더 이상 지원되지 않습니다. 최신 정보는 SSC-FDM-TD0029 설명서를 참조하십시오.
세션 매개 변수에 종속되는 요소 형식 지정하기¶
다음 Teradata 형식 요소는 특정 세션 매개 변수 설정이 필요한 Snowflake 함수에 매핑됩니다. Teradata와 Snowflake 간에 일관된 결과를 보장하려면 이러한 세션 매개 변수를 Teradata 설정과 일치하도록 구성해야 합니다.
세션 매개 변수를 변경하려면 ALTER SESSION SET parameter_name = value
명령을 사용합니다. 사용 가능한 세션 매개 변수와 그 사용법에 대한 자세한 내용은 이 페이지 를 참조하십시오.
TO_CHAR 의 단일 매개 변수 버전¶
단일 매개 변수가 있는 TO_CHAR(Datetime)
함수는 세션 매개 변수에 정의된 기본 날짜 및 시간 형식을 사용합니다. 이러한 매개 변수에는 다음이 포함됩니다.
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);
출력 코드:¶
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 ***/!!!;
권장 사항¶
SSC-EWI-TD0082¶
심각도¶
Medium
설명¶
현재 인코딩 매개 변수가 있는 변환 함수는 Snowflake에서 사용할 수 없습니다. 변환 과정에서 이 함수는 설명이 추가됩니다.
코드 예시¶
입력 코드:¶
SELECT Translate('abc' USING KANJISJIS_TO_LATIN);
출력 코드¶
SELECT
!!!RESOLVE EWI!!! /*** SSC-EWI-TD0082 - TRANSLATE FUNCTION USING KANJISJIS_TO_LATIN ENCODING IS NOT SUPPORTED ***/!!!
Translate('abc' USING KANJISJIS_TO_LATIN);
권장 사항¶
SSC-EWI-TD0020¶
이 경고 메시지는 더 이상 사용되지 않습니다. 최신 설명서는 SSC-EWI-0009를 참조하십시오.
심각도¶
낮음
설명¶
Snowflake는 현재 POSIX 기본 정규식 구문만 지원합니다. 고급 정규식 기능은 사용할 수 없습니다.
이 경고는 REGEX_SUBSTR, REGEX_REPLACE 또는 REGEX_INSTR 에 대한 함수 호출이 Snowflake로 변환될 때마다 표시됩니다. 사용자에게 일부 정규식 기능이 Snowflake에서 지원되지 않을 수 있음을 경고합니다. 중요한 지원되지 않는 기능에는 다음이 있습니다.
코드 예시¶
Teradata:¶
SELECT REGEXP_SUBSTR('qaqequ','q(?=u)', 1, 1);
Snowflake Scripting:¶
SELECT
!!!RESOLVE EWI!!! /*** SSC-EWI-TD0020 - REGEXP_SUBSTR FUNCTION ONLY SUPPORTS POSIX REGULAR EXPRESSIONS ***/!!!
REGEXP_SUBSTR('qaqequ','q(?=u)', 1, 1);
권장 사항¶
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;
출력 코드:¶
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;
권장 사항¶
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
출력:¶
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
권장 사항¶
SSC-EWI-TD0005¶
심각도¶
중요
설명¶
코드가 성공적으로 변환되었지만 이 기능이 아직 완전히 구현되지 않았기 때문에 의도한 대로 작동하지 않을 수 있습니다.
이 경고는 사용자에게 이 문을 사용하면 원래 스크립트와 다른 기능이 생성된다는 것을 알려줍니다.
예제 소스¶
BTEQ 입력 코드:¶
.SET SIDETITLES ON
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()
권장 사항¶
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;
출력 코드¶
// 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;
권장 사항¶
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';
출력 코드¶
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
$$
권장 사항¶
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;
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;
아래 코드 예제는 올바르게 실행되지 않습니다.
Teradata:¶
SELECT
A + B as C,
COL2 + C AS A,
COL3 AS B
FROM
TABLE_EXAMPLE;
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;
권장 사항¶
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;
출력 코드¶
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
$$
권장 사항¶
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;
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;
권장 사항¶
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)'
);
출력:¶
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" }}'
;