SnowConvert: Teradata 함수의 차이점

SSC-FDM-TD0001

설명

SnowConvert 가 BLOB 데이터 타입을 감지하면 이 메시지가 표시됩니다. Snowflake는 BLOB 을 지원하지 않으므로 자동으로 이진 데이터 타입으로 변환합니다.

코드 예제

입력 코드:
 CREATE TABLE TableExample
(
ColumnExample BLOB
)
Copy
생성된 코드:
 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"}}'
;
Copy

모범 사례

SSC-FDM-TD0002

설명

SnowConvert 가 CLOB 데이터 타입을 만나면 이 메시지가 표시됩니다. SnowConvert 는 CLOB 를 지원하지 않으므로 VARCHAR 로 자동 변환됩니다.

코드 예제

입력 코드:
 CREATE TABLE TableExample
(
ColumnExample CLOB
)
Copy
생성된 코드:
 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"}}'
;
Copy

모범 사례

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;
Copy
생성된 코드:
-- 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
$$
Copy

모범 사례

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)
);
Copy
생성된 코드:
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"}}'
;
Copy

모범 사례

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';
Copy
생성된 코드:
 -- 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';
Copy

모범 사례

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;
Copy
생성된 코드:
 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
                     ;
Copy

모범 사례

SSC-FDM-TD0007

설명

이 메시지는 SnowConvert 가 베리언트 데이터 타입으로 코드를 변환하는 동안 COLLATE 절을 만나면 표시됩니다. 베리언트 데이터 타입은 COLLATE 절을 지원하지 않으므로 SnowConvert 는 COLLATE 절을 제거하고 알림 메시지를 표시합니다.

코드 예시

입력 코드:
CREATE TABLE TableExample
(
ColumnExample JSON(2500) NOT CASESPECIFIC
)
Copy
생성된 코드:
 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"}}'
;
Copy

JSON 데이터 타입은 VARIANT 로 자동 변환됩니다. 모든 NOT CASESPECIFIC 사양은 해당 COLLATE 절로 변환됩니다.

모범 사례

SSC-FDM-TD0008

설명

Snowflake에서 공백이 포함된 리터럴이 아닌 구분 기호를 사용할 때는 백슬래시 문자를 이스케이프해야 올바르게 된 기능을 사용할 수 있습니다.

코드 예시

입력 코드
SELECT NVP('store = whole foods&&store: ?Bristol farms','store', '&&', valueDelimiter, 2);
Copy
출력 코드
 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 ***/;
Copy

모범 사례

SSC-FDM-TD0009

설명

SnowConvert 가 VARCHAR 이외의 데이터 타입을 가진 DEFAULT SESSION 을 감지하면 이 메시지가 표시됩니다. 이러한 경우 SnowConvert 는 데이터 타입을 VARCHAR 로 자동 변환하고 알림 메시지를 생성합니다.

코드 예제

입력 코드:
 CREATE TABLE TableExample
(
ColumnExample INTEGER DEFAULT SESSION,
ColumnExample2 VARCHAR DEFAULT SESSION
)
Copy
생성된 코드:
 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"}}'
;
Copy

이 예시를 살펴보겠습니다. “ColumnExample”라는 이름의 열은 INTEGER 데이터 타입으로 정의되어 있으며 DEFAULT SESSION 설정이 있습니다. 데이터 타입이 VARCHAR 이 아닌 INTEGER 이므로 시스템은 출력에서 VARCHAR 로 자동 변환합니다.

ColumnExample2 의 데이터 타입은 이미 VARCHAR 로 정의되어 있으므로 변경되지 않습니다.

모범 사례

SSC-FDM-TD0010

설명

Teradata 테이블 DBC.COLUMNSV 는 Snowflake의 INFORMATION_SCHEMA.COLUMNS 으로 매핑됩니다. 하지만 주의하십시오.

  1. 일부 Teradata 열에는 Snowflake에 해당 열이 없습니다

  2. 시스템 간에 열이 일치하는 경우 데이터 내용이 다를 수 있습니다

Teradata의 DBC.COLUMNSV 테이블 구조 샘플 보기

Snowflake의 INFORMATION_SCHEMA.COLUMNS 테이블 샘플 뷰

Snowflake에는 _”ColumnFormat”_에 해당하는 열이 없다는 점에 유의하십시오. 또한 _”DATA_TYPE”_는 Teradata의 _”ColumnType”_열과 일치하는 것처럼 보이지만, 그 내용은 상당히 다릅니다.

코드 예제

입력 코드:
 SELECT columnname FROM dbc.columnsV WHERE tablename = 'TableN';
