SnowConvert: Teradata 함수의 차이점¶
SSC-FDM-TD0001¶
설명¶
SnowConvert 가 BLOB 데이터 타입을 감지하면 이 메시지가 표시됩니다. Snowflake는 BLOB 을 지원하지 않으므로 자동으로 이진 데이터 타입으로 변환합니다.
코드 예제¶
입력 코드:¶
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¶
설명¶
SnowConvert 가 CLOB 데이터 타입을 만나면 이 메시지가 표시됩니다. SnowConvert 는 CLOB 를 지원하지 않으므로 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¶
설명¶
SnowConvert 가 스크립트 파일을 Snowflake Scripting으로 마이그레이션하면 Bash 스타일 변수 자리 표시자($variable 또는 ${variable})를 SnowSQL 에 해당하는 형식(&variable 또는 &{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;
생성된 코드:¶
-- Additional Params: -q snowscript
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¶
설명¶
Teradata의 PERIOD 데이터 타입은 시간 간격을 나타냅니다. 각 PERIOD 는 시작 및 끝 값이 동일한 유형(TIME, DATE 또는 TIMESTAMP)을 갖습니다. Teradata는 이러한 시간 간격을 생성하고 관리하기 위해 PERIOD, BEGIN, END, OVERLAPS 같은 기본 제공 함수를 제공합니다.
Snowflake는 기간 데이터 타입을 지원하지 않으므로 SnowConvert 는 특정 변환 규칙을 사용하여 이 타입과 관련 함수를 변환합니다.
열 테이블의 기간 유형 선언은 동일한 유형의 두 열로 변환됩니다.
기간 값 생성자 함수 는 시작 값과 끝 값의 두 가지 생성자로 나뉩니다.
기간 유형 매개 변수가 필요한 함수는 사용자 정의 함수(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¶
설명¶
사용자는 SET TIME ZONE
명령을 사용하여 -12:59
과 +14:00
사이의 타임존 오프셋을 설정할 수 있습니다. 그러나 Snowflake는 IANA 타임존 데이터베이스 에 공식적으로 나열된 시간대만 지원합니다.
SET TIME ZONE 을 특정 오프셋과 함께 사용할 때 지정된 오프셋이 표준 타임존과 정확히 일치하지 않는 경우 Snowflake는 가장 가까운 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¶
설명¶
SnowConvert 가 WITH CHECK OPTION 절이 포함된 뷰를 감지하면 이 메시지가 표시됩니다. Snowflake는 이 기능을 지원하지 않으므로 변환된 코드에서 해당 절은 자동으로 설명이 생략됩니다.
이 절을 사용하면 업데이트 가능한 뷰에 대해 INSERT 및 UPDATE 작업을 수행할 수 있습니다. 뷰에서 이러한 명령을 실행하면 해당 뷰와 연결된 기본 테이블에 변경 사항이 자동으로 적용됩니다.
WHERE 절은 뷰에서 명령의 영향을 받을 행을 필터링합니다.
이 절 및 해당 기능에 대한 자세한 내용은 공식 Teradata 설명서 를 참조하십시오.
코드 예시¶
입력 코드:¶
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":1, "minor":0},{"attributes":{"component":"teradata"}}'
AS
SELECT
*
FROM
SOMETABLE
WHERE app_id = 'SUPPLIER'
-- --** SSC-FDM-TD0006 - VIEW WITH OPTION NOT SUPPORTED IN SNOWFLAKE **
-- WITH CHECK OPTION
;
모범 사례¶
추가 지원이 필요하면 snowconvert-support@Snowflake.com으로 문의해 주십시오.
SSC-FDM-TD0007¶
설명¶
이 메시지는 SnowConvert 가 베리언트 데이터 타입으로 코드를 변환하는 동안 COLLATE 절을 만나면 표시됩니다. 베리언트 데이터 타입은 COLLATE 절을 지원하지 않으므로 SnowConvert 는 COLLATE 절을 제거하고 알림 메시지를 표시합니다.
코드 예시¶
입력 코드:¶
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¶
설명¶
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¶
설명¶
SnowConvert 가 VARCHAR 이외의 데이터 타입을 가진 DEFAULT SESSION 을 감지하면 이 메시지가 표시됩니다. 이러한 경우 SnowConvert 는 데이터 타입을 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”라는 이름의 열은 INTEGER 데이터 타입으로 정의되어 있으며 DEFAULT SESSION 설정이 있습니다. 데이터 타입이 VARCHAR 이 아닌 INTEGER 이므로 시스템은 출력에서 VARCHAR 로 자동 변환합니다.
ColumnExample2 의 데이터 타입은 이미 VARCHAR 로 정의되어 있으므로 변경되지 않습니다.
모범 사례¶
사용자 측의 작업은 필요하지 않습니다.
추가 지원이 필요하면 snowconvert-support@Snowflake.com으로 문의해 주십시오.
SSC-FDM-TD0010¶
설명¶
Teradata 테이블 DBC.COLUMNSV
는 Snowflake의 INFORMATION_SCHEMA.COLUMNS
으로 매핑됩니다. 하지만 주의하십시오.
일부 Teradata 열에는 Snowflake에 해당 열이 없습니다
시스템 간에 열이 일치하는 경우 데이터 내용이 다를 수 있습니다
Teradata의 DBC.COLUMNSV 테이블 구조 샘플 보기
Snowflake의 INFORMATION_SCHEMA.COLUMNS 테이블 샘플 뷰
Snowflake에는 _”ColumnFormat”_에 해당하는 열이 없다는 점에 유의하십시오. 또한 _”DATA_TYPE”_는 Teradata의 _”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
TABLE_NAME = 'TableN';
모범 사례¶
Teradata에서 사용되는 열과 Snowflake에서 사용 가능한 열을 비교하여 요구 사항을 충족하는지 확인합니다.
추가 지원이 필요하면 snowconvert-support@Snowflake.com으로 문의해 주십시오.
SSC-FDM-TD0011¶
설명¶
Snowflake는 Unicode 기본 다국어 평면(BMP) 문자를 지원하지 않습니다. 이 메시지는 SnowConvert 가 Unicode BMP 이스케이프 시퀀스를 포함하는 Teradata Unicode 구분 문자 리터럴 을 Snowflake 형식으로 변환할 때 표시됩니다.
코드 예시¶
입력 코드:¶
SELECT U&'hola #+005132 mundo' UESCAPE '#';
생성된 코드:¶
SELECT
--** SSC-FDM-TD0011 - UNICODE BMP IS NOT SUPPORTED IN SNOWFLAKE **
'hola \u+005132 mundo';
모범 사례¶
요구 사항과 일치하는 Unicode 문자가 있는지 확인합니다.
추가 지원이 필요하면 snowconvert-support@Snowflake.com으로 문의해 주십시오.
SSC-FDM-TD0012¶
참고
이 FDM 은 더 이상 사용되지 않습니다. 자세한 내용은 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-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¶
설명¶
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¶
설명¶
이 경고는 환경 파일(예: $(<$INPUT_SQL_FILE))에서 SQL 문을 실행하는 BTEQ 코드를 마이그레이션할 때 표시됩니다. 주목해야 할 중요한 동작 차이점이 있습니다. BTEQ 는 1개의 문이 실패하더라도 나머지 문을 계속 실행하는 반면, 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 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¶
참고
이 FDM 는 더 이상 지원되지 않습니다. 자세한 내용은 SSC-EWI-0009 섹션을 참조하십시오.
설명¶
Snowflake는 현재 POSIX 기본 정규식 구문만 지원합니다. 고급 정규식 기능은 사용할 수 없습니다.
이 경고는 REGEX_SUBSTR
, REGEX_REPLACE
또는 REGEX_INSTR
로의 함수 호출이 Snowflake로 변환될 때마다 표시됩니다. 사용자에게 일부 정규식 기능이 Snowflake에서 지원되지 않을 수 있음을 경고합니다. 지원되지 않는 주요 기능으로는 lookahead, lookbehind, non-capturing groups 등이 있습니다.
코드 예시¶
Teradata:¶
SELECT REGEXP_SUBSTR('qaqequ','q(?=u)', 1, 1);
Snowflake Scripting:¶
SELECT
--** SSC-FDM-TD0015 - REGEXP_SUBSTR FUNCTION ONLY SUPPORTS POSIX REGULAR EXPRESSIONS **
REGEXP_SUBSTR('qaqequ','q(?=u)', 1, 1);
모범 사례¶
각 정규식 패턴을 검토하여 수동 변경이 필요한지 여부를 결정하십시오. SnowFlake 의 정규식 기능 및 대체 옵션에 대한 자세한 내용은 [여기](https://community.Snowflake.com/s/question/ 0D50Z00007ENLKsSAP /expanded-support-for-regular-expressions-regex)를 참조하십시오.
추가 지원이 필요하면 snowconvert-support@Snowflake.com으로 문의해 주십시오.
SSC-FDM-TD0016¶
설명¶
Teradata에서 정규식 함수(REGEX_SUBSTR, REGEX_REPLACE 및 REGEX_INSTR)에는 _”match_arg”_라는 매개 변수가 포함되어 있습니다. 이 매개 변수는 특정 값을 허용하는 문자 인자입니다.
'i'
: 대/소문자(대문자 또는 소문자)에 관계없이 문자를 일치시킵니다.'c'
: 대/소문자를 고려하여 문자를 보이는 그대로 일치시킵니다.'n'
: 마침표(.)가 새라인 문자와 일치하도록 허용합니다.'m'
: 입력 문자열을 1개의 연속된 라인이 아닌 여러 개의 개별 라인으로 취급합니다.'l'
: 입력 문자열이 16 MB 보다 큰 경우 오류를 생성하는 대신 NULL 을 반환합니다 .'x'
: 패턴에서 공백과 공백 문자를 무시합니다.
이 함수는 여러 문자를 입력으로 허용합니다.
Snowflake에서 이러한 함수는 _ regexp_parameters
_ 를 해당 인자로 사용합니다. 이 인자는 정규식 패턴 매칭의 작동 방식을 정의하는 1개 이상의 문자가 포함된 문자열입니다. 지원되는 값은 다음과 같습니다.
c
: 패턴 매칭을 대/소문자를 구분합니다i
: 패턴 매칭을 대/소문자를 구분하지 않게 생성합니다m
: 여러 라인에 걸친 매칭을 가능하게 합니다.e
: 매치에서 하위 패턴을 추출할 수 있습니다s
: 점(.) 와일드카드가 개행 문자와 일치하도록 허용합니다
표시된 것처럼 데이터 타입 표시기 'i', 'c', 'm'
은 두 언어에서 동일합니다. Teradata 값 'n'
은 대상 시스템에서 's'
에 해당합니다. 그러나 Teradata 값 '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¶
참고
이 FDM 은 더 이상 사용되지 않습니다. 자세한 내용은 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
--** 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)에 저장된 데이터를 쿼리할 수 있습니다. 외부 테이블은 COPY INTO
Snowflake의 Iceberg 테이블 은 또 다른 솔루션을 제공합니다. 이 테이블은 개방형 형식을 사용하며 데이터를 자체 클라우드 저장소 내의 Parquet 파일에 저장합니다.
표준 Snowflake 테이블 도 Teradata 외부 테이블과 유사한 기능을 제공할 수 있습니다.
추가 지원이 필요하면 snowconvert-support@Snowflake.com으로 문의해 주십시오.
JSON 경로의 형식이 올바르고 잘못된 문자가 포함되어 있지 않은지 확인합니다.
추가 지원이 필요하면 snowconvert-support@Snowflake.com으로 문의해 주십시오.
세션 수준에서 쿼리 밴드를 구현하려면 코드를 업데이트하십시오.
추가 지원이 필요하면 snowconvert-support@Snowflake.com으로 문의해 주십시오.
JSON 이 필수인 Teradata 문법 형식을 따르는지 확인합니다.
추가 지원이 필요하면 snowconvert-support@Snowflake.com으로 문의해 주십시오.
추가 지원이 필요하면 snowconvert-support@Snowflake.com으로 문의해 주십시오.
셸 스크립트를 사용하여 변환된 코드를 실행해야 합니다.
추가 지원이 필요하면 snowconvert-support@Snowflake.com으로 문의해 주십시오.
SSC-FDM-TD0018¶
참고
이 FDM 는 더 이상 지원되지 않습니다. 자세한 내용은 SSC-EWI-TD0063 섹션을 참조하십시오.
설명¶
이 오류는 문자열 형식이 잘못되었거나 Snowflake에서 지원되지 않아 SnowConvert 가 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);
권장 사항¶
SSC-FDM-TD0019¶
설명¶
Teradata는 사용자가 트랜잭션, 세션, 프로필의 3가지 수준에서 쿼리 대역(메타데이터 태그)을 설정할 수 있도록 지원합니다. 사용자는 GetQueryBandValue 같은 함수를 사용하여 이러한 쿼리 대역 값을 검색할 수 있습니다.
Snowflake는 쿼리 밴드 대신 쿼리 태그 매개 변수를 사용합니다. 세션, 사용자 또는 계정 수준에서 쿼리 태그를 설정할 수 있습니다. Snowflake는 프로필을 지원하지 않습니다.
이 기능 마이그레이션 세부 정보(FMD)는 사용자에게 Snowflake가 트랜잭션 또는 프로필 수준 쿼리 태그를 지원하지 않음을 경고합니다. 대신 세션 수준 쿼리 태그가 대안으로 사용됩니다. 이 변경 사항은 특정 시나리오에서 기능에 영향을 줄 수 있습니다.
코드 예시¶
입력 코드:¶
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');
권장 사항¶
SSC-FDM-TD0020¶
참고
명확성을 위해 일부 섹션을 생략하여 코드를 간소화했습니다.
설명¶
이 오류는 SnowConvert 가 변환 중에 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;
권장 사항¶
SSC-FDM-TD0021¶
참고
이 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;
권장 사항¶
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 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()
권장 사항¶
SSC-FDM-TD0023¶
설명¶
이 함수 차이 메시지(FDM)는 SnowConvert 가 유사성 함수를 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¶
설명¶
이 경고는 SnowConvert 가 SET 옵션이 포함된 CREATE TABLE 문을 감지할 때 표시됩니다. Snowflake는 SET TABLE 을 지원하지 않기 때문에 SnowConvert 는 변환 중에 이 옵션을 제거합니다.
코드 예시¶
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¶
설명¶
임시 테이블 및 시간 기반 작업(DDL 및 DML)을 포함하는 Teradata 데이터베이스의 임시 기능은 Snowflake에서 직접 복제할 수 없습니다. Snowflake는 현재 Teradata와 같은 방식으로 임시 테이블이나 시간 인식 데이터 관리를 지원하지 않습니다. Teradata의 일시적 기능에 대한 자세한 내용은 Teradata 데이터베이스 일시적 지원 을 참조하십시오.
이러한 문은 구문 분석 중에 SnowConvert 가 인식하지만, 변환 과정에서 Snowflake의 실행 환경과의 호환성을 보장하기 위해 제거됩니다.
abort
문이 발생하면 Delete
명령으로 변환됩니다. 이렇게 하면 트랜잭션 작업을 롤백하고 데이터베이스를 원래 상태로 복원할 수 있어 동등한 기능을 유지할 수 있습니다.
코드 예시¶
다음 예제에서는 임시 형식 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 Policy_Type = '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¶
참고
명확성을 위해 일부 부분을 생략하여 코드를 간소화했습니다.
설명 ¶
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
--** 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¶
참고
이 FDM 는 더 이상 지원되지 않습니다. 자세한 내용은 SSC-EWI-TD0061 섹션을 참조하십시오.
설명¶
SnowConvert (SC)는 Teradata에서 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 호출과 동일한 파일에 테이블 사양을 포함합니다
SELECT * 또는 테이블 이름만 사용하는 대신 ON 식의 SELECT 쿼리에 특정 열을 나열합니다
입력 테이블에서 ALL 열의 피벗을 해제하는 경우 이 문제를 무시할 수 있습니다. 그러나 일부 열만 피벗을 해제하는 경우 데이터가 누락됩니다.
추가 지원이 필요하면 snowconvert-support@Snowflake.com으로 문의해 주십시오.
SSC-FDM-TD0028¶
참고
이 FDM 는 더 이상 지원되지 않습니다. 자세한 내용은 SSC-EWI-TD0060 섹션을 참조하십시오.
설명¶
SnowConvert 도구는 JSON_TABLE 함수를 변환할 수 있지만, 변환을 올바르게 수행하려면 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 에 코드를 제공할 때 테이블 정의를 포함해야 합니다. 이 기능이 없으면 코드를 다시 실행해야 합니다.
추가 지원이 필요하면 snowconvert-support@Snowflake.com으로 문의해 주십시오.
SSC-FDM-TD0029¶
세션 매개 변수에 종속되는 요소 형식 지정하기¶
다음 Teradata 형식 요소는 특정 세션 매개 변수 설정이 필요한 Snowflake 함수에 매핑됩니다. Teradata와 Snowflake 간에 일관된 결과를 보장하려면 이러한 세션 매개 변수를 Teradata 설정과 일치하도록 구성해야 합니다.
D:
DAYOFWEEK
함수에 매핑됩니다. 기본 설정이 다르기 때문에 Teradata와 Snowflake 간에 결과 세트가 다릅니다. Teradata는 일요일을 요일의 첫 번째 날로 사용하는 반면, Snowflake는 월요일을 사용합니다. 이는WEEK_START
세션 매개 변수에 의해 제어됩니다.WW:
WEEK
함수에 매핑됩니다. 동작은WEEK_OF_YEAR_POLICY
세션 매개 변수에 의해 제어됩니다. Snowflake의 기본 설정은 ISO 표준을 따릅니다(첫 주에는 1월 중 4일 이상이 포함되어야 함). Teradata는 1월 1일을 첫 주의 시작으로 간주합니다.
세션 매개 변수를 변경하려면 ALTER SESSION SET parameter_name = value
명령을 사용합니다. 사용 가능한 세션 매개 변수에 대한 자세한 내용은 이 페이지 를 참조하십시오.
TO_CHAR 의 단일 매개 변수 버전¶
단일 매개 변수가 있는 TO_CHAR(Datetime)
함수는 세션 매개 변수에 정의된 기본 날짜 및 시간 형식을 사용합니다. 이러한 매개 변수에는 다음이 포함됩니다.
TIMESTAMP_LTZ_OUTPUT_FORMAT
TIMESTAMP_NTZ_OUTPUT_FORMAT
TIMESTAMP_TZ_OUTPUT_FORMAT
TIME_OUTPUT_FORMAT
Teradata와 Snowflake 간의 일관된 동작을 보장하려면 이러한 매개 변수가 Teradata 설정과 일치하는지 확인하십시오.
TO_CHAR(Numeric)
을 사용하여 숫자 값을 문자열로 변환하는 경우 Snowflake는 자동으로 TM9
또는 TME
형식을 사용하여 간결한 문자열 표현을 생성합니다. Teradata는 기본적으로 간결한 숫자 표현도 생성하므로 추가 형식 지정이 필요하지 않습니다.
코드 예시¶
입력 코드:¶
select to_char(date '2008-09-13', 'DD/RM/YYYY');
select to_char(date '2010-10-20', 'DS');
select to_char(1255.495, 'SC9999.9999', 'nls_iso_currency = ''EUR''');
select to_char(45620);
출력 코드:¶
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¶
설명¶
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
-- 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¶
설명¶
Teradata 함수 ST_SPHERICALDISTANCE 는 구형 좌표를 사용하여 지구상의 두 지점 사이의 거리를 계산하기 위해 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;
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¶
참고
명확성을 위해 출력 코드의 일부 섹션을 간소화했습니다.
설명¶
이 오류는 LIKE
식에 [NOT] CASESPECIFIC
절이 포함된 경우에 발생합니다.
코드 예시¶
입력 코드:¶
SELECT * FROM MY_TABLE
WHERE Name Like 'Marco%' (NOT CASESPECIFIC);
출력 코드¶
SELECT
* FROM
MY_TABLE
WHERE Name LIKE 'Marco%' /*** SSC-FDM-TD0032 - NOT CASESPECIFIC CLAUSE WAS REMOVED ***/;
권장 사항¶
TERADATA 의 대/소문자 구분 동작은 TMODE 시스템 구성 설정에 따라 결정됩니다.
추가 지원이 필요하면 snowconvert-support@Snowflake.com으로 문의해 주십시오.
SSC-FDM-TD0033¶
설명¶
ACTIVITY_COUNT
상태 변수는 임베디드 SQL 또는 저장 프로시저에 사용되는 경우 DML 문(예: INSERT, UPDATE 또는 DELETE)에 의해 수정된 행 수를 표시합니다. 자세한 내용은 여기에서 확인할 수 있습니다.
ACTIVITY_COUNT
의 동작을 복제하려면 변환 사양에 설명된 해결 방법을 사용할 수 있습니다.
SELECT $1 FROM TABLE(RESULT_SCAN(LAST_QUERY_ID()));
그러나 고려해야 할 몇 가지 제한 사항이 있습니다.
제한 사항¶
첫 번째 경우¶
DML 문을 실행하기 전에 ACTIVITY_COUNT
를 여러 번 호출하면 잘못된 결과가 표시될 수 있습니다. 정확한 값을 얻으려면 각 ACTIVITY_COUNT
호출 사이에 DML 문을 실행해야 합니다.
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;
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;
$$;
Teradata에서 ACTIVITY_COUNT
를 사용하는 경우 DML 문 뒤에 여러 번 호출할 수 있으며(예: INSERT), 해당 문에서 영향을 받는 행의 수를 일관되게 반환합니다. 그러나 Snowflake에서는 변환된 코드가 LAST_QUERY_ID()
를 사용하여 다르게 동작합니다. LAST_QUERY_ID()
의 결과는 가장 최근에 실행된 쿼리에 따라 달라지므로 중간에 다른 쿼리가 실행되면 여러 번 호출해도 동일한 값이 반환되지 않을 수 있습니다.
저장 프로시저 InsertEmployeeSalaryAndLog_1()
은 수정할 필요 없이 작동합니다. 쿼리 기록을 아래에서 위로 시간순으로 검토하면 이를 확인할 수 있습니다.
InsertEmployeeSalaryAndLog_1()의 실행을 보여주는 쿼리 기록
INSERT
문이 먼저 실행되고LAST_QUERY_ID()
가 작업을 참조합니다.ACTIVITY_COUNT
가 포함된 첫 번째SELECT
문이 실행되어$1
을1
로 설정합니다.LAST_QUERY_ID()
는 이제 이SELECT
문으로 이동합니다.ACTIVITY_COUNT
로 두 번째SELECT
문이 실행됩니다. 이전 문이1
을 반환하므,$1
은 이SELECT
에 대해1
을 유지합니다.1
값은row_count1
에 저장된 다음activity_log
테이블에 삽입됩니다.
InsertEmployeeSalaryAndLog_2()
프로시저를 보면 수동 수정이 필요합니다. 가장 오래된 항목부터 시간순으로 쿼리 기록을 살펴 보겠습니다.
InsertEmployeeSalaryAndLog_2() 프로시저의 실행 결과를 보여주는 쿼리 기록
INSERT
문이 실행되면LAST_QUERY_ID()
이 특정 문을 참조합니다.ACTIVITY_COUNT
가 있는 첫 번째SELECT
중에,1
은1
과 같습니다. 그러나QUERY_TEXT
에는+ 10
이 포함되어 최종 결과가 수정됩니다. 이 시점에서LAST_QUERY_ID()
는 이SELECT
문을 가리킵니다.ACTIVITY_COUNT
가 포함된 두 번째SELECT
가 실행되면 이전 쿼리로 인해11
(1
이 아닌)을 반환합니다. 이 값은$1
에 저장됩니다.변수
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)
은 가장 최근 쿼리를 검색합니다LAST_QUERY_ID(-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 문이 아닌 문(예: SELECT)을 실행한 후 ACTIVITY_COUNT
를 사용하면 영향을 받는 행의 정확한 개수를 반환하지 않습니다.
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;
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에 대해 잘못된 값을 반환합니다. 쿼리 기록을 시간 역순으로 검토하면 이를 확인할 수 있습니다.
InsertEmployeeSalaryAndLog_3() 실행의 결과를 보여주는 쿼리 기록
먼저
INSERT
문이 실행됩니다.LAST_QUERY_ID()
함수는 이INSERT
작업을 참조합니다.다음으로
SELECT INTO
문이 실행되어 $1을 101로 설정합니다.LAST_QUERY_ID()
함수는 이제 이SELECT INTO
작업을 가리킵니다.그런 다음
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
문을 삽입한 직후SELECT
문을 사용하여ACTIVITY_COUNT
를 확인해 성공 여부를 확인할 수도 있습니다.
...
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으로 문의해 주십시오.