SnowConvert AI - Teradata 기능적 차이¶
SSC-FDM-TD0001¶
Blob 데이터 타입에서 열이 변환되었습니다.
설명¶
이 메시지는 SnowConvert AI가 BLOB 데이터 타입을 발견한 경우에 표시됩니다. BLOB은 Snowflake에서 지원되지 않으므로 Binary 타입으로 변경됩니다.
코드 예제¶
입력 코드:¶
CREATE TABLE TableExample
(
ColumnExample BLOB
);
생성된 코드:¶
CREATE OR REPLACE TABLE TableExample
(
ColumnExample BINARY /*** SSC-FDM-TD0001 - COLUMN CONVERTED FROM BLOB DATA TYPE ***/
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"teradata"}}'
;
모범 사례¶
추가 사용자 작업이 필요하지 않습니다.
추가 지원이 필요한 경우 snowconvert-support@snowflake.com으로 이메일을 보내주세요.
SSC-FDM-TD0002¶
Clob 데이터 타입에서 열이 변환되었습니다.
설명¶
이 메시지는 SnowConvert AI가 CLOB 데이터 타입을 발견한 경우에 표시됩니다. CLOB은 SnowConvert AI에서 지원되지 않으므로 VARCHAR 타입으로 변경됩니다.
코드 예제¶
입력 코드:¶
CREATE TABLE TableExample
(
ColumnExample CLOB
)
생성된 코드:¶
CREATE OR REPLACE TABLE TableExample
(
ColumnExample VARCHAR /*** SSC-FDM-TD0002 - COLUMN CONVERTED FROM CLOB DATA TYPE ***/
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"teradata"}}'
;
모범 사례¶
추가 사용자 작업이 필요하지 않습니다.
추가 지원이 필요한 경우 snowconvert-support@snowflake.com으로 이메일을 보내주세요.
SSC-FDM-TD0003¶
Bash 변수가 발견되었습니다. 이 스크립트를 실행하려면 변수 대체가 활성화된 SnowSQL을 사용해야 합니다
설명¶
Snowflake Scripting으로 마이그레이션된 스크립트 파일의 소스 코드에 Bash 변수 자리 표시자($variable 또는 ${variable})가 포함된 경우, SnowConvert AI는 SnowSQL 변수(&variable or &{variable})로 변환합니다.
이 경고는 이제 마이그레이션된 스크립트를 실행하기 위해 SnowSQL을 사용한다는 것을 알리기 위해 생성됩니다. SnowSQL에서 스크립트를 실행할 때 다음 사항을 고려하세요.
코드 예시¶
입력 코드:¶
.LOGON dbc, dbc;
select '$variable', '${variable}', '${variable}_concatenated';
select $colname from $tablename where info = $id;
select ${colname} from ${tablename} where info = ${id};
.LOGOFF;
생성된 코드:¶
EXECUTE IMMEDIATE
$$
--** SSC-FDM-TD0003 - BASH VARIABLES FOUND, USING SNOWSQL WITH VARIABLE SUBSTITUTION ENABLED IS REQUIRED TO RUN THIS SCRIPT **
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
'&variable',
'&{variable}',
'&{variable}_concatenated';
STATUS_OBJECT := OBJECT_CONSTRUCT('SQLROWCOUNT', SQLROWCOUNT);
EXCEPTION
WHEN OTHER THEN
STATUS_OBJECT := OBJECT_CONSTRUCT('SQLCODE', SQLCODE, 'SQLERRM', SQLERRM, 'SQLSTATE', SQLSTATE);
END;
BEGIN
SELECT
&colname
from
&tablename
where
info = &id;
STATUS_OBJECT := OBJECT_CONSTRUCT('SQLROWCOUNT', SQLROWCOUNT);
EXCEPTION
WHEN OTHER THEN
STATUS_OBJECT := OBJECT_CONSTRUCT('SQLCODE', SQLCODE, 'SQLERRM', SQLERRM, 'SQLSTATE', SQLSTATE);
END;
BEGIN
SELECT
&{colname}
from
&{tablename}
where
info = &{id};
STATUS_OBJECT := OBJECT_CONSTRUCT('SQLROWCOUNT', SQLROWCOUNT);
EXCEPTION
WHEN OTHER THEN
STATUS_OBJECT := OBJECT_CONSTRUCT('SQLCODE', SQLCODE, 'SQLERRM', SQLERRM, 'SQLSTATE', SQLSTATE);
END;
--.LOGOFF
!!!RESOLVE EWI!!! /*** SSC-EWI-0073 - PENDING FUNCTIONAL EQUIVALENCE REVIEW FOR 'LogOff' NODE ***/!!!
null;
END
$$
모범 사례¶
추가 지원이 필요한 경우 snowconvert-support@snowflake.com으로 이메일을 보내주세요.
SSC-FDM-TD0004¶
PEROID 데이터 타입이 두 개의 데이터 필드로 처리됩니다
설명¶
Teradata에는 시간 간격을 나타내는 데 사용되는 PEROID 데이터 타입이 있습니다. 이 데이터 타입의 인스턴스는 PERIOD, BEGIN, END, OVERLAPS 등과 같은 기간 데이터를 초기화하고 조작할 수 있는 함수 세트와 함께 동일한 유형(시간, 날짜 또는 타임스탬프)의 시작 및 종료 한계값을 갖습니다.
PEROID 데이터 타입은 Snowflake에서 지원되지 않으므로, SnowConvert AI는 다음 규칙을 사용하여 이 데이터 타입 및 관련 함수를 변환합니다.
열 테이블의 모든 PEROID 데이터 타입 선언은 동일한 유형의 두 열로 마이그레이션됩니다.
PEROID 값 생성자 함수는 PEROID 하위 유형의 서로 다른 두 생성자(시작 값, 끝 값)로 마이그레이션됩니다.
PEROID 데이터 타입 매개 변수가 필요한 지원되는 함수는 UDFs로 마이그레이션되며, 이러한 UDFs에는 시작 값과 끝 값에 대해 거의 두 개의 매개 변수가 필요합니다.
코드 예시¶
입력 코드:¶
-- Additional Params: --SplitPeriodDatatype
CREATE TABLE DateTable
(
COL1 PERIOD(DATE) DEFAULT PERIOD (DATE '2005-02-03', UNTIL_CHANGED)
);
생성된 코드:¶
CREATE OR REPLACE TABLE DateTable
(
COL1_begin DATE DEFAULT DATE '2005-02-03',
COL1_end DATE DEFAULT DATE '9999-12-31' /*** SSC-FDM-TD0004 - PERIOD DATA TYPES ARE HANDLED AS TWO DATA FIELDS ***/
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"teradata"}}'
;
모범 사례¶
추가 지원이 필요한 경우 snowconvert-support@snowflake.com으로 이메일을 보내주세요.
SSC-FDM-TD0005¶
Snowflake에서는 비표준 타임존 오프셋이 지원되지 않으며, 가장 가까운 유효한 타임존으로 반올림됩니다.
설명¶
Teradata는 SET TIME ZONE 쿼리를 사용하여 -12:59에서 +14:00 사이의 타임존 오프셋을 정의할 수 있는 유연성을 제공하지만, Snowflake는 IANA 타임존 데이터베이스에 등록된 타임존만 지원합니다.
SET TIME ZONE 쿼리에 지정된 오프셋이 IANA 표준 타임존과 일치하지 않는 경우 Snowflake는 가장 가까운 오프셋을 사용하여 가장 가까운 표준 타임존으로 자동 반올림합니다. 이러한 경우 경고 메시지가 생성됩니다.
코드 예시¶
입력 코드:¶
-- Will be rounded to Asia/Colombo (+05:30)
SET TIME ZONE '05:26';
생성된 코드:¶
-- Will be rounded to Asia/Colombo (+05:30)
--** SSC-FDM-TD0005 - NON-STANDARD TIME ZONE OFFSETS NOT SUPPORTED IN SNOWFLAKE, ROUNDED TO NEAREST VALID TIME ZONE **
ALTER SESSION SET TIMEZONE = 'Asia/Colombo';
모범 사례¶
추가 사용자 작업이 필요하지 않습니다.
추가 지원이 필요한 경우 snowconvert-support@snowflake.com으로 이메일을 보내주세요.
SSC-FDM-TD0006¶
With Check Option이 있는 뷰는 지원되지 않습니다.
설명¶
이 메시지는 SnowConvert AI가 WITH CHECK OPTION 절이 있는 뷰를 발견한 경우에 표시됩니다. 이는 Snowflake에서 지원되지 않으므로 코드에서 주석 처리됩니다.
이 절은 업데이트 가능한 뷰에서 작동하며, 뷰에서 INSERT 및 UPDATE를 실행하고 뷰와 연결된 테이블을 내부적으로 업데이트하는 데 사용할 수 있습니다.
이 절은 뷰의 WHERE 절을 사용하는 명령의 영향을 받는 행을 제한하는 데 사용됩니다.
이 절의 기능에 대한 자세한 내용은 설명서를 참조하세요.
코드 예시¶
입력 코드:¶
REPLACE VIEW VIEWWITHOPTIONTEST AS
LOCKING ROW FOR ACCESS
SELECT
*
FROM SOMETABLE
WHERE app_id = 'SUPPLIER'
WITH CHECK OPTION;
생성된 코드:¶
CREATE OR REPLACE VIEW VIEWWITHOPTIONTEST
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "teradata", "convertedOn": "07/02/2025", "domain": "no-domain-provided" }}'
AS
SELECT
*
FROM
SOMETABLE
WHERE
UPPER(RTRIM( app_id)) = UPPER(RTRIM('SUPPLIER'))
-- --** SSC-FDM-TD0006 - VIEW WITH OPTION NOT SUPPORTED IN SNOWFLAKE **
-- WITH CHECK OPTION
;
모범 사례¶
추가 지원이 필요한 경우 snowconvert-support@snowflake.com으로 이메일을 보내주세요.
SSC-FDM-TD0007¶
VARIANT 열은 COLLATE를 지원하지 않습니다.
설명¶
이 메시지는 코드 변환 시 SnowConvert AI에서 VARIANT 데이터 타입에 COLLATE 절이 있는 경우에 표시됩니다. COLLATE는 VARIANT 데이터 타입에서 지원되지 않으므로 제거되고 메시지가 추가됩니다.
코드 예시¶
입력 코드:¶
-- Additional Params: --useCollateForCaseSpecification
CREATE TABLE TableExample
(
ColumnExample JSON(2500) NOT CASESPECIFIC
)
생성된 코드:¶
CREATE OR REPLACE TABLE TableExample
(
ColumnExample VARIANT
-- NOT CASESPECIFIC /*** SSC-FDM-TD0007 - VARIANT COLUMN DOES NOT SUPPORT COLLATION ***/
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"teradata"}}'
;
JSON 데이터 타입은 VARIANT로 변환되는 반면, NOT CASESPECIFIC은 COLLATE 절로 변환됩니다.
모범 사례¶
추가 사용자 작업이 필요하지 않습니다.
추가 지원이 필요한 경우 snowconvert-support@snowflake.com으로 이메일을 보내주세요.
SSC-FDM-TD0008¶
NVP_UDF의 네 번째 매개 변수가 리터럴이 아니고 백슬래시를 포함하는 경우 백슬래시를 이스케이프해야 합니다.
설명¶
공백이 있는 리터럴이 아닌 구분 기호는 Snowflake에서 백슬래시를 이스케이프해야 합니다.
코드 예시¶
입력 코드¶
SELECT NVP('store = whole foods&&store: ?Bristol farms','store', '&&', valueDelimiter, 2);
생성된 코드¶
SELECT
PUBLIC.NVP_UDF('store = whole foods&&store: ?Bristol farms', 'store', '&&', valueDelimiter, 2) /*** SSC-FDM-TD0008 - WHEN NVP_UDF FOURTH PARAMETER IS NON-LITERAL AND IT CONTAINS A BACKSLASH, THAT BACKSLASH NEEDS TO BE ESCAPED ***/;
모범 사례¶
추가 지원이 필요한 경우 snowconvert-support@snowflake.com으로 이메일을 보내주세요.
SSC-FDM-TD0009¶
현재 세션 기본값이 정수에서 varchar로 변환되었습니다.
설명¶
이 메시지는 SnowConvert AI가 DEFAULT SESSION을 발견하고 데이터 타입이 VARCHAR가 아닌 경우에 표시됩니다. 이 경우 데이터 타입은 VARCHAR로 변경되며 메시지가 추가됩니다.
코드 예제¶
입력 코드:¶
CREATE TABLE TableExample
(
ColumnExample INTEGER DEFAULT SESSION,
ColumnExample2 VARCHAR DEFAULT SESSION
)
생성된 코드:¶
CREATE OR REPLACE TABLE TableExample
(
ColumnExample VARCHAR DEFAULT CURRENT_SESSION() /*** SSC-FDM-TD0009 - CONVERTED FROM INTEGER TO VARCHAR FOR CURRENT_SESSION DEFAULT ***/,
ColumnExample2 VARCHAR DEFAULT CURRENT_SESSION()
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"teradata"}}'
;
예제를 살펴보겠습니다. ColumnExample에 DEFAULT SESSION이 있는 INTEGER 데이터 타입이 있습니다. 데이터 타입이 VARCHAR가 아니므로 출력에서는 VARCHAR로 변환됩니다.
ColumnExample2의 데이터 타입은 이미 VARCHAR이므로 변경되지 않았습니다.
모범 사례¶
추가 사용자 작업이 필요하지 않습니다.
추가 지원이 필요한 경우 snowconvert-support@snowflake.com으로 이메일을 보내주세요.
SSC-FDM-TD0010¶
테이블(Teradata) DBC.COLUMNSV 및 INFORMATION_SCHEMA.COLUMNS(SnowFlake) 간 테이블 열이 있습니다. 그러나 일부 열은 Snowflake에서 정확히 일치하지 않을 수 있습니다.
설명¶
Teradata에서 DBC.COLUMNSV 테이블을 사용하면 INFORMATION_SCHEMA.COLUMNS로 변환되지만, 일부 열은 SnowFlake에서 정확히 일치하지 않을 수 있습니다. 즉, Teradata에는 SnowFlake에 해당하는 열이 없는 열이 일부 있습니다. 그리고 해당하는 열은 있지만 내용이 정확히 동일하지 않은 열도 있습니다.
.png)
An example of the contents of DBC.COLUMNSV table in Teradata
.png)
An example of the contents of INFORMATION_SCHEMA.COLUMNS table in SnowFlake
예를 들어, SnowFlake에는 “ColumnFormat_”에 해당하는 열이 없고, Teradata에는 _”DATA_TYPE”_이 “ColumnType” 열과 일치하는 것처럼 보이지만, 내용은 크게 다릅니다.
코드 예제¶
입력 코드:¶
SELECT columnname FROM dbc.columnsV WHERE tablename = 'TableN';
생성된 코드:¶
SELECT
COLUMN_NAME AS COLUMNNAME
FROM
--** SSC-FDM-TD0010 - USES OF TABLE DBC.COLUMNSV ARE CONVERTED TO INFORMATION_SCHEMA.COLUMNS, BUT SOME COLUMNS MIGHT NOT HAVE AND EXACT MATCH IN SNOWFLAKE **
INFORMATION_SCHEMA.COLUMNS
WHERE
UPPER(RTRIM(TABLE_NAME)) = UPPER(RTRIM('TableN'));
모범 사례¶
Teradata에서 사용된 열을 검토하고 SnowFlake에서 사용 가능한 내용이 요구 사항과 일치하는지 확인합니다.
추가 지원이 필요한 경우 snowconvert-support@snowflake.com으로 이메일을 보내주세요.
SSC-FDM-TD0011¶
유니코드 BMP 이스케이프는 지원되지 않습니다.
설명¶
Snowflake는 유니코드를 BMP를 지원하지 않으므로, SnowConvert AI가 유니코드 BMP 이스케이프가 포함된 Teradata 유니코드 구분 문자 리터럴을 snowflake로 변환하는 경우에 이 메시지가 표시됩니다.
코드 예시¶
입력 코드:¶
SELECT U&'hola #+005132 mundo' UESCAPE '#';
생성된 코드:¶
SELECT
--** SSC-FDM-TD0011 - UNICODE BMP IS NOT SUPPORTED IN SNOWFLAKE **
'hola \u+005132 mundo';
모범 사례¶
상응하는 유니코드가 있는지 확인합니다.
추가 지원이 필요한 경우 snowconvert-support@snowflake.com으로 이메일을 보내주세요.
SSC-FDM-TD0012¶
잘못된 기본값입니다.
참고
이 FDM은 더 이상 사용되지 않습니다. SSC-EWI-TD0006 설명서를 참조하세요.
설명¶
DEFAULT TIME / DEFAULT DATE / DEFAULT CURREN_DATE / DEFAULT DEFAULT CURRENT_TIME / DEFAULT CURRENT_TIMESTAMP 열 사양은 FLOAT 데이터 타입에 지원되지 않습니다.
코드 예시¶
Teradata:¶
CREATE TABLE T_2004
(
-- In the output code all of these columns will be FLOAT type
-- and will include the SSC-FDM-TD0012 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 TABLE T_2004
(
-- In the output code all of these columns will be FLOAT type
-- and will include the SSC-FDM-TD0012 message.
COL1 FLOAT DEFAULT TIME /*** SSC-FDM-TD0012 - DEFAULT CURRENT_TIME NOT VALID FOR DATA TYPE ***/,
COL2 FLOAT DEFAULT DATE /*** SSC-FDM-TD0012 - DEFAULT CURRENT_DATE NOT VALID FOR DATA TYPE ***/,
COL3 FLOAT DEFAULT CURRENT_DATE /*** SSC-FDM-TD0012 - DEFAULT CURRENT_DATE NOT VALID FOR DATA TYPE ***/,
COL4 FLOAT DEFAULT CURRENT_TIME /*** SSC-FDM-TD0012 - DEFAULT CURRENT_TIME NOT VALID FOR DATA TYPE ***/,
COL5 FLOAT DEFAULT CURRENT_TIMESTAMP /*** SSC-FDM-TD0012 - 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-FDM-TD0013¶
Snowflake 오류 코드가 원본 Teradata 오류 코드와 일치하지 않습니다
설명¶
이 메시지는 BTEQ ERRORCODE 기본 제공 변수에 저장된 오류 코드가 Snowflake Scripting과 동일할 수 없기 때문에 표시됩니다.
코드 예시¶
입력 코드:¶
SELECT * FROM table1;
.IF ERRORCODE<>0 THEN .EXIT 1
.QUIT 0
생성된 코드:¶
-- Additional Params: -q snowscript
EXECUTE IMMEDIATE
$$
DECLARE
STATUS_OBJECT OBJECT := OBJECT_CONSTRUCT('SQLCODE', 0);
BEGIN
BEGIN
SELECT
*
FROM
table1;
STATUS_OBJECT := OBJECT_CONSTRUCT('SQLROWCOUNT', SQLROWCOUNT);
EXCEPTION
WHEN OTHER THEN
STATUS_OBJECT := OBJECT_CONSTRUCT('SQLCODE', SQLCODE, 'SQLERRM', SQLERRM, 'SQLSTATE', SQLSTATE);
END;
IF (STATUS_OBJECT['SQLCODE'] /*** SSC-FDM-TD0013 - THE SNOWFLAKE ERROR CODE MISMATCH THE ORIGINAL TERADATA ERROR CODE ***/ != 0) THEN
RETURN 1;
END IF;
RETURN 0;
END
$$
모범 사례¶
추가 지원이 필요한 경우 snowconvert-support@snowflake.com으로 이메일을 보내주세요.
SSC-FDM-TD0014¶
파일 실행 불일치
설명¶
이 EWI는 마이그레이션된 코드가 SQL 문이 있는 환경 파일을 실행하는 BTEQ 문인 경우에 표시됩니다(예: $(<$INPUT_SQL_FILE)). BTEQ 실행 및 Python 생성 코드의 차이는 BTEQ는 파일 내 문 하나가 실패해도 다른 문을 계속 실행하지만, Python 실행은 오류가 발생할 때마다 중지된다는 점입니다.
코드 예시¶
Teradata BTEQ:¶
.logmech LDAP;
.logon $LOGON_STR;
.SET DEFAULTS;
$(<$INPUT_SQL_FILE)
.export reset
.logoff
.quit
Python:¶
#*** Generated code is based on the SnowConvert AI Python Helpers version 2.0.6 ***
from snowconvert.helpers import exec_file
import os
import sys
import snowconvert.helpers
from snowconvert.helpers import Export
from snowconvert.helpers import exec
from snowconvert.helpers import BeginLoading
con = None
#** SSC-FDM-TD0022 - SHELL VARIABLES FOUND, RUNNING THIS CODE IN A SHELL SCRIPT IS REQUIRED **
def main():
snowconvert.helpers.configure_log()
con = snowconvert.helpers.log_on()
#** SSC-FDM-0027 - REMOVED NEXT STATEMENT, NOT APPLICABLE IN SNOWFLAKE. LOGMECH **
#.logmech LDAP;
#** SSC-FDM-0027 - REMOVED NEXT STATEMENT, NOT APPLICABLE IN SNOWFLAKE. LOGON **
#.logon $LOGON_STR
#** SSC-EWI-TD0005 - THE STATEMENT WAS CONVERTED BUT ITS FUNCTIONALITY IS NOT IMPLEMENTED YET **
Export.defaults()
#** SSC-FDM-TD0014 - EXECUTION OF FILE WITH SQL STATEMENTS STOPS WHEN AN ERROR OCCURS **
exec_file("$INPUT_SQL_FILE")
#** SSC-EWI-TD0005 - THE STATEMENT WAS CONVERTED BUT ITS FUNCTIONALITY IS NOT IMPLEMENTED YET **
Export.reset()
#** SSC-FDM-0027 - REMOVED NEXT STATEMENT, NOT APPLICABLE IN SNOWFLAKE. LOGOFF **
#.logoff
snowconvert.helpers.quit_application()
if __name__ == "__main__":
main()
모범 사례¶
추가 지원이 필요한 경우 snowconvert-support@snowflake.com으로 이메일을 보내주세요.
SSC-FDM-TD0015¶
Regexp_Substr 함수는 POSIX 정규식만 지원합니다.
참고
이 FDM는 더 이상 사용되지 않습니다. SSC-EWI-0009 설명서를 참조하세요.
설명¶
현재, Snowflake에서는 POSIX 기본 정규식 구문을 넘어서는 확장된 정규식을 지원하지 않습니다.
이 EWI는 지원되지 않는 정규식이 있을 수 있음을 경고하기 위해 REGEX_SUBSTR, REGEX_REPLACE,_ 또는 _REGEX_INSTR_에 대한 함수 호출이 SnowFlake로 변환될 때마다 추가됩니다. 지원되지 않는 기능에는 lookahead, lookbehind, non-capturing groups 등이 있습니다.
코드 예시¶
Teradata:¶
SELECT REGEXP_SUBSTR('qaqequ','q(?=u)', 1, 1);
Snowflake Scripting:¶
SELECT
--** SSC-FDM-TD0015 - REGEXP_SUBSTR FUNCTION ONLY SUPPORTS POSIX REGULAR EXPRESSIONS **
REGEXP_SUBSTR('qaqequ','q(?=u)', 1, 1);
모범 사례¶
각 경우에 사용된 정규식을 확인하여 수동 개입이 필요한지 확인합니다. SnowFlake의 확장된 정규식 지원 및 대안에 대한 자세한 정보는 여기에서 확인할 수 있습니다.
추가 지원이 필요한 경우 snowconvert-support@snowflake.com으로 이메일을 보내주세요.
SSC-FDM-TD0016¶
매개 변수 ‘match_arg’의 값 ‘l’는 Snowflake에서 지원되지 않습니다
설명¶
REGEX_SUBSTR, REGEX_REPLACE, 또는 REGEX_INSTR 등의 Teradata 함수에는 다음과 같은 유효한 값을 가진 문자 인자인 “match_arg”라는 매개 변수가 있습니다.
'i': 대소문자를 구분하지 않는 일치입니다.'c': 대소문자를 구분하는 일치입니다.'n': 마침표 문자(모든 문자와 일치)는 줄 바꿈 문자와 일치할 수 있습니다.'m': 소스 문자열이 한 라인이 아닌 여러 라인으로 처리됩니다.'l': source_string 크기가 현재 허용되는 최대 source_string 크기(현재 16MB)를 초과하는 경우 오류 대신 NULL이 반환됩니다.'x': 공백을 무시합니다(패턴 문자열에만 영향을 미침).
인자에는 둘 이상의 문자가 포함될 수 있습니다.
Snowflake에서 이러한 함수에 해당하는 인자는 _regexp_parameters._입니다. 일치 항목을 검색하는 데 사용되는 정규식 매개 변수를 지정하는 하나 이상의 문자로 구성된 문자열입니다. 지원되는 값은 다음과 같습니다.
c: 대소문자를 구분합니다.i: 대소문자를 구분하지 않습니다.m: 여러 라인 모드입니다.e: 하위 일치 항목을 추출합니다.s: ‘.’ 와일드카드는 줄 바꿈 문자와도 일치합니다.
보시다시피, 'i', 'c', 'm' 값은 두 언어에서 동일하며, Teradata의 'n' 값은 's'에 매핑됩니다. 그러나 'l', 'x' 값에는 상응하는 값이 없습니다.
'x' 값의 경우, REGEXP_REPLACE 함수 호출을 생성하여 해당 기능을 복제합니다. 그러나 'l' 매개변수는 복제될 수 없으므로 이 경고가 생성됩니다.
입력 코드:¶
SELECT REGEXP_SUBSTR('Chip Chop','ch(i|o)p', 1, 1, 'i'),
REGEXP_SUBSTR('Chip Chop','ch(i|o)p', 1, 1, 'c'),
REGEXP_SUBSTR('Chip Chop','ch(i|o)p', 1, 1, 'm'),
REGEXP_SUBSTR('Chip Chop','ch(i|o)p', 1, 1, 'n'),
REGEXP_SUBSTR('Chip Chop','ch(i|o)p', 1, 1, 'l'),
REGEXP_SUBSTR('Chip Chop','ch(i|o)p', 1, 1, 'x');
생성된 코드:¶
SELECT
REGEXP_SUBSTR('Chip Chop', 'ch(i|o)p', 1, 1, 'i'),
REGEXP_SUBSTR('Chip Chop', 'ch(i|o)p', 1, 1, 'c'),
REGEXP_SUBSTR('Chip Chop', 'ch(i|o)p', 1, 1, 'm'),
REGEXP_SUBSTR('Chip Chop', 'ch(i|o)p', 1, 1, 's'),
--** SSC-FDM-TD0016 - VALUE 'l' FOR PARAMETER 'match_arg' IS NOT SUPPORTED IN SNOWFLAKE **
REGEXP_SUBSTR('Chip Chop', 'ch(i|o)p', 1, 1),
REGEXP_SUBSTR('Chip Chop', 'ch(i|o)p', 1, 1);
모범 사례¶
추가 지원이 필요한 경우 snowconvert-support@snowflake.com으로 이메일을 보내주세요.
SSC-FDM-TD0017¶
Snowflake에서는 외래 테이블 사용이 지원되지 않습니다.
참고
이 FDM은 더 이상 사용되지 않습니다. SSC-EWI-TD0076 설명서를 참조하세요.
설명¶
외래 테이블을 사용하면 Amazon S3, Azure Blob storage, Google Cloud Storage의 반정형 및 비정형 데이터와 같은 외부 오브젝트 저장소의 데이터에 액세스할 수 있습니다. 이 구문은 Snowflake에서 지원되지 않습니다. 그러나 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
--** SSC-FDM-TD0017 - 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<table> 문에서 지원하는 모든 형식으로 저장된 데이터에 액세스할 수 있습니다.
또 다른 대안은 Snowflake의 Iceberg 테이블입니다. Iceberg 테이블을 개방형 형식과 고객이 제공하는 클라우드 저장소를 사용하는 테이블로 생각할 수 있습니다. 이 데이터는 Parquet 파일에 저장됩니다.
마지막으로, 표준 Snowflake 테이블이 있습니다. 이 테이블은 Teradata에서 외래 테이블의 기능을 다루는 옵션이 될 수 있습니다.
추가 지원이 필요한 경우 snowconvert-support@snowflake.com으로 이메일을 보내주세요.
SSC-FDM-TD0018¶
JSON 경로가 인식되지 않습니다
참고
이 FDM은 더 이상 사용되지 않습니다. SSC-EWI-TD0063 설명서를 참조하세요.
설명¶
이 메시지는 문자열이 예상 형식이 아니거나 snowflake 에서 지원되지 않아 SnowConvert AI가 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
--** SSC-FDM-TD0018 - 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-FDM-TD0019¶
트랜잭션 및 프로필 수준 쿼리 태그는 Snowflake에서 지원되지 않으며, 대신 세션 쿼리 태그를 참조합니다
설명¶
Teradata를 통해 사용자는 트랜잭션, 세션 및 프로필 수준에서 쿼리 밴드를 정의할 수 있을 뿐만 아니라 GetQueryBandValue와 같은 함수를 통해 이를 참조할 수도 있습니다.
쿼리 밴드에 상응하는 Snowflake 기능은 query_tag parameter 매개 변수로, 세션, 사용자 또는 계정에 설정할 수 있습니다. 또한 Snowflake에는 프로필이 없습니다.
이러한 차이로 인해, Snowflake에서 트랜잭션 또는 프로필 수준 쿼리 태그를 정의하거나 참조할 수 없어 세션 수준 쿼리 태그가 대체 태그로 사용되고 경우에 따라 기능적 차이가 발생할 수 있음을 경고하기 위해 이 FMD가 추가됩니다.
코드 예시¶
입력 코드:¶
SELECT GETQUERYBANDVALUE(3, 'account');
생성된 코드¶
SELECT
--** SSC-FDM-TD0019 - TRANSACTION AND PROFILE LEVEL QUERY TAGS NOT SUPPORTED IN SNOWFLAKE, REFERENCING SESSION QUERY TAG INSTEAD **
GETQUERYBANDVALUE_UDF('account');
모범 사례¶
세션 수준에서 쿼리 밴드를 사용하도록 코드 논리를 수정합니다.
추가 지원이 필요한 경우 snowconvert-support@snowflake.com으로 이메일을 보내주세요.
SSC-FDM-TD0020¶
JSON 값이 유효하지 않은 형식으로 인해 인식되지 않습니다
참고
출력 코드의 일부 부분은 명확성을 위해 생략되었습니다.
설명¶
이 메시지는 SnowConvert AI가 변환 컨텍스트에 대한 JSON 데이터를 역직렬화해야 하지만 JSON 값에 예상된 형식이 없거나 JSON이 유효하지 않은 경우에 표시됩니다.
코드 예시¶
입력 코드:¶
SELECT
*
FROM
JSON_TABLE
(ON (SELECT id,
trainSchedule as ts
FROM demo.PUBLIC.Train T)
USING rowexpr('$.weekShedule.Monday[*]')
colexpr('[ {"ordinal" true},
{"jsonpath" "$.time",
"type"" : "CHAR ( 12 )"},
{"jsonpath" "$.city",
"type" : "VARCHAR ( 12 )"}]'))
AS JT(Id, Ordinal, Time, City);
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
(
SELECT
id
--** SSC-FDM-TD0020 - UNRECOGNIZED JSON LITERAL [ {"ordinal" true}, {"jsonpath" "$.time", "type"" : "CHAR ( 12 )"}, {"jsonpath" "$.city", "type" : "VARCHAR ( 12 )"}] **
FROM
demo.PUBLIC.Train T,
TABLE(FLATTEN(INPUT =>
trainSchedule:weekShedule.Monday)) rowexpr
) JT;
SELECT
*
FROM
(
SELECT
id
--** SSC-FDM-TD0020 - UNRECOGNIZED JSON LITERAL {"jsonpath" "$.time", "type"" : "CHAR ( 12 )"} **
FROM
demo.PUBLIC.Train T,
TABLE(FLATTEN(INPUT =>
trainSchedule:weekShedule.Monday)) rowexpr
) JT;
모범 사례¶
JSON에 Teradata 문법을 따르는 예상되는 형식이 있는지 확인합니다.
추가 지원이 필요한 경우 snowconvert-support@snowflake.com으로 이메일을 보내주세요.
SSC-FDM-TD0021¶
{0}에 대한 기본 제공 참조는 Snowflake에서 지원되지 않습니다.
참고
이 EWI는 더 이상 사용되지 않습니다. SSC-EWI-TD0046 설명서를 참조하세요.
설명¶
이 오류는 DBC.DATABASES 테이블을 참조하는 쿼리가 실행되고 선택한 열에 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;
모범 사례¶
추가 지원이 필요한 경우 snowconvert-support@snowflake.com으로 이메일을 보내주세요.
SSC-FDM-TD0022¶
셸 변수가 발견되었습니다. 셸 스크립트에서 이 코드를 실행해야 합니다.
설명¶
Teradata 스크립트에서 셸 변수는 스크립트 전체에서 액세스하고 조작할 수 있는 임시 값을 저장하는 데 사용됩니다. 셸 변수는 달러 기호($) 다음에 이름(중괄호로 묶을 수 있음)을 사용하여 정의되며, 할당 연산자(=)를 사용하여 값을 설정할 수 있습니다.
#!/bin/bash
## define a shell variable
tablename="mytable"
## use the variable in a Teradata SQL query
bteq <<EOF
.LOGON myhost/myuser,mypassword
SELECT * FROM ${tablename};
.LOGOFF
EOF
셸 변수는 문자열 보간과 동일하거나 유사한 기능을 갖는다고 생각하면 됩니다. 따라서 변환 시 이 기능을 유지하는 것이 중요합니다.\ \ 스크립트를 Python으로 변환할 때 셸 변수는 셸 스크립트(.sh 파일)에서 변환된 코드를 실행하여 기능을 유지합니다. 따라서 이러한 셸 변수는 입력 코드와 동일한 형식을 유지해야 합니다.
코드 예시¶
입력 코드:¶
SELECT $column FROM ${tablename}
생성된 코드¶
#*** Generated code is based on the SnowConvert AI 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
#** SSC-FDM-TD0022 - SHELL VARIABLES FOUND, RUNNING THIS CODE IN A SHELL SCRIPT IS REQUIRED **
def main():
snowconvert.helpers.configure_log()
con = snowconvert.helpers.log_on()
exec("""
SELECT
$column
FROM
${tablename}
""")
snowconvert.helpers.quit_application()
if __name__ == "__main__":
main()
모범 사례¶
변환된 코드를 셸 스크립트에서 실행해야 합니다.
추가 지원이 필요한 경우 snowconvert-support@snowflake.com으로 이메일을 보내주세요.
SSC-FDM-TD0023¶
문자열 유사성이 다르게 동작할 수 있습니다.
설명¶
이 FDM은 SnowConvert AI가 유사성 함수를 Teradata에서 Snowflake로 변환하는 경우에 표시됩니다. 즉, 결과가 다르게 동작할 수 있음을 의미합니다.
코드 예시¶
다음 데이터를 예로 들어 보겠습니다.
Id |
a |
b |
|---|---|---|
1 |
||
2 |
Gute nacht |
Ich weis nicht |
3 |
Ich weiß nicht |
Ich wei? nicht |
4 |
Ich weiß nicht |
Ich wei? nicht |
5 |
Ich weiß nicht |
Ich weiss nicht |
6 |
Snowflake |
Oracle |
7 |
święta |
swieta |
8 |
NULL |
|
9 |
NULL |
NULL |
입력 코드:¶
쿼리¶
-- Additional Params: -q SnowScript
SELECT * FROM StringSimilarity (
ON (
SELECT id, CAST(a AS VARCHAR(200)) AS a, CAST(b AS VARCHAR(200)) AS b
FROM table_1
) PARTITION BY ANY
USING
ComparisonColumnPairs ('jaro_winkler(a,b) AS sim_fn')
Accumulate ('id')
) AS dt ORDER BY 1;
결과¶
| Id | sim_fn |
|---|---|
| 1 | 0 |
| 2 | 0.565079365 |
| 3 | 1 |
| 4 | 0.959047619 |
| 5 | 0 |
| 6 | 0.611111111 |
| 7 | 0.7777777777777777 |
| 8 | 0 |
| 9 | 0 |
생성된 코드¶
쿼리¶
SELECT
* FROM
--** SSC-FDM-TD0023 - STRING SIMILARITY MIGHT HAVE A DIFFERENT BEHAVIOR. **
(
SELECT
id,
JAROWINKLER_UDF(a, b) AS sim_fn
FROM table_1
) dt ORDER BY 1;
결과¶
ID |
SIM_FN |
|---|---|
1 |
0.000000 |
2 |
0.560000 |
3 |
0.970000 |
4 |
0.950000 |
5 |
0.000000 |
6 |
0.610000 |
7 |
0.770000 |
8 |
0.000000 |
9 |
0.000000 |
모범 사례¶
추가 지원이 필요한 경우 snowconvert-support@snowflake.com으로 이메일을 보내주세요.
SSC-FDM-TD0024¶
테이블 설정 기능은 지원되지 않습니다.
설명¶
이 EWI는 SnowConvert AI가 SET 옵션이 있는 Create Table을 발견하는 경우에 표시됩니다. SET TABLE은 Snowflake에서 지원되지 않으므로 제거됩니다.
코드 예시¶
Teradata:¶
CREATE SET TABLE TableExample
(
ColumnExample Number
)
CREATE SET VOLATILE TABLE SOMETABLE, LOG AS
(SELECT ColumnExample FROM TableExample);
Snowflake Scripting:¶
--** SSC-FDM-TD0024 - SET TABLE FUNCTIONALITY NOT SUPPORTED. TABLE MIGHT HAVE DUPLICATE ROWS **
CREATE OR REPLACE TABLE TableExample
(
ColumnExample NUMBER(38, 18)
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"teradata"}}'
;
--** SSC-FDM-TD0024 - SET TABLE FUNCTIONALITY NOT SUPPORTED. TABLE MIGHT HAVE DUPLICATE ROWS **
CREATE OR REPLACE TEMPORARY TABLE SOMETABLE
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"teradata"}}'
AS
(
SELECT
ColumnExample FROM
TableExample
);
모범 사례¶
추가 지원이 필요한 경우 snowconvert-support@snowflake.com으로 이메일을 보내주세요.
SSC-FDM-TD0025¶
Teradata Database Temporal 테이블은 Snowflake에서 지원되지 않습니다
설명¶
Teradata Database Temporal 지원에는 Temporal 테이블과 Temporal DDL 및 DML 오브젝트를 생성하는 기능이 포함되어 있습니다. Temporal(시간 인식) 테이블 및 데이터에 대한 지원은 Snowflake에서 절대적인 기능 동등성이 없으므로 지원되지 않습니다.
이러한 모든 문은 SnowConvert AI에서 인식(구문 분석)되지만, Snowflake에서 쿼리를 실행하기 위해 해당 요소는 변환 프로세스에서 제거됩니다.
abort문이 발견되는 경우 동등한 기능을 유지하기 위해 Delete 명령으로 변환되며, 이를 통해 트랜잭션 중에 수행된 작업을 실행 취소하고 데이터베이스를 처음의 상태로 복원할 수 있습니다.
코드 예시¶
다음 예는 Temporal 형식의 Select가 일반적인 Select로 변환되는 것을 보여줍니다.
입력 코드:¶
SEQUENCED VALIDTIME
SELECT
Policy_ID,
Customer_ID
FROM Policy
WHERE Policy_Type = 'AU';
생성된 코드:¶
----** SSC-FDM-TD0025 - TEMPORAL FORMS ARE NOT SUPPORTED IN SNOWFLAKE **
--SEQUENCED VALIDTIME
SELECT
Policy_ID,
Customer_ID
FROM
Policy
WHERE
UPPER(RTRIM( Policy_Type)) = UPPER(RTRIM('AU'));
트랜잭션의 컨텍스트에서 Abort 명령이 사용되는 경우입니다.
입력 코드:¶
CREATE OR REPLACE PROCEDURE TEST.ABORT_STATS()
BEGIN
CURRENT VALIDTIME AND NONSEQUENCED TRANSACTIONTIME ABORT
FROM table_1
WHERE table_1.x1 = 1;
END;
생성된 코드:¶
CREATE OR REPLACE PROCEDURE TEST.ABORT_STATS ()
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"teradata"}}'
EXECUTE AS CALLER
AS
$$
BEGIN
-- CURRENT VALIDTIME AND NONSEQUENCED TRANSACTIONTIME
--** SSC-FDM-TD0025 - TEMPORAL FORMS ARE NOT SUPPORTED IN SNOWFLAKE **
LET _ROW_COUNT FLOAT;
SELECT
COUNT(*)
INTO
_ROW_COUNT
FROM
table_1
WHERE table_1.x1 = 1;
IF (_ROW_COUNT > 0) THEN
ROLLBACK;
END IF;
END;
$$;
¶
모범 사례¶
추가 사용자 작업이 필요하지 않습니다.
추가 지원이 필요한 경우 snowconvert-support@snowflake.com으로 이메일을 보내주세요.
SSC-FDM-TD0026¶
if 문 반전으로 인해 GOTO 문이 제거되었습니다.
참고
출력 코드의 일부 부분은 명확성을 위해 생략되었습니다.
설명 ¶
SQL if 문의 기능을 복제하기 위해 IF 및 LABEL 명령과 함께 GOTO 명령을 사용하는 것이 일반적입니다. 이러한 방식으로 사용하면 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
--** SSC-FDM-TD0026 - 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
$$
모범 사례¶
추가 지원이 필요한 경우 snowconvert-support@snowflake.com으로 이메일을 보내주세요.
SSC-FDM-TD0027¶
TD_UNPIVOT 변환에 필요한 열 정보를 찾을 수 없으며, 결과에 열이 누락되었습니다
참고
이 FDM은 더 이상 사용되지 않습니다. SSC-EWI-TD0061 설명서를 참조하세요.
설명¶
SnowConvert AI는 테이블의 열을 행으로 표현하는 데 사용할 수 있는 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 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"}}'
;
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;
SELECT
* FROM
--** SSC-FDM-TD0027 - 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;
모범 사례¶
열에 대한 정보를 변환 도구에 제공하는 두 가지 방법이 있습니다. 테이블 사양을 TD_UNPIVOT 호출과 동일한 파일에 포함하거나 ON 식의 SELECT 쿼리에 SELECT * 또는 테이블 이름 대신 열 목록을 지정하는 것입니다.
입력 테이블 또는 테이블의 모든 열이 피벗 해제된 경우 이 문제를 무시해도 됩니다. 그렇지 않은 경우 결과에 열이 누락됩니다.
추가 지원이 필요한 경우 snowconvert-support@snowflake.com으로 이메일을 보내주세요.
SSC-FDM-TD0028¶
JSON_TABLE이 변환되지 않았습니다. 의미 체계 정보에서 열 이름을 검색할 수 없습니다
참고
이 FDM은 더 이상 사용되지 않습니다. SSC-EWI-TD0060 설명서를 참조하세요.
설명¶
JSON_TABLE 함수는 SnowConvert AI에서 변환할 수 있지만, 변환을 위해서는 JSON_TABLE ON 하위 쿼리에서 선택되는 열의 이름을 알아야 합니다.
이 메시지는 열 이름이 하위 쿼리에 명시적으로 입력되지 않았으며(예: SELECT * 사용) 참조되는 테이블의 의미 체계 정보를 찾을 수 없어 열 이름을 추출할 수 없음을 경고하기 위해 생성됩니다.
코드 예시¶
입력 코드:¶
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 TABLE demo.Train (
firstCol INT,
jsonCol VARIANT,
thirdCol VARCHAR(30)
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"teradata"}}'
;
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
--** SSC-FDM-TD0028 - JSON_TABLE NOT TRANSFORMED, COLUMN NAMES COULD NOT BE RETRIEVED FROM SEMANTIC INFORMATION **
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
T.*
FROM
demo.missingTable T)
USING rowexpr('$.schools[*]')
colexpr('[ {"jsonpath" : "$.name",
"type" : "CHAR(20)"},
{"jsonpath" : "$.type",
"type" : "VARCHAR(20)"}]')
)
AS JT;
모범 사례¶
SnowConvert AI에 제공된 코드가 완전한지 확인합니다. 테이블 정의를 제공하지 않은 경우 존재하는 테이블 정의로 코드를 다시 실행합니다.
추가 지원이 필요한 경우 snowconvert-support@snowflake.com으로 이메일을 보내주세요.
SSC-FDM-TD0029¶
Snowflake에서 지원하는 TO_CHAR 형식은 Teradata와 다르며 실패하거나 동작이 다를 수 있습니다
세션 매개 변수에 종속되는 요소 형식 지정하기¶
일부 Teradata 형식 요소는 세션 매개 변수의 값에 따라 달라지는 Snowflake 함수에 매핑됩니다. 결과의 기능적 차이를 방지하려면 이러한 세션 매개 변수를 Teradata에서와 동일한 값으로 설정해야 합니다. 이러한 종류의 함수에 매핑되는 식별된 형식 요소는 다음과 같습니다.
D:
DAYOFWEEK함수에 매핑됩니다. 이 함수의 결과는WEEK_START세션 매개 변수에 따라 달라집니다. 기본적으로 Teradata는 일요일을 주의 첫 번째 요일로 간주하는 반면, Snowflake는 월요일을 첫 번째 요일로 간주합니다.WW:
WEEK함수에 매핑됩니다. 이 함수는WEEK_OF_YEAR_POLICY세션 매개 변수에 따라 달라집니다. 기본적으로 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에서 사용되는 값과 동일한 값으로 설정합니다.
TO_CHAR(Numeric)의 경우 Snowflake는 TM9 또는 TME 형식 중 하나를 통해 varchar 표현을 생성하여 숫자를 간략하게 표현합니다. 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') /*** SSC-FDM-TD0029 - 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') /*** SSC-FDM-TD0029 - 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') /*** SSC-FDM-TD0029 - SNOWFLAKE SUPPORTED FORMATS FOR TO_CHAR DIFFER FROM TERADATA AND MAY FAIL OR HAVE DIFFERENT BEHAVIOR ***/;
SELECT
TO_CHAR(45620) /*** SSC-FDM-TD0029 - SNOWFLAKE SUPPORTED FORMATS FOR TO_CHAR DIFFER FROM TERADATA AND MAY FAIL OR HAVE DIFFERENT BEHAVIOR ***/;
모범 사례¶
FF를 사용하는 경우 Teradata에서 사용하는 전체 자릿수와 동일한 전체 자릿수로 DateTime 유형을 지정하거나 다른 동작을 방지하기 위해 형식 요소에 전체 자릿수를 추가합니다.
타임존 관련 형식 요소를 사용하는 경우 다른 동작을 방지하기 위해
TIMESTAMP_TZ유형의 첫 번째 매개 변수를 사용합니다. 또한 Snowflake에서는TIME유형에 타임존 정보를 포함할 수 없습니다.다른 동작을 방지하려면 필요한 세션 매개 변수를 Teradata의 기본값으로 설정합니다.
추가 지원이 필요한 경우 snowconvert-support@snowflake.com으로 이메일을 보내주세요.
SSC-FDM-TD0030¶
동일한 실행 흐름을 보장하기 위해 Label 섹션의 끝에 Return 문이 추가되었습니다
설명¶
GOTO 문이 Label 섹션으로 바뀌고 Return 문이 포함되지 않은 경우 동일한 실행 흐름을 보장하기 위해 섹션 끝에 Return 문이 추가됩니다.
GOTO 명령이 실행된 후 BTEQ에서는 GOTO 명령과 이름이 같은 Label 명령 사이의 문은 무시됩니다. 따라서 이러한 문이 실행되지 않도록 방지하려면 Label 섹션에 Return 문이 포함되어야 합니다.
또한 GOTO 명령은 실행이 다시 시작되는 동일한 이름의 Label을 제외한 다른 모든 문을 건너뛴다는 점에 유의해야 합니다. 따라서 GOTO 명령 이전에 정의된 Label 섹션에서는 실행이 다시 시작되지 않습니다.
코드 예시¶
입력 코드:¶
-- 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
-- Additional Params: --scriptsTargetLanguage SnowScript
--.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;
--** SSC-FDM-TD0030 - 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
$$
모범 사례¶
추가 지원이 필요한 경우 snowconvert-support@snowflake.com으로 이메일을 보내주세요.
SSC-FDM-TD0031¶
ST_DISTANCE 결과가 ST_SPHERICALDISTANCE와 약간 다릅니다
설명¶
Teradata 함수 ST_SPHERICALDISTANCE는 Haversine 공식을 사용하여 행성의 두 구면 좌표 사이의 거리를 계산하지만, Snowflake ST_DISTANCE 함수는 Haversine 공식을 사용하여 두 지리적 지점 사이의 최소 거리를 계산하지 않습니다.
코드 예시¶
입력 코드:¶
--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;
Teradata 출력¶
location1 |
location2 |
Distance_In_Km |
|---|---|---|
POINT (-73.989308 40.741895) |
POINT (40.741895 34.053691) |
9351139.978062356 |
생성된 코드¶
--The distance between New York and Los Angeles
SELECT
TO_GEOGRAPHY('POINT(-73.989308 40.741895)') As location1,
TO_GEOGRAPHY('POINT(40.741895 34.053691)') As location2,
--** SSC-FDM-TD0031 - ST_DISTANCE RESULTS ARE SLIGHTLY DIFFERENT FROM ST_SPHERICALDISTANCE **
ST_DISTANCE(
location1, location2) As Distance_In_km;
Snowflake 출력¶
LOCATION1 |
LOCATION2 |
DISTANCE_IN_KM |
|---|---|---|
{ “coordinates”: [ -73.989308, 40.741895 ], “type”: “Point” } |
{ “coordinates”: [ 40.741895, 34.053691 ], “type”: “Point” } |
9351154.65572674 |
모범 사례¶
추가 지원이 필요한 경우 snowconvert-support@snowflake.com으로 이메일을 보내주세요.
SSC-FDM-TD0032¶
CASESPECIFIC 절이 LIKE 식에서 제거되었습니다
참고
출력 코드의 일부 부분은 명확성을 위해 생략되었습니다.
설명¶
이 오류는 LIKE 식에 [NOT] CASESPECIFIC 절이 수반되는 경우에 표시됩니다.
코드 예시¶
입력 코드:¶
SELECT * FROM MY_TABLE
WHERE Name Like 'Marco%' (NOT CASESPECIFIC);
생성된 코드¶
SELECT
* FROM
MY_TABLE
WHERE Name ILIKE 'Marco%' /*** SSC-FDM-TD0032 - NOT CASESPECIFIC CLAUSE WAS REMOVED ***/;
모범 사례¶
TERADATA의 케이스별 동작은 TMODE 시스템 구성에 따라 달라집니다.
추가 지원이 필요한 경우 snowconvert-support@snowflake.com으로 이메일을 보내주세요.
SSC-FDM-TD0033¶
ACTIVITY_COUNT 변환에 수동 조정이 필요할 수 있습니다
설명¶
ACTIVITY_COUNT 상태 변수는 임베드된 SQL 또는 저장 프로시저 애플리케이션에서 SQL DML 문의 영향을 받는 행 수를 반환합니다. 자세한 내용은 여기에서 확인하세요.
변환 사양에 설명된 대로, ACTIVITY_COUNT의 동작을 에뮬레이트하는 해결 방법은 다음과 같습니다.
SELECT $1 FROM TABLE(RESULT_SCAN(LAST_QUERY_ID()));
그러나 여기에는 아래와 같이 몇 가지 제한 사항이 있습니다.
제한 사항 ¶
첫 번째 경우¶
ACTIVITY_COUNT는 다른 DML 문을 실행하기 전에 가 두 번 이상 호출됩니다. 변환이 예상되는 값을 반환하지 않을 수 있습니다.
Teradata¶
REPLACE PROCEDURE InsertEmployeeSalaryAndLog_1 ()
BEGIN
DECLARE row_count1 INT;
INSERT INTO employees (employee_id, first_name, last_name, department_id, salary)
VALUES (101, 'Alice', 'Smith', 10, 70000.00);
-- Get the ACTIVITY_COUNT
SET row_count1 = ACTIVITY_COUNT;
SET row_count1 = ACTIVITY_COUNT;
-- Insert the ACTIVITY_COUNT into the activity_log table
INSERT INTO activity_log (operation, row_count)
VALUES ('INSERT PROCEDURE', row_count1);
END;
REPLACE PROCEDURE InsertEmployeeSalaryAndLog_2 ()
BEGIN
DECLARE row_count1 INT;
DECLARE message VARCHAR(100);
INSERT INTO employees (employee_id, first_name, last_name, department_id, salary)
VALUES (101, 'Alice', 'Smith', 10, 70000.00);
-- Get the ACTIVITY_COUNT
SET row_count1 = ACTIVITY_COUNT + 1;
SET row_count1 = ACTIVITY_COUNT;
-- Insert the ACTIVITY_COUNT into the activity_log table
INSERT INTO activity_log (operation, row_count)
VALUES ('INSERT PROCEDURE', row_count1);
END;
Snowflake¶
CREATE OR REPLACE PROCEDURE InsertEmployeeSalaryAndLog_1 ()
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
row_count1 INT;
BEGIN
INSERT INTO employees (employee_id, first_name, last_name, department_id, salary)
VALUES (101, 'Alice', 'Smith', 10, 70000.00);
-- Get the ACTIVITY_COUNT
row_count1 := (
SELECT
$1
FROM
TABLE(RESULT_SCAN(LAST_QUERY_ID()))
) /*** SSC-FDM-TD0033 - 'ACTIVITY_COUNT' TRANSFORMATION MIGHT REQUIRE MANUAL ADJUSTMENTS ***/;
row_count1 := (
SELECT
$1
FROM
TABLE(RESULT_SCAN(LAST_QUERY_ID()))
) /*** SSC-FDM-TD0033 - 'ACTIVITY_COUNT' TRANSFORMATION MIGHT REQUIRE MANUAL ADJUSTMENTS ***/;
-- Insert the ACTIVITY_COUNT into the activity_log table
INSERT INTO activity_log (operation, row_count)
VALUES ('INSERT PROCEDURE', :row_count1);
END;
$$;
CREATE OR REPLACE PROCEDURE InsertEmployeeSalaryAndLog_2 ()
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
row_count1 INT;
message VARCHAR(100);
BEGIN
INSERT INTO employees (employee_id, first_name, last_name, department_id, salary)
VALUES (101, 'Alice', 'Smith', 10, 70000.00);
-- Get the ACTIVITY_COUNT
row_count1 := (
SELECT
$1
FROM
TABLE(RESULT_SCAN(LAST_QUERY_ID()))
) /*** SSC-FDM-TD0033 - 'ACTIVITY_COUNT' TRANSFORMATION MIGHT REQUIRE MANUAL ADJUSTMENTS ***/ + 1;
row_count1 := (
SELECT
$1
FROM
TABLE(RESULT_SCAN(LAST_QUERY_ID()))
) /*** SSC-FDM-TD0033 - 'ACTIVITY_COUNT' TRANSFORMATION MIGHT REQUIRE MANUAL ADJUSTMENTS ***/;
-- Insert the ACTIVITY_COUNT into the activity_log table
INSERT INTO activity_log (operation, row_count)
VALUES ('INSERT PROCEDURE', :row_count1);
END;
$$;
두 프로시저 모두에서 ACTIVITY_COUNT는 다른 DML 문이 호출되기 전에 두 번 호출됩니다. Teradata에서 ACTIVITY_COUNT는 두 번 호출되더라도 그 위에 있는 INSERT 문의 행 수를 반환합니다. 그러나 Snowflake 변환은 LAST_QUERY_ID()를 사용하므로, 결과는 LAST_QUERY_ID()가 보유한 결과 세트에 따라 다릅니다.
InsertEmployeeSalaryAndLog_1()은 수동으로 조정할 필요가 없습니다. 쿼리 기록을 확인합니다(상향식).
.png)
Query History when calling InsertEmployeeSalaryAndLog_1()
INSERT문이 실행됩니다.LAST_QUERY_ID()는 이 문을 가리킵니다.SELECT(첫 번째ACTIVITY_COUNT)가 실행되고$1는1이 됩니다.LAST_QUERY_ID()는 이 문을 가리킵니다.SELECT(두 번째ACTIVITY_COUNT)가 실행됩니다. 마지막 문 결과가1이었으므로 이SELECT의 경우에도$1는1이 됩니다.마지막으로,
row_count1에는1값이 저장되며, 이 값은activity_log에 삽입됩니다.
반면, InsertEmployeeSalaryAndLog_2()는 수동 조정이 필요합니다. 쿼리 기록을 확인합니다(상향식).
.png)
Query History when calling InsertEmployeeSalaryAndLog_2()
INSERT문이 실행됩니다.LAST_QUERY_ID()는 이 문을 가리킵니다.SELECT(첫 번째
ACTIVITY_COUNT)가 실행되고$1는1이 됩니다. 그러나QUERY_TEXT에+ 10이 있다는 점에 유의합니다. 이는 스캔할 결과에 영향을 미칩니다.LAST_QUERY_ID()는 이 문을 가리킵니다.SELECT(두 번째ACTIVITY_COUNT)가 실행됩니다. 마지막 쿼리의 결과는11이므로$1는 예상한1대신11을 보유하게 됩니다.마지막으로,
row_count1에는11값이 저장되며, 이 값은activity_log에 삽입됩니다.
다음은 activity_log에 삽입된 값입니다.
LOG_ID |
OPERATION |
ROW_COUNT |
LOG_TIMESTAMP |
|---|---|---|---|
1 |
INSERT PROCEDURE |
1 |
2024-07-15 09:22:21.725 |
101 |
INSERT PROCEDURE |
11 |
2024-07-15 09:22:26.248 |
첫 번째 경우에 대한 조정¶
Snowflake 설명서의 LAST_QUERY_ID 설명에 따라 쿼리의 위치를 기준으로 반환할 쿼리를 지정할 수 있습니다.LAST_QUERY_ID(-1)은 최신 쿼리를 반환하고, (-2)는 두 번째로 마지막 쿼리를 반환하는 식입니다.
InsertEmployeeSalaryAndLog_2()의 문제에 대한 해결 방법은 두 번째 사용된 ACTIVITY_COUNT(두 번째 SELECT)용에서 LAST_QUERY_ID(-2)를 지정하여 대신 INSERT 문에서 결과를 가져오는 것입니다.
...
INSERT INTO employees (employee_id, first_name, last_name, department_id, salary)
VALUES (101, 'Alice', 'Smith', 10, 70000.00);
-- Get the ACTIVITY_COUNT
row_count1 := (
SELECT
$1
FROM
TABLE(RESULT_SCAN(LAST_QUERY_ID()))
) /*** SSC-FDM-TD0033 - 'ACTIVITY_COUNT' TRANSFORMATION MIGHT REQUIRE MANUAL ADJUSTMENTS ***/ + 1;
row_count1 := (
SELECT
$1
FROM
TABLE(RESULT_SCAN(LAST_QUERY_ID(-2)))
) /*** SSC-FDM-TD0033 - 'ACTIVITY_COUNT' TRANSFORMATION MIGHT REQUIRE MANUAL ADJUSTMENTS ***/;
...
두 번째 경우¶
DML이 아닌 문이 실행된 후 ACTIVITY_COUNT가 호출되면 변환은 예상 값을 반환하지 않습니다.
Teradata¶
REPLACE PROCEDURE InsertEmployeeSalaryAndLog_3 ()
BEGIN
DECLARE row_count1 INT;
DECLARE emp_id 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 employee_id INTO emp_id FROM employees;
-- Get the ACTIVITY_COUNT
SET row_count1 = ACTIVITY_COUNT;
SET message = 'EMPLOYEE INSERTED - ID: ' || emp_id;
-- Insert the ACTIVITY_COUNT into the activity_log table
INSERT INTO activity_log (operation, row_count)
VALUES (message, row_count1);
END;
Snowflake¶
CREATE OR REPLACE PROCEDURE InsertEmployeeSalaryAndLog_3 ()
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
row_count1 INT;
emp_id 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
employee_id INTO
:emp_id
FROM
employees;
-- Get the ACTIVITY_COUNT
row_count1 := (
SELECT
$1
FROM
TABLE(RESULT_SCAN(LAST_QUERY_ID()))
) /*** SSC-FDM-TD0033 - 'ACTIVITY_COUNT' TRANSFORMATION MIGHT REQUIRE MANUAL ADJUSTMENTS ***/;
message := 'EMPLOYEE INSERTED - ID: ' || emp_id;
-- Insert the ACTIVITY_COUNT into the activity_log table
INSERT INTO activity_log (operation, row_count)
VALUES (:message, :row_count1);
END;
$$;
이전과 유사하게, LAST_QUERY_ID는 올바른 쿼리를 지정하지 않으므로 잘못된 값을 반환하며, 이는 row_count1에 할당됩니다. 쿼리 기록을 확인합니다(상향식).
.png)
Query History when calling InsertEmployeeSalaryAndLog_3()
INSERT문이 실행됩니다.LAST_QUERY_ID()는 이 문을 가리킵니다.SELECT INTO가 실행되고 $1는 101이 됩니다. ``LAST_QUERY_ID()는 이 문을 가리킵니다.SELECT(ACTIVITY_COUNT)가 실행됩니다. 마지막 쿼리의 결과는101이므로$1는 예상한 1 대신101을 보유하게 됩니다.마지막으로,
row_count1에는101값이 저장되며, 이 값은activity_log에 삽입됩니다.
다음은 activity_log에 삽입된 값입니다.
LOG_ID |
OPERATION |
ROW_COUNT |
LOG_TIMESTAMP |
|---|---|---|---|
1 |
EMPLOYEE INSERTED - ID: 101 |
101 |
2024-07-15 11:00:38.000 |
두 번째 경우에 대한 조정¶
한 가지 가능한 해결 방법은
LAST_QUERY_ID에서 반환할 올바른 쿼리를 지정하는 것입니다. 예를 들어, 여기서LAST_QUERY_ID(-2)가 가리켜야 하는 올바른 쿼리입니다.
...
row_count1 := (
SELECT
$1
FROM
TABLE(RESULT_SCAN(LAST_QUERY_ID(-2)))
) /*** SSC-FDM-TD0033 - 'ACTIVITY_COUNT' TRANSFORMATION MIGHT REQUIRE MANUAL ADJUSTMENTS ***/;
...
또 다른 가능한 해결 방법은
INSERT문을 실행한 직후ACTIVITY_COUNT(SELECT)를 사용하는 것입니다.
...
INSERT INTO employees (employee_id, first_name, last_name, department_id, salary)
VALUES (101, 'Alice', 'Smith', 10, 70000.00);
-- Get the ACTIVITY_COUNT
row_count1 := (
SELECT
$1
FROM
TABLE(RESULT_SCAN(LAST_QUERY_ID()))
) /*** SSC-FDM-TD0033 - 'ACTIVITY_COUNT' TRANSFORMATION MIGHT REQUIRE MANUAL ADJUSTMENTS ***/;
SELECT
employee_id INTO
:emp_id
FROM
employees;
message := 'EMPLOYEE INSERTED - ID: ' || emp_id;
...
모범 사례¶
LAST_QUERY_ID를 사용할 때 올바른 쿼리를 지정하도록 합니다.DML 문 직후에
ACTIVITY_COUNT를 사용하여 평가해야 합니다.추가 지원이 필요한 경우 snowconvert-support@snowflake.com으로 이메일을 보내주세요.
SSC-FDM-TD0034¶
Period CONTAINS 식이 사용자 정의 함수로 변환되었습니다.
설명¶
Teradata CONTAINS 식은 오른쪽의 요소가 PERIOD 데이터 타입의 왼쪽의 요소에 포함되어 있는지 여부를 나타내는 유효성 검사를 수행합니다. CONTAINS는 DATE, TIME, TIMESTAMP 또는 PERIOD에만 적용됩니다. PERIOD는 Snowflake에서 지원되지 않으므로 사용자 정의 함수는 네이티브 CONTAINS 동작의 논리를 에뮬레이트합니다.
코드 예시¶
입력 코드:¶
UPDATE TABLE1
SET COL1 = CURRENT_TIMESTAMP
WHERE COL3 CONTAINS CURRENT_TIMESTAMP;
생성된 코드¶
UPDATE TABLE1
SET
COL1 = CURRENT_TIMESTAMP()
WHERE
PUBLIC.PERIOD_CONTAINS_UDF(COL3, CURRENT_TIMESTAMP()) /*** SSC-FDM-TD0034 - PERIOD CONTAINS EXPRESSION TRANSFORMED TO USER DEFINED FUNCTION. ***/
모범 사례¶
PERIOD대신 사용되는VARCHAR는 모든 값에서<PERIOD_BEGIN>*<PERIOD_END>형식을 가정합니다. 값이*와 다른 토큰으로 분할된 경우 SnowConvert AI에서 제공되는PUBLIC.GET_PERIOD_SEPARATORUDF에서 반환된 값을 변경할 수 있습니다. 이 구조체에는 PERIOD의 시작과 끝을 표시하는 토큰이 있어야 하므로 두 날짜, 시간 또는 타임스탬프는 항상 동일한 토큰으로 구분해야 합니다.추가 지원이 필요한 경우 snowconvert-support@snowflake.com으로 이메일을 보내주세요.
SSC-FDM-TD0035¶
Snowflake에는 통계 함수가 필요하지 않습니다.
참고
이 FDM은 더 이상 사용되지 않습니다. SSC-EWI-0037 설명서를 참조하세요.
설명¶
Snowflake에는 DROP, COLLECT 또는 HELP 통계가 필요하지 않습니다. Snowflake는 자동 쿼리 최적화에 사용되는 통계를 이미 수집하고 있으므로 이러한 통계 문이 Teradata에서 사용됩니다.
코드 예시¶
입력 코드:¶
HELP STATISTICS TestName;
생성된 코드¶
----** SSC-FDM-TD0035 - HELP STATISTICS NOT NEEDED. SNOWFLAKE AUTOMATICALLY COLLECTS STATISTICS. **
--HELP STATISTICS TestName
모범 사례¶
추가 지원이 필요한 경우 snowconvert-support@snowflake.com으로 이메일을 보내주세요.
SSC-FDM-TD0036¶
Snowflake는 PEROID 데이터 타입을 지원하지 않으므로, 모든 PEROID는 대신 varchar로 처리됩니다
참고
출력 코드의 일부 부분은 명확성을 위해 생략되었습니다.
생성된 varchar 표현의 전체 자릿수¶
PERIOD_UDF는 Snowflake에 지정된 타임스탬프와 시간에 대한 기본 형식을 사용하여 PEROID를 varchar로 표현합니다. 즉, 타임스탬프의 전체 자릿수는 3이고 시간 변수는 0이 되므로 결과의 전체 자릿수가 예상보다 더 높거나 낮을 수 있습니다. 결과 문자열에 포함되는 전체 자릿수를 수정하는 두 가지 옵션이 있습니다.
PERIOD_UDF의 3가지 매개 변수 버전 사용: 이 함수의 오버로드는 0과 9 사이의 정수인
PRECISIONDIGITS매개 변수를 사용하여 결과에 포함될 소수 시간 부분의 자릿수를 제어합니다. Snowflake가 최대 9자리의 전체 자릿수를 지원하더라도 Teradata의 최대 전체 자릿수는 6자리입니다. 예:
호출 |
결과 |
|---|---|
|
|
|
|
|
|
TIMESTAMP_NTZ_OUTPUT_FORMAT및TIME_OUTPUT_FORMAT세션 매개 변수 변경: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) /*** SSC-FDM-TD0036 - 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') /*** SSC-FDM-TD0036 - SNOWFLAKE DOES NOT SUPPORT THE PERIOD DATATYPE, ALL PERIODS ARE HANDLED AS VARCHAR INSTEAD ***/);
SELECT
PUBLIC.PERIOD_END_UDF(duration) /*** SSC-FDM-TD0036 - SNOWFLAKE DOES NOT SUPPORT THE PERIOD DATATYPE, ALL PERIODS ARE HANDLED AS VARCHAR INSTEAD ***/ from
vacations;
모범 사례¶
PERIOD의 동작 및 관련 함수가 varchar를 사용하여 에뮬레이트되므로 확보한 결과를 검토하여 정확성을 확인하는 것이 좋습니다.추가 지원이 필요한 경우 snowconvert-support@snowflake.com으로 이메일을 보내주세요.