Copy
생성된 코드:
 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';
Copy

모범 사례

  • Teradata에서 사용되는 열과 Snowflake에서 사용 가능한 열을 비교하여 요구 사항을 충족하는지 확인합니다.

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

SSC-FDM-TD0011

설명

Snowflake는 Unicode 기본 다국어 평면(BMP) 문자를 지원하지 않습니다. 이 메시지는 SnowConvert 가 Unicode BMP 이스케이프 시퀀스를 포함하는 Teradata Unicode 구분 문자 리터럴 을 Snowflake 형식으로 변환할 때 표시됩니다.

코드 예시

입력 코드:
 SELECT U&'hola #+005132 mundo' UESCAPE '#';
Copy
생성된 코드:
 SELECT
--** SSC-FDM-TD0011 - UNICODE BMP IS NOT SUPPORTED IN SNOWFLAKE **
'hola \u+005132 mundo';
Copy

모범 사례

  • 요구 사항과 일치하는 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
);
Copy
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"}}'
;
Copy

모범 사례

SSC-FDM-TD0013

설명

BTEQ ERRORCODE 기본 제공 변수에 저장된 오류 코드를 Snowflake Scripting의 해당 코드에 직접 매핑할 수 없기 때문에 이 메시지가 표시됩니다.

코드 예시

입력 코드:
SELECT * FROM table1;
 
.IF ERRORCODE<>0 THEN .EXIT 1

.QUIT 0
Copy
출력 코드:
 -- 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
$$
Copy

모범 사례

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
Copy
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()
Copy

모범 사례

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);
Copy
Snowflake Scripting:
 SELECT
--** SSC-FDM-TD0015 - REGEXP_SUBSTR FUNCTION ONLY SUPPORTS POSIX REGULAR EXPRESSIONS **
REGEXP_SUBSTR('qaqequ','q(?=u)', 1, 1);
Copy

모범 사례

  • 각 정규식 패턴을 검토하여 수동 변경이 필요한지 여부를 결정하십시오. 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_REPLACEREGEX_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');
Copy
생성된 코드:
 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);
Copy

모범 사례

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;
Copy
출력 코드:
 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;
Copy

권장 사항

  • Teradata 외부 테이블을 교체하려면 Snowflake 외부 테이블 을 사용하면 됩니다. 이러한 테이블을 사용하면 데이터베이스에 있는 것처럼 클라우드 저장소 플랫폼(Amazon S3, Google Cloud Storage 또는 Microsoft Azure)에 저장된 데이터를 쿼리할 수 있습니다. 외부 테이블은 COPY INTO

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

  • 표준 Snowflake 테이블 도 Teradata 외부 테이블과 유사한 기능을 제공할 수 있습니다.

  • 추가 지원이 필요하면 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);
    
    Copy
    생성된 코드:
     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);
    
    Copy

    권장 사항

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

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

    SSC-FDM-TD0019

    설명

    Teradata는 사용자가 트랜잭션, 세션, 프로필의 3가지 수준에서 쿼리 대역(메타데이터 태그)을 설정할 수 있도록 지원합니다. 사용자는 GetQueryBandValue 같은 함수를 사용하여 이러한 쿼리 대역 값을 검색할 수 있습니다.

    Snowflake는 쿼리 밴드 대신 쿼리 태그 매개 변수를 사용합니다. 세션, 사용자 또는 계정 수준에서 쿼리 태그를 설정할 수 있습니다. Snowflake는 프로필을 지원하지 않습니다.

    이 기능 마이그레이션 세부 정보(FMD)는 사용자에게 Snowflake가 트랜잭션 또는 프로필 수준 쿼리 태그를 지원하지 않음을 경고합니다. 대신 세션 수준 쿼리 태그가 대안으로 사용됩니다. 이 변경 사항은 특정 시나리오에서 기능에 영향을 줄 수 있습니다.

    코드 예시

    입력 코드:
     SELECT GETQUERYBANDVALUE(3, 'account');
    
    Copy
    생성된 코드
     SELECT
    --** SSC-FDM-TD0019 - TRANSACTION AND PROFILE LEVEL QUERY TAGS NOT SUPPORTED IN SNOWFLAKE, REFERENCING SESSION QUERY TAG INSTEAD **
    GETQUERYBANDVALUE_UDF('account');
    
    Copy

    권장 사항

    • 세션 수준에서 쿼리 밴드를 구현하려면 코드를 업데이트하십시오.

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

    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);
    
    Copy
    생성된 코드:
     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;
    
    Copy

    권장 사항

    • JSON 이 필수인 Teradata 문법 형식을 따르는지 확인합니다.

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

    SSC-FDM-TD0021

    참고

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

    설명

    이 오류는 DBC.DATABASES 테이블을 참조하는 쿼리를 실행하고 Snowflake에 일치하는 항목이 없는 열을 선택하려고 할 때 발생합니다.

    코드 예시

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

    권장 사항

    SSC-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
    
    
    Copy

    셸 변수는 문자열 보간과 비슷한 용도로 사용됩니다. 스크립트가 Python으로 변환되면 셸 변수는 셸 스크립트(.sh 파일) 내에서 변환된 코드를 실행하여 기능을 유지합니다. 이 기능을 유지하려면 변환된 코드의 셸 변수가 원래 입력 코드의 형식과 일치해야 합니다.

    코드 예시

    입력 코드:

     SELECT $column FROM ${tablename}
    
    Copy
    생성된 코드
     #*** Generated code is based on the SnowConvert Python Helpers version 2.0.6 ***
     
    import os
    import sys
    import snowconvert.helpers
    from snowconvert.helpers import Export
    from snowconvert.helpers import exec
    from snowconvert.helpers import BeginLoading
    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()
    
    Copy

    권장 사항

    • 셸 스크립트를 사용하여 변환된 코드를 실행해야 합니다.

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

    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;
    
    Copy
    Idsim_fn
    10
    20.565079365
    31
    40.959047619
    50
    60.611111111
    70.7777777777777777
    80
    90
    생성된 코드
     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;
    
    Copy

    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

권장 사항

SSC-FDM-TD0024

설명

이 경고는 SnowConvert 가 SET 옵션이 포함된 CREATE TABLE 문을 감지할 때 표시됩니다. Snowflake는 SET TABLE 을 지원하지 않기 때문에 SnowConvert 는 변환 중에 이 옵션을 제거합니다.

코드 예시

Teradata:
 CREATE SET TABLE TableExample
(
ColumnExample Number
)
Copy
 CREATE SET VOLATILE TABLE SOMETABLE, LOG AS 
(SELECT ColumnExample FROM TableExample);
Copy
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"}}'
;
Copy
 --** 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
);
Copy

권장 사항

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';
Copy
출력 코드:
 ----** SSC-FDM-TD0025 - TEMPORAL FORMS ARE NOT SUPPORTED IN SNOWFLAKE **
--SEQUENCED VALIDTIME
SELECT
   Policy_ID,
   Customer_ID
   FROM
   Policy
      WHERE Policy_Type = 'AU';
Copy

트랜잭션을 롤백해야 하는 경우 Abort 명령을 사용하여 해당 트랜잭션 중에 변경된 모든 내용을 취소합니다.

입력 코드:
 CREATE OR REPLACE PROCEDURE TEST.ABORT_STATS()
BEGIN
    CURRENT VALIDTIME AND NONSEQUENCED TRANSACTIONTIME ABORT 
     FROM table_1 
     WHERE table_1.x1 = 1;
END;
Copy
출력 코드:
 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;
$$;
Copy

권장 사항

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;
Copy

생성된 코드

 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
$$
Copy
권장 사항

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;
Copy
출력 코드:
 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;
Copy

권장 사항

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

    • 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;
Copy
출력 코드:
 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;
Copy

권장 사항

  • 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);
Copy
출력 코드:
 SELECT
TO_CHAR(date '2008-09-13', 'DD/') || PUBLIC.ROMAN_NUMERALS_MONTH_UDF(date '2008-09-13') || TO_CHAR(date '2008-09-13', '/YYYY') /*** 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 ***/;
Copy

모범 사례

  • 형식 함수(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';
Copy
출력 코드
 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
$$
Copy

권장 사항

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;
Copy
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;
Copy
Snowflake 결과

LOCATION1

LOCATION2

DISTANCE_IN_KM

{ “coordinates”: [ -73.989308, 40.741895 ], “type”: “Point” }

{ “coordinates”: [ 40.741895, 34.053691 ], “type”: “Point” }

9351154.65572674

권장 사항

SSC-FDM-TD0032

참고

명확성을 위해 출력 코드의 일부 섹션을 간소화했습니다.

설명

이 오류는 LIKE 식에 [NOT] CASESPECIFIC 절이 포함된 경우에 발생합니다.

코드 예시

입력 코드:
 SELECT * FROM MY_TABLE
WHERE Name Like 'Marco%' (NOT CASESPECIFIC);
Copy
출력 코드
 SELECT
* FROM
MY_TABLE
WHERE Name LIKE 'Marco%' /*** SSC-FDM-TD0032 - NOT CASESPECIFIC CLAUSE WAS REMOVED ***/;
Copy

권장 사항

  • 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()));
Copy

그러나 고려해야 할 몇 가지 제한 사항이 있습니다.

제한 사항

첫 번째 경우

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;
Copy
 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;
$$;
Copy

Teradata에서 ACTIVITY_COUNT 를 사용하는 경우 DML 문 뒤에 여러 번 호출할 수 있으며(예: INSERT), 해당 문에서 영향을 받는 행의 수를 일관되게 반환합니다. 그러나 Snowflake에서는 변환된 코드가 LAST_QUERY_ID() 를 사용하여 다르게 동작합니다. LAST_QUERY_ID() 의 결과는 가장 최근에 실행된 쿼리에 따라 달라지므로 중간에 다른 쿼리가 실행되면 여러 번 호출해도 동일한 값이 반환되지 않을 수 있습니다.

저장 프로시저 InsertEmployeeSalaryAndLog_1() 은 수정할 필요 없이 작동합니다. 쿼리 기록을 아래에서 위로 시간순으로 검토하면 이를 확인할 수 있습니다.

InsertEmployeeSalaryAndLog_1()의 실행을 보여주는 쿼리 기록

  1. INSERT 문이 먼저 실행되고 LAST_QUERY_ID() 가 작업을 참조합니다.

  2. ACTIVITY_COUNT 가 포함된 첫 번째 SELECT 문이 실행되어 $11 로 설정합니다. LAST_QUERY_ID() 는 이제 이 SELECT 문으로 이동합니다.

  3. ACTIVITY_COUNT 로 두 번째 SELECT 문이 실행됩니다. 이전 문이 1 을 반환하므, $1 은 이 SELECT 에 대해 1 을 유지합니다.

  4. 1 값은 row_count1 에 저장된 다음 activity_log 테이블에 삽입됩니다.

InsertEmployeeSalaryAndLog_2() 프로시저를 보면 수동 수정이 필요합니다. 가장 오래된 항목부터 시간순으로 쿼리 기록을 살펴 보겠습니다.

InsertEmployeeSalaryAndLog_2() 프로시저의 실행 결과를 보여주는 쿼리 기록

  1. INSERT 문이 실행되면 LAST_QUERY_ID() 이 특정 문을 참조합니다.

  2. ACTIVITY_COUNT 가 있는 첫 번째 SELECT 중에, 11 과 같습니다. 그러나 QUERY_TEXT 에는 + 10 이 포함되어 최종 결과가 수정됩니다. 이 시점에서 LAST_QUERY_ID() 는 이 SELECT 문을 가리킵니다.

  3. ACTIVITY_COUNT 가 포함된 두 번째 SELECT 가 실행되면 이전 쿼리로 인해 11 (1 이 아닌)을 반환합니다. 이 값은 $1 에 저장됩니다.

  4. 변수 row_count111 값을 수신한 다음 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 ***/;
...
Copy

두 번째 경우

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;
Copy
 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;
$$;
Copy

LAST_QUERY_ID 함수는 잘못된 쿼리를 참조하기 때문에 row_count1에 대해 잘못된 값을 반환합니다. 쿼리 기록을 시간 역순으로 검토하면 이를 확인할 수 있습니다.

InsertEmployeeSalaryAndLog_3() 실행의 결과를 보여주는 쿼리 기록

  1. 먼저 INSERT 문이 실행됩니다. LAST_QUERY_ID() 함수는 이 INSERT 작업을 참조합니다.

  2. 다음으로 SELECT INTO 문이 실행되어 $1을 101로 설정합니다. LAST_QUERY_ID() 함수는 이제 이 SELECT INTO 작업을 가리킵니다.

  3. 그런 다음 SELECT 문을 실행하여 ACTIVITY_COUNT 를 가져옵니다. 마지막 쿼리에서 101이 반환되었으므로 $1에는 예상 값인 1 대신 101이 포함됩니다.

  4. 결과적으로 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

두 번째 경우에 대한 조정

  1. 이 문제를 해결하려면 올바른 쿼리 참조 번호와 함께 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 ***/;
               ...
Copy
  1. 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;
...
Copy

권장 사항

  • LAST_QUERY_ID 를 사용할 때 의도한 쿼리를 참조하고 있는지 확인합니다.

  • 정확한 평가를 위해 DML 문 뒤에 ACTIVITY_COUNT 를 즉시 실행하십시오.

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