SnowConvert AI - Teradata 문제

SSC-EWI-TD0001

재귀 순방향 별칭 오류입니다.

참고

출력 코드의 일부 부분은 명확성을 위해 생략되었습니다.

심각도

낮음

설명

이 EWI는 SnowConvert AI가 별칭이 지정된 식 내에서 재귀를 감지할 때마다 표시되므로, Snowflake 환경 내에서 별칭의 올바른 기능에 필요한 순방향 별칭 변환을 실행할 수 없습니다.

재귀 별칭은 별칭이 지정된 식에 다른 별칭이 포함되어 있고 별칭이 지정된 두 번째 식에 첫 번째 별칭이 포함되어 있는 경우에 발생합니다. 재귀는 전이적인 방식으로 더 아래 단계에서 발생할 수 있으므로, 이는 예에서 볼 수 있듯이 사소하지 않을 수 있습니다.

코드 예시

참고: Snowflake에서는 재귀 별칭이 지원되지 않지만, 일부 간단한 인스턴스는 지원됩니다.

참고

Snowflake에서는 재귀 별칭이 지원되지 않지만, 일부 간단한 인스턴스는 지원됩니다. 아래의 예를 확인하세요.

다음 예제 코드는 마이그레이션 후 Snowflake에서 작동합니다.

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

그러나 다음 예제 코드는 작동하지 않습니다.

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

모범 사례

  • 코드를 검토하고 재귀 순방향 별칭이 없는지 확인합니다. 이 EWI는 재귀 참조가 있는 별칭의 첫 번째 인스턴스 이름을 보여주지만, 이것이 코드에 재귀 참조가 있는 유일한 별칭이라는 의미는 아닙니다.

  • 추가 지원이 필요한 경우 snowconvert-support@snowflake.com으로 이메일을 보내주세요.

SSC-EWI-TD0002

Interval 유형은 지원되지 않습니다.

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

Severity

높음

Description

SQL 문에서 열의 선택기가 INTERVAL 유형인 경우 이 EWI가 추가되고 Stub 함수도 생성됩니다. 이는 SnowFlake에서 지원되지 않는 유형이므로 SnowConvert AI가 완료된 이후에 보류 중인 작업을 의미합니다.

Example Code

Teradata:
 SELECT
     CAST('07:00' AS INTERVAL HOUR(2) TO MINUTE),
     CAST('08:00' AS INTERVAL HOUR(2) TO MINUTE) As Test_Interval;
Copy
Snowflake Scripting:
 SELECT
     !!!RESOLVE EWI!!! /*** SSC-EWI-TD0002 - INTERVAL TYPE NOT SUPPORTED IN SNOWFLAKE ***/!!!
     INTERVAL '07 hour, 00 min',
     !!!RESOLVE EWI!!! /*** SSC-EWI-TD0002 - INTERVAL TYPE NOT SUPPORTED IN SNOWFLAKE ***/!!!
     INTERVAL '08 hour, 00 min' As Test_Interval;
Copy

Best Practices

SSC-EWI-TD0003

trim 함수에서는 데이터 정렬이 지원되지 않습니다. 원본 데이터 정렬을 함수 결과에 추가하여 보존합니다.

Severity

낮음

Description

Snowflake에서 trim 함수(LTRIM, RTRIM, 또는 TRIM)는 자를 문자가 빈 문자 또는 공백 문자가 아닌 한 데이터 정렬을 지원하지 않습니다.

위에서 언급한 시나리오에서 SnowConvert AI가 LTRIM, RTRIM이나 TRIM LEADING, TRAILING 또는 두 가지 모두를 감지하는 경우, 입력 열의 데이터 정렬 없이 복사본을 생성하기 위해 COLLATE 함수가 자동으로 생성됩니다. 이 EWI는 열 데이터 정렬이 trim 함수 전에 제거되었음을 나타내기 위해 생성됩니다. 즉, 함수의 결과에 데이터 정렬이 없으며, 이로 인해 결과를 사용한 추가 비교 결과가 변경될 수 있음을 의미합니다.

Example Code

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

SELECT
    TRIM(BOTH '0' FROM col1),
    TRIM(LEADING '  ' FROM col1),
    TRIM(TRAILING '0' FROM col1),
    LTRIM(col1, '0'),
    RTRIM(col1)
FROM
    collateTable;
Copy
Snowflake Scripting:
 CREATE OR REPLACE TABLE collateTable (
	col1 VARCHAR(50)
)
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "teradata",  "convertedOn": "07/14/2025",  "domain": "no-domain-provided" }}'
;

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

Best Practices

  • 비교 중에 기능적 차이를 방지하려면 열의 원본 데이터 정렬을 TRIM 함수 결과 문자열에 추가합니다. 이는 COLLATE 함수를 사용하고 원본 열 데이터 정렬을 두 번째 인자로 지정하여 달성할 수 있습니다. 이 인자는 데이터 정렬 값이 있는 리터럴 문자열이어야 합니다.

  • 추가 지원이 필요한 경우 snowconvert-support@snowflake.com으로 이메일을 보내주세요.

SSC-EWI-TD0004

CONTINUE HANDLER에서 지원되지 않는 SQL 예외가 발생했습니다.

Severity

낮음

Description

Snowflake 프로시저에는 Teradata CONTINUE HANDLER에 해당하는 변환이 없습니다. 지원되는 일부 예외 코드의 경우, SnowConvert AI는 이 동작을 에뮬레이트하기 위해 일부 처리를 수행합니다. 이 EWI는 지원되지 않는 예외 코드가 있는 CONTINUE HANDLER 문에 추가됩니다.

Example Code

Teradata:
 REPLACE PROCEDURE PURGING_ADD_TABLE
( 
 IN inDatabaseName     	VARCHAR(30), 
 IN inTableName    		VARCHAR(30)
)
BEGIN
 DECLARE vCHAR_SQLSTATE CHAR(5);
 DECLARE vSUCCESS       CHAR(5);

  DECLARE CONTINUE HANDLER FOR SQLSTATE 'UNSUPPORTED'
  BEGIN
     SET vCHAR_SQLSTATE = SQLCODE;
     SET vSUCCESS    = SQLCODE;
  END;

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

  DECLARE CONTINUE HANDLER FOR SQLSTATE 'UNSUPPORTED'
  BEGIN
   vCHAR_SQLSTATE := SQLCODE;
   vSUCCESS := SQLCODE;
  END;
  SELECT
   1;
 END;
$$;
Copy

Best Practices

SSC-EWI-TD0005

문이 변환되었지만 해당 기능이 아직 구현되지 않았습니다.

Severity

중요

Description

문이 인식되어 변환되었지만, 구현이 아직 완료되지 않았기 때문에 변환된 코드에 예상되는 기능이 없습니다.

이 경고는 해당 스크립트가 이 문을 사용할 때 스크립트에 동등한 기능이 예상되지 않는다는 점을 알리기 위해 추가됩니다.

예제 소스

BTEQ 입력 코드:
 .SET SIDETITLES ON
Copy
Python 출력 코드:
 #*** Generated code is based on the SnowConvert AI Python Helpers version 2.0.6 ***
 
import os
import sys
import snowconvert.helpers
from snowconvert.helpers import Export
from snowconvert.helpers import exec
from snowconvert.helpers import BeginLoading
con = None
def main():
  snowconvert.helpers.configure_log()
  con = snowconvert.helpers.log_on()
  #** SSC-EWI-TD0005 - THE STATEMENT WAS CONVERTED BUT ITS FUNCTIONALITY IS NOT IMPLEMENTED YET **
  Export.side_titles(True)
  snowconvert.helpers.quit_application()

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

Best Practices

SSC-EWI-TD0006

잘못된 기본값입니다.

Severity

낮음

Description

DEFAULT TIME / DEFAULT DATE / DEFAULT CURREN_DATE / DEFAULT DEFAULT CURRENT_TIME / DEFAULT CURRENT_TIMESTAMP 열 사양은 FLOAT 데이터 타입에 지원되지 않습니다.

Example Code

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

Best Practices

SSC-EWI-TD0007

Teradata 모드에서는 문자열 비교를 위한 GROUP BY 절이 지원되지 않습니다

Severity

낮음

Description

이 오류 메시지는 Teradata SQL 쿼리를 Snowflake에 마이그레이션하는 경우에 발생할 수 있는 문제를 나타내며, 특히 Teradata 모드에서 GROUP BY 절이 문자열 비교 민감도를 처리하는 방법의 차이와 관련이 있습니다.

Teradata 모드에서 GROUP BY 절의 문자열 비교는 기본적으로 대소문자를 구분하지 않습니다(NOT CASESPECIFIC), 반면, 열이 대소문자를 구분하지 않는 COLLATE 절로 명시적으로 정의되지 않는 한 Snowflake는 대소문자를 구분합니다. 이러한 차이로 인해 Teradata에서 대소문자를 구분하지 않는 그룹화를 사용하는 쿼리가 Snowflake에서 다른 결과를 생성할 수 있습니다.

Example Code

Teradata:
CREATE TABLE employees (
    employee_id INTEGER,
    first_name VARCHAR(50) NOT CASESPECIFIC,
    department VARCHAR(50)
);

INSERT INTO employees VALUES (1, 'John', 'Sales');
INSERT INTO employees VALUES (2, 'JOHN', 'sales'); 
INSERT INTO employees VALUES (3, 'john', 'SALES');

SELECT first_name, COUNT(*) 
FROM employees 
GROUP BY first_name;
Copy
Snowflake Scripting:
CREATE OR REPLACE TABLE employees (
    employee_id INTEGER,
    first_name VARCHAR(50),
    department VARCHAR(50)
)
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "teradata",  "convertedOn": "10/20/2025",  "domain": "no-domain-provided",  "migrationid": "kwOaAavBVnCx8OhdxEITfg==" }}'
;

INSERT INTO employees
VALUES (1, 'John', 'Sales');

INSERT INTO employees
VALUES (2, 'JOHN', 'sales');

INSERT INTO employees
VALUES (3, 'john', 'SALES');

SELECT
    first_name,
    COUNT(*)
FROM
    employees
!!!RESOLVE EWI!!! /*** SSC-EWI-TD0007 - GROUP BY IS NOT EQUIVALENT IN TERADATA MODE ***/!!!
GROUP BY first_name;
Copy

예상되는 동작 차이

플랫폼

그룹화 동작

예제 결과 행

Teradata 모드

‘John’, ‘JOHN’, ‘john’을 함께 그룹화

John(또는 JOHN/john), 3

Snowflake

‘John’, ‘JOHN’, ‘john’을 별개로 처리

John, 1
JOHN, 1
john, 1

Best Practices

  • 예상되는 그룹화 동작을 보장하기 위해 Teradata 모드에서 마이그레이션할 때 문자열 열이 GROUP BY 절을 검토합니다.

참고: GROUP BY 절에서 RTRIM(UPPER(first_name)) 또는 RTRIM(first_name)과 같은 식을 사용하여 대소문자를 구분하지 않거나 잘린 그룹화를 수행하려면 열이 참조되는 쿼리의 모든 부분에 동일한 식을 일관되게 적용해야 합니다. 예:

SELECT RTRIM(UPPER(first_name))
FROM employees
WHERE RTRIM(UPPER(first_name)) = 'JOHN'
GROUP BY RTRIM(UPPER(first_name));
Copy

이를 통해 필터링, 선택 및 그룹화에서 모두 동일한 논리를 사용하여 불일치 또는 예기치 않은 결과를 방지할 수 있습니다.

  • 일관되게 대소문자를 구분하지 않는 동작이 필요한 경우 테이블 생성 중에 COLLATE로 열을 정의합니다.

    CREATE TABLE employees (
        first_name VARCHAR(50) COLLATE 'en-cs'
    );
    
    Copy
  • 변환 중에 UseCollateForCaseSpecification CLI 플래그 또는 변환 설정을 활성화하여 대소문자 지정에 COLLATE를 사용합니다. 이 옵션을 사용하면 대소문자 지정(예: CASESPECIFIC 또는 NOT UPPER)이 COLLATE 함수 대신 CASESPECIFIC 함수를 사용하여 처리됩니다. 자세한 내용은 CLI설명서 또는 [변환 설정](../../../getting-started/running-snowconvert /conversion/teradata-conversion-settings.md)을 참조하세요.

  • 추가 지원이 필요한 경우 snowconvert-support@snowflake.com으로 이메일을 보내주세요.

SSC-EWI-TD0008

문자열 비교를 위한 함수는 지원되지 않습니다

Severity

낮음

Description

현재, Snowflake에는 일부 문자열 비교 함수와 동등한 함수가 없습니다.

이 EWI는 비교 유형이 jaro, n_gram, LD, LDWS, OSA, DL, hamming, LCS, jaccard, cosine, _soundexcode_일 때마다 추가됩니다.

Example Code

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

Best Practices

SSC-EWI-TD0009

TEMPORAL 열은 지원되지 않습니다.

Severity

낮음

Description

Teradata는 파생 PERIOD 열을 사용하여 열 수준에서 Temporal 테이블을 지원합니다. 이러한 열은 Snowflake에서 지원되지 않습니다.

Example Code

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

Best Practices

SSC-EWI-TD0010

UPPERCASE는 Snowflake에서 지원되지 않습니다.

Severity

낮음

Description

UPPERCASE 열 특성은 Snowflake에서 지원되지 않습니다.

Example Code

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

Best Practices

  • UPPERCASE 절은 ‘aaa’로 입력된 문자가 ‘AAA’로 저장됨을 나타냅니다. 가능한 해결 방법은 모든 삽입 참조에 UPPER 함수를 추가하는 것입니다. 그러나 ETL에 의한 외부 데이터 로딩 프로세스도 수정해야 합니다.

  • 추가 지원이 필요한 경우 snowconvert-support@snowflake.com으로 이메일을 보내주세요.

SSC-EWI-TD0012

바이너리는 기본값을 지원하지 않습니다.

Severity

낮음

Description

이 EWI는 SnowConvert AI가 DEFAULT 값 사양과 함께 BINARY 데이터 타입을 발견한 경우에 표시됩니다. BINARY 열에서는 기본값이 허용되지 않으므로 제거됩니다.

Example Code

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

Best Practices

SSC-EWI-TD0017

GLOBAL TEMPORARY TRACE 기능은 지원되지 않습니다.

Severity

낮음

Description

이 EWI는 SnowConvert AI가 GLOBAL TEMPORARY TRACE 옵션이 있는 Create Table을 발견하는 경우에 표시됩니다. TRACE 기능에 대해서는 다음의 Teradata 설명서를 검토하세요. 이 기능은 Snowflake에서 지원되지 않으므로 제거됩니다.

Example Code

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

Best Practices

  • 참고: EVENT TABLE을 사용하여 Snowflake의 일부 추적 기능을 복제할 수 있습니다. 로깅 및 추적에 대해서는 다음의 Snowflake 설명서를 검토하세요.

  • 추가 지원이 필요한 경우 snowconvert-support@snowflake.com으로 이메일을 보내주세요.

SSC-EWI-TD0020

Regexp_Substr 함수는 POSIX 정규식만 지원합니다.

참고

이 EWI는 더 이상 사용되지 않습니다. SSC-EWI-0009 설명서를 참조하세요.

심각도

낮음

설명

현재, Snowflake에서는 POSIX 기본 정규식 구문을 넘어서는 확장된 정규식을 지원하지 않습니다.

이 EWI는 지원되지 않는 정규식이 있을 수 있음을 경고하기 위해 REGEX_SUBSTR, REGEX_REPLACE,_ 또는 _REGEX_INSTR_에 대한 함수 호출이 SnowFlake로 변환될 때마다 추가됩니다. 지원되지 않는 기능에는 lookahead, lookbehind, non-capturing groups 등이 있습니다.

코드 예시

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

모범 사례

  • 각 경우에 사용된 정규식을 확인하여 수동 개입이 필요한지 여부를 확인합니다. SnowFlake의 확장된 정규식 지원 및 대안에 대한 자세한 정보는 여기에서 확인할 수 있습니다.

  • 추가 지원이 필요한 경우 snowconvert-support@snowflake.com으로 이메일을 보내주세요.

SSC-EWI-TD0023

SELECT 및 SET INTO VARIABLE 내부의 ACTIVITY_COUNT에는 수동 수정이 필요합니다

심각도

낮음

설명

ACTIVITY_COUNT 상태 변수는 임베드된 SQL 또는 저장 프로시저 애플리케이션에서 SQL DML 문의 영향을 받는 행 수를 반환합니다. 자세한 내용은 여기에서 확인하세요.

변환 사양에 설명된 대로, ACTIVITY_COUNT의 동작을 에뮬레이트하는 해결 방법은 다음과 같습니다.

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

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

코드 예시

Teradata

REPLACE PROCEDURE InsertEmployeeSalaryAndLog_4 ()
BEGIN
    DECLARE rowCount INT;
    DECLARE message VARCHAR(100);

    INSERT INTO employees (employee_id, first_name, last_name, department_id, salary)
    VALUES (101, 'Alice', 'Smith', 10, 70000.00);

    SELECT ACTIVITY_COUNT INTO rowCount;
    SET message = 'ROWS INSERTED: ' || rowCount;

    -- Insert the ACTIVITY_COUNT into the activity_log table
    INSERT INTO activity_log (operation, row_count)
    VALUES (message, rowCount);
END;

Snowflake

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

            -- Insert the ACTIVITY_COUNT into the activity_log table
            INSERT INTO activity_log (operation, row_count)
            VALUES (:message, :rowCount);
    END;
$$;
Copy

수동 수정

위에 제시된 해결 방법 중 일부를 사용하여 다음과 같이 삽입, 업데이트, 삭제된 행 수를 계속 얻을 수 있습니다.

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

            -- Insert the ACTIVITY_COUNT into the activity_log table
            INSERT INTO activity_log (operation, row_count)
            VALUES (:message, :rowCount);
    END;
$$;
Copy

전체 쿼리를 사용하는 대신 Snowflake의 SELECT INTO VARIABLE 구문에 맞게 수동으로 채택해야 합니다.

또한, RESULT_SCAN(LAST_QUERY_ID())가 잘못된 결과를 제공하는 경우 SSC-FDM-TD0033(../functional-difference/teradataFDM.md#ssc-fdm-td0033)을 확인하여 LAST_QUERY_ID 사용 시 가능한 제한 사항을 처리하는 방법을 확인합니다.

모범 사례

  • 제안된 해결 방법을 수동으로 조정합니다.

  • SSC-FDM-TD0033(../functional-difference/teradataFDM.md#ssc-fdm-td0033)을 확인하여 LAST_QUERY_ID 사용 시 가능한 제한 사항을 처리하는 방법을 확인합니다.

  • 추가 지원이 필요한 경우 snowconvert-support@snowflake.com으로 이메일을 보내주세요.

SSC-EWI-TD0024

집계 함수로 인해 ABORT 문이 지원되지 않습니다.

심각도

낮음

설명

이 EWI는 AGGREGATE 함수가 저장 프로시저 내 ABORT 문의 일부인 경우 표시됩니다. 해당 문은 주석 처리됩니다.

코드 예시

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

모범 사례

SSC-EWI-TD0025

출력 형식이 지원되지 않습니다.

심각도

낮음

설명

이 EWI는 CAST 함수가 Snowflake Scripting에서 지원하지 않는 출력 형식을 지정하는 경우에 표시됩니다.

코드 예제

Teradata:
 CREATE TABLE SAMPLE_TABLE
(
    VARCHAR_TYPE VARCHAR
);

REPLACE VIEW SAMPLE_VIEW 
AS
SELECT
CAST(VARCHAR_TYPE AS FLOAT FORMAT 'ZZZ.ZZZZZ'),
CAST('01:02.030405' AS TIME(1) WITH TIME ZONE FORMAT 'MI:SS.S(6)')
FROM SAMPLE_TABLE;
Copy
Snowflake Scripting:
 CREATE OR REPLACE TABLE SAMPLE_TABLE
(
    VARCHAR_TYPE VARCHAR
)
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "teradata",  "convertedOn": "03/03/2025",  "domain": "test" }}'
;

CREATE OR REPLACE VIEW SAMPLE_VIEW
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "teradata",  "convertedOn": "03/03/2025",  "domain": "test" }}'
AS
SELECT
    TO_NUMBER(VARCHAR_TYPE, '999.00000', 38, 10) !!!RESOLVE EWI!!! /*** SSC-EWI-TD0025 - OUTPUT FORMAT 'ZZZ.ZZZZZ' NOT SUPPORTED. ***/!!!,
    TO_TIME('01:02.030405', 'MI:SS.FF6') !!!RESOLVE EWI!!! /*** SSC-EWI-TD0025 - OUTPUT FORMAT 'MI:SS.S(6)' NOT SUPPORTED. ***/!!!
    FROM
    SAMPLE_TABLE;
Copy

모범 사례

  • 출력 코드가 원본 코드와 기능적으로 동등한지 확인합니다.

  • 추가 지원이 필요한 경우 snowconvert-support@snowflake.com으로 이메일을 보내주세요.

SSC-EWI-TD0027

Snowflake는 Teradata 기본 제공 시간 차원 열 옵션을 지원하지 않음

심각도

낮음

설명

이 EWI는 Snowflake에서 VALIDTIME 또는 TRANSACTIONTIME과 같은 Teradata 기본 제공 시간 차원 특성을 지원하지 않기 때문에 생성됩니다.

코드 예시

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

모범 사례

  • CURRENT_TIMESTAMP와 같은 기본값으로 TIMESTAMP 열을 수동으로 생성합니다.

  • 테이블 스트림을 활용하여 테이블에 대한 데이터 조작 변경 사항과 각 변경 사항에 대한 메타데이터를 기록할 수 있습니다. (가이드)

  • 추가 지원이 필요한 경우 snowconvert-support@snowflake.com으로 이메일을 보내주세요.

SSC-EWI-TD0029

큐 테이블 기능은 지원되지 않습니다.

심각도

낮음

설명

이 경고는 QUEUE 특성이 있는 TABLE이 마이그레이션되는 경우에 표시됩니다. QUEUE 키워드는 Snowflake에서 지원되지 않으므로 제거됩니다.

코드 예시

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

모범 사례

SSC-EWI-TD0031

Teradata에서 길이가 고정된 char 타입으로 인해 결과가 다를 수 있습니다

심각도

낮음

설명

Teradata CHAR 데이터 타입의 길이는 고정되어 있어 LIKE와 같은 일부 함수가 열에 삽입된 단어 대신 전체 열을 일치시키려고 시도하므로 잘못된 일치가 발생합니다. 그러나 Snowflake의 CHAR 타입은 가변적인 크기이므로, LIKE 함수는 항상 삽입된 값과 일치시키려고 합니다. 다음 코드를 예로 들어 보겠습니다.

코드 예시

입력:
 CREATE TABLE table1
(
    col1 VARCHAR(36),
    col2 CHAR(36)
);

INSERT INTO table1 VALUES ('Gabriel', 'Gabriel');
INSERT INTO table1 VALUES ('Barnum', 'Barnum');
INSERT INTO table1 VALUES ('Sergio', 'Sergio');

SELECT col1 FROM table1 where col1 LIKE 'Barnum';
-- The result is a single row with 'Barnum'
SELECT col2 FROM table1 where col2 LIKE 'Barnum';
-- It does not return any row
Copy
출력:
 CREATE OR REPLACE TABLE table1
(
    col1 VARCHAR(36),
    col2 CHAR(36)
)
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "teradata",  "convertedOn": "07/14/2025",  "domain": "no-domain-provided" }}'
;

INSERT INTO table1
VALUES ('Gabriel', 'Gabriel');

INSERT INTO table1
VALUES ('Barnum', 'Barnum');

INSERT INTO table1
VALUES ('Sergio', 'Sergio');

SELECT
    col1 FROM
    table1
where col1 ILIKE 'Barnum';
-- The result is a single row with 'Barnum'
    SELECT
    col2 FROM
    table1
    where
    !!!RESOLVE EWI!!! /*** SSC-EWI-TD0031 - THE RESULT OF LIKE MAY DIFFER DUE TO CHAR TYPE HAVING A FIXED LENGTH IN TERADATA ***/!!! col2 ILIKE 'Barnum';
    -- It does not return any row
Copy

모범 사례

SSC-EWI-TD0034

다중문 SQL은 지원되지 않습니다.

참고

출력 코드의 일부 부분은 명확성을 위해 생략되었습니다.

심각도

낮음

설명

다중 문 SQL 실행은 지원되지 않습니다. 요청이 트랜잭션으로 처리되었습니다.

참고

다음 EWI는 PL 대상 언어 플래그가 ‘–PLTargetLanguage Javascript’와 같이 Javascript로 설정된 경우에만 생성됩니다.

코드 예시

입력:
-- Additional Params: --PLTargetLanguage Javascript
REPLACE PROCEDURE proc1()
  BEGIN
    BEGIN REQUEST;
      SELECT* FROM TABLE1;
    END REQUEST;
END;
출력:
 CREATE OR REPLACE PROCEDURE proc1 ()
RETURNS STRING
LANGUAGE JAVASCRIPT
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"teradata"}}'
EXECUTE AS CALLER
AS
$$
  // SnowConvert AI Helpers Code section is omitted.

  var TRANSACTION_HANDLER = function (error) {
    throw error;
  };
  // ** SSC-EWI-TD0034 - MULTISTATEMENT SQL EXECUTION NOT SUPPORTED, REQUEST HANDLED AS TRANSACTION **
  try {
    EXEC(`BEGIN`);
    EXEC(`SELECT
   *
FROM
   TABLE1`,[],undefined,TRANSACTION_HANDLER);
    EXEC(`COMMIT`);
  } catch(error) {
    EXEC(`ROLLBACK`);
  }
$$;
Copy

모범 사례

SSC-EWI-TD0039

입력 형식이 지원되지 않습니다.

심각도

Medium

설명

지정된 입력 형식은 Snowflake에서 지원되지 않습니다.

코드 예시

입력:
 SELECT 
    CAST('02/032/25' AS DATE FORMAT 'MM/DDD/YY'),
    CAST('02/032/25' AS DATE FORMAT 'MM/D3/YY'),
    CAST('03-Thursday-2025' AS DATE FORMAT 'DD-EEEE-YYYY'),
    CAST('03-Thursday-2025' AS DATE FORMAT 'DD-E4-YYYY');
Copy
출력:
 SELECT
    TO_DATE('02/032/25', 'MM/DDD/YY') !!!RESOLVE EWI!!! /*** SSC-EWI-TD0039 - INPUT FORMAT 'MM/DDD/YY' NOT SUPPORTED ***/!!!,
    TO_DATE('02/032/25', 'MM/D3/YY') !!!RESOLVE EWI!!! /*** SSC-EWI-TD0039 - INPUT FORMAT 'MM/D3/YY' NOT SUPPORTED ***/!!!,
    TO_DATE('03-Thursday-2025', 'DD-EEEE-YYYY') !!!RESOLVE EWI!!! /*** SSC-EWI-TD0039 - INPUT FORMAT 'DD-EEEE-YYYY' NOT SUPPORTED ***/!!!,
    TO_DATE('03-Thursday-2025', 'DD-E4-YYYY') !!!RESOLVE EWI!!! /*** SSC-EWI-TD0039 - INPUT FORMAT 'DD-E4-YYYY' NOT SUPPORTED ***/!!!;
Copy

모범 사례

SSC-EWI-TD0040

테이블의 형식이 지원되지 않습니다.

심각도

낮음

설명

지정된 형식은 지원되지 않습니다.

코드 예시

입력:
 CREATE TABLE T_2040
(
    C1 VARCHAR(255) CHARACTER SET LATIN NOT CASESPECIFIC FORMAT 'X(50)',
    C2 VARCHAR(255) CHARACTER SET LATIN NOT CASESPECIFIC FORMAT 'X(75)'
);
Copy
출력:
 CREATE OR REPLACE TABLE T_2040
(
    C1 VARCHAR(255) FORMAT 'X(50)' !!!RESOLVE EWI!!! /*** SSC-EWI-TD0040 - FORMAT IN TABLE T_2040 NOT SUPPORTED ***/!!!,
    C2 VARCHAR(255) FORMAT 'X(75)' !!!RESOLVE EWI!!! /*** SSC-EWI-TD0040 - FORMAT IN TABLE T_2040 NOT SUPPORTED ***/!!!
)
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "teradata",  "convertedOn": "07/14/2025",  "domain": "no-domain-provided" }}'
;
Copy

SSC-EWI-TD0041

정수를 보장하기 위해 잘라내기 함수가 추가되었습니다.

심각도

낮음

설명

Teradata를 Snowflake로 마이그레이션할 때 숫자 변환이 처리되는 방식에 차이가 발생할 수 있습니다. Teradata에서 값을 INTEGER로 캐스팅하면 원본 값이 부동 소수점 숫자이거나 숫자의 문자열 표현인 경우에도 모든 소수 부분을 암시적으로 자릅니다. 그러나 Snowflake에서는 정수가 아닌 숫자 또는 문자열을 INTEGER에 직접 캐스팅하면 값이 아직 정수가 아닌 경우 오류가 발생하거나 예기치 않은 결과가 발생할 수 있습니다.

호환성을 보장하기 위해 INTEGER로 캐스팅하기 전에 TRUNC() 함수가 적용됩니다. 이를 통해 소수 부분이 제거되어 정수로 안전하게 변환할 수 있습니다. 그러나 소스 값이 숫자가 아니거나 숫자가 아닌 문자열인 경우에는 여전히 오류가 발생할 수 있으며 수동 개입이 필요할 수 있습니다. 예를 들어, SnowConvert AI가 참조 누락으로 인해 열 유형을 확인할 수 없는 경우 변환을 수동으로 조정해야 할 수 있습니다.

코드 예시

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

모범 사례

SSC-EWI-TD0046

기본 제공 참조는 Snowflake에서 지원되지 않습니다.

심각도

Medium

설명

이 오류는 DBC 테이블에 대한 참조가 있고 선택한 열에 Snowflake에서 상응하는 항목이 없는 경우 발생합니다.

코드 예시

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

모범 사례

SSC-EWI-TD0049

TPT-문이 처리되지 않았습니다.

심각도

높음

설명

TPT의 DML 문을 도구가 처리 및 변환할 수 없습니다. 이는 스크립트 변수와 함께 연결을 사용하거나 DML 문 내부에 이스케이프 따옴표를 사용하는 등과 같은 이유로 발생할 수 있습니다.

코드 예시

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

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

   );
);
Copy
생성된 코드:
 #*** Generated code is based on the SnowConvert AI Python Helpers version 2.0.6 ***
 
import os
import sys
import snowconvert.helpers
from snowconvert.helpers import Export
from snowconvert.helpers import exec
from snowconvert.helpers import BeginLoading
import argparse
args = None
## Script1.tpt
class load_job:
    #'LOAD TABLE FROM A FILE'

  jobname = "load_job"
    #'define SCHEMA'

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


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

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

모범 사례

  • 이 문제의 경우, 수동으로 삽입 문을 입력하거나 DML 문이 아직 지원되지 않는 경우 SnowConvert AI 팀에 문의하여 해당 특정 사례에 대한 지원을 추가해 달라고 요청합니다.

  • 추가 지원이 필요한 경우 snowconvert-support@snowflake.com으로 이메일을 보내주세요.

SSC-EWI-TD0051

바이트 열에 대한 Teradata BYTES 함수 결과가 Snowflake LENGTH 함수와 다릅니다

심각도

낮음

설명

Teradata 바이트 데이터 타입의 길이는 고정되어 있으므로, BYTES 함수는 더 작은 바이트 유형 값을 열에 맞추기 위해 삽입된 [후행 0을 항상 계산](https://docs.teradata.com/r/1DcoER_KpnGTfgPinRAFUw/f7V55vW7OB1nU2WltjLxig하여 원래 삽입된 값의 크기 대신 열의 크기를 반환합니다. 그러나 Snowflake 바이너리 타입은 가변적인 크기이므로, LENGTH 함수는 항상 삽입된 값의 크기를 반환합니다. 다음 코드를 예로 들어 보겠습니다.

Teradata:

 create table exampleTable(
	bytecol byte(10)
);

insert into exampleTable values ('2B'XB);

select bytes(bytecol) from exampleTable; 
-- Will return 10, the size of bytecol
Copy

Snowflake의 동등한 코드:

 CREATE OR REPLACE TABLE exampleTable (
	bytecol BINARY
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"teradata"}}'
;

INSERT INTO exampleTable
VALUES (TO_BINARY('2B'));

SELECT
	LENGTH(bytecol) !!!RESOLVE EWI!!! /*** SSC-EWI-TD0051 - TERADATA BYTES FUNCTION RESULTS DIFFER FROM SNOWFLAKE LENGTH FUNCTION FOR BYTE TYPE COLUMNS ***/!!! from
	exampleTable;
	-- Will return 10, the size of bytecol
Copy

코드 예시:

입력 코드:
 create table sampleTable(
    byteColumn byte(10),
    varbyteColumn varbyte(15)
);

select bytes(byteColumn), bytes(varbyteColumn) from sampleTable;
Copy
생성된 코드:
 CREATE OR REPLACE TABLE sampleTable (
    byteColumn BINARY,
    varbyteColumn BINARY(15)
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"teradata"}}'
;

SELECT
    LENGTH(byteColumn) !!!RESOLVE EWI!!! /*** SSC-EWI-TD0051 - TERADATA BYTES FUNCTION RESULTS DIFFER FROM SNOWFLAKE LENGTH FUNCTION FOR BYTE TYPE COLUMNS ***/!!!,
    LENGTH(varbyteColumn) from
    sampleTable;
Copy

모범 사례

  • BYTES 함수의 사용을 분석한 결과, Snowflake LENGTH 함수 동작은 처음부터 원하는 동작이었으며 변경할 필요가 없습니다.

  • 추가 지원이 필요한 경우 snowconvert-support@snowflake.com으로 이메일을 보내주세요.

SSC-EWI-TD0052

Snowflake의 숫자로의 암시적 변환은 Teradata와 다르며 리터럴이 아닌 문자열의 경우 실패할 수 있습니다

심각도

낮음

설명

Teradata와 Snowflake는 둘 다 숫자 매개 변수를 예상하는 문자열 값이 작동하도록 허용하며, 이러한 문자열은 구문 분석되어 동등한 숫자로 변환됩니다.

그러나 두 언어가 유효한 숫자 문자열로 간주하는 데에는 차이가 있습니다. Teradata는 더 관대하며 빈 문자열 및 공백만 있는 문자열, 포함된 대시, 가수나 지수에 숫자가 없는 경우, 통화 기호, 숫자 구분 기호 또는 숫자 뒤에 숫자의 부호를 지정하는 경우와 같은 케이스를 성공적으로 구문 분석합니다. 예를 들어, 다음 문자열이 유효합니다.

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

  • '$50' -> 50

  • '5000-' -> -5000

  • '1,569,284.55' -> 1569284.55

Snowflake는 자동 낙관적 문자열 변환을 적용하여 문자열이 TM9 또는 TME 형식 중 하나와 일치할 것으로 예상하므로 언급된 대부분의 케이스에 대한 변환이 실패합니다. 이러한 차이를 해결하기 위해 SnowConvert AI는 Snowflake에서 구문 분석할 수 있도록 숫자에 대한 암시적 변환을 수행하는 함수에 전달된 문자열 리터럴을 처리하고 TM9 또는 TME와 일치하는 동등한 문자열을 생성합니다. 이는 리터럴 문자열 값에만 적용되며, 리터럴이 아닌 값이 Snowflake에서 구문 분석된다는 보장이 없음을 의미합니다.

코드 예시

입력 코드:
 create table myTable(
    stringCol varchar(30)
);

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

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

select cos(stringCol) from myTable;
Copy
생성된 코드:
 CREATE OR REPLACE TABLE myTable (
    stringCol varchar(30)
)
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "teradata",  "convertedOn": "07/14/2025",  "domain": "no-domain-provided" }}'
;

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

SELECT
    COS('-1236857.45');

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

모범 사례

SSC-EWI-TD0053

Snowflake는 PEROID 데이터 타입을 지원하지 않으므로, 모든 PEROID는 대신 varchar로 처리됩니다

참고

출력 코드의 일부 부분은 명확성을 위해 생략되었습니다.

참고

이 EWI는 더 이상 사용되지 않습니다. SSC-FDM-TD0036 설명서를 참조하세요.

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

PERIOD_UDF는 Snowflake에 지정된 타임스탬프와 시간에 대한 기본 형식을 사용하여 PEROID를 varchar로 표현합니다. 즉, 타임스탬프의 전체 자릿수는 3이고 시간 변수는 0이 되므로 결과의 전체 자릿수가 예상보다 더 높거나 낮을 수 있습니다. 결과 문자열에 포함되는 전체 자릿수를 수정하는 두 가지 옵션이 있습니다.

  • PERIOD_UDF의 3가지 매개 변수 버전 사용: 이 함수의 오버로드는 0과 9 사이의 정수인 PRECISIONDIGITS 매개 변수를 사용하여 결과에 포함될 소수 시간 부분의 자릿수를 제어합니다. Snowflake가 최대 9자리의 전체 자릿수를 지원하더라도 Teradata의 최대 전체 자릿수는 6입니다. 예:

호출

결과

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

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

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

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

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

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

  • TIMESTAMP_NTZ_OUTPUT_FORMATTIME_OUTPUT_FORMAT 세션 매개 변수 변경: ALTER SESSION SET TIMESTAMP_NTZ_OUTPUT_FORMAT = <format>ALTER SESSION SET TIME_OUTPUT_FORMAT = <format> 명령을

    사용하여 Snowflake가 현재 세션에 대해 기본적으로 사용하는 형식을 수정할 수 있으며, 원하는 전체 자릿수를 포함하도록 형식을 수정하면 현재 세션에서 향후 PERIOD_UDF를 실행할 때의 결과가 변경됩니다.

코드 예시

입력 코드:
 create table vacations (
    employeeName varchar(50),
    duration period(date)
);

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

select end(duration) from vacations;
Copy
생성된 코드:
 CREATE OR REPLACE TABLE vacations (
    employeeName varchar(50),
    duration VARCHAR(24) /*** SSC-FDM-TD0036 - SNOWFLAKE DOES NOT SUPPORT THE PERIOD DATATYPE, ALL PERIODS ARE HANDLED AS VARCHAR INSTEAD ***/
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"teradata"}}'
;

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

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

모범 사례

  • PERIOD의 동작 및 관련 함수가 varchar를 사용하여 에뮬레이트되므로 확보한 결과를 검토하여 정확성을 확인하는 것이 좋습니다.

  • 추가 지원이 필요한 경우 snowconvert-support@snowflake.com으로 이메일을 보내주세요.

SSC-EWI-TD0055

Snowflake에서 지원하는 TO_CHAR 형식은 Teradata와 다르며 실패하거나 동작이 다를 수 있습니다

참고

이 EWI는 더 이상 사용되지 않습니다. SSC-FDM-TD0029 설명서를 참조하세요.

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

일부 Teradata 형식 요소는 세션 매개 변수의 값에 따라 달라지는 Snowflake 함수에 매핑됩니다. 결과의 기능적 차이를 방지하려면 이러한 세션 매개 변수를 Teradata에서와 동일한 값으로 설정해야 합니다. 이러한 종류의 함수에 매핑되는 식별된 형식 요소는 다음과 같습니다.

  • D: DAYOFWEEK 함수에 매핑됩니다. 이 함수의 결과는 WEEK_START 세션 매개 변수에 따라 달라집니다. 기본적으로 Teradata는 일요일을 주의 첫 번째 요일로 간주하는 반면, Snowflake는 월요일을 첫 번째 요일로 간주합니다.

  • WW: WEEK 함수에 매핑됩니다. 이 함수는 WEEK_OF_YEAR_POLICY 세션 매개 변수에 따라 달라집니다. 기본적으로 ISO 표준(1월에 최소 4일이 포함된 첫 번째 주를 연도의 첫 번째로 간주)을 사용하도록 설정되어 있지만, Teradata에서는 1월 1일을 첫 번째 주의 시작으로 간주하도록 설정되어 있습니다.

세션 매개 변수를 수정하려면 ALTER SESSION SET parameter_name = value를 사용합니다. 세션 매개 변수에 대한 자세한 내용은 이 페이지를 참조하세요.

TO_CHAR의 단일 매개 변수 버전

TO_CHAR(Datetime)의 단일 매개 변수 버전은 세션 매개 변수 TIMESTAMP_LTZ_OUTPUT_FORMAT, TIMESTAMP_NTZ_OUTPUT_FORMAT, TIMESTAMP_TZ_OUTPUT_FORMATTIME_OUTPUT_FORMAT에 지정된 기본 형식을 사용합니다. 동작의 차이를 방지하려면 Teradata에서 사용되는 값과 동일한 값으로 설정합니다.

TO_CHAR(Numeric)의 경우 Snowflake는 TM9 또는 TME 형식 중 하나를 통해 varchar 표현을 생성하여 숫자를 간략하게 표현합니다. Teradata도 숫자를 간략하게 표현하므로 별도의 작업이 필요하지 않습니다.

코드 예시

입력 코드:
 select to_char(date '2008-09-13', 'DD/RM/YYYY');

select to_char(date '2010-10-20', 'DS');

select to_char(1255.495, 'SC9999.9999', 'nls_iso_currency = ''EUR''');

select to_char(45620);
Copy
생성된 코드:
 SELECT
TO_CHAR(date '2008-09-13', 'DD/') || PUBLIC.ROMAN_NUMERALS_MONTH_UDF(date '2008-09-13') || TO_CHAR(date '2008-09-13', '/YYYY') !!!RESOLVE EWI!!! /*** SSC-EWI-TD0055 - SNOWFLAKE SUPPORTED FORMATS FOR TO_CHAR DIFFER FROM TERADATA AND MAY FAIL OR HAVE DIFFERENT BEHAVIOR ***/!!!;

SELECT
TO_CHAR(date '2010-10-20', 'MM/DD/YYYY') !!!RESOLVE EWI!!! /*** SSC-EWI-TD0055 - SNOWFLAKE SUPPORTED FORMATS FOR TO_CHAR DIFFER FROM TERADATA AND MAY FAIL OR HAVE DIFFERENT BEHAVIOR ***/!!!;

SELECT
PUBLIC.INSERT_CURRENCY_UDF(TO_CHAR(1255.495, 'S9999.0000'), 2, 'EUR') !!!RESOLVE EWI!!! /*** SSC-EWI-TD0055 - SNOWFLAKE SUPPORTED FORMATS FOR TO_CHAR DIFFER FROM TERADATA AND MAY FAIL OR HAVE DIFFERENT BEHAVIOR ***/!!!;

SELECT
TO_CHAR(45620) !!!RESOLVE EWI!!! /*** SSC-EWI-TD0055 - SNOWFLAKE SUPPORTED FORMATS FOR TO_CHAR DIFFER FROM TERADATA AND MAY FAIL OR HAVE DIFFERENT BEHAVIOR ***/!!!;
Copy

모범 사례

  • FF를 사용하는 경우 Teradata에서 사용하는 전체 자릿수와 동일한 전체 자릿수로 DateTime 유형을 지정하거나 다른 동작을 방지하기 위해 형식 요소에 전체 자릿수를 추가합니다.

  • 타임존 관련 형식 요소를 사용하는 경우 다른 동작을 방지하기 위해 TIMESTAMP_TZ 유형의 첫 번째 매개 변수를 사용합니다. 또한 Snowflake에서는 TIME 유형에 타임존 정보를 포함할 수 없습니다.

  • 다른 동작을 방지하려면 필요한 세션 매개 변수를 Teradata의 기본값으로 설정합니다.

  • 추가 지원이 필요한 경우 snowconvert-support@snowflake.com으로 이메일을 보내주세요.

SSC-EWI-TD0057

NEW JSON의 바이너리 데이터는 지원되지 않습니다.

심각도

낮음

설명

NEW JSON 함수는 문자열 또는 바이너리 형식으로 표현된 JSON 데이터를 허용합니다. 데이터가 바이너리 표현인 경우 바이너리 형식은 JSON 오브젝트에 대한 메타데이터를 해석할 수 없어서 Snowflake에서 유효하지 않으므로 함수가 변환되지 않습니다. 이에 대한 자세한 내용은 Teradata NEW JSON 설명서를 참조하세요.

코드 예시

입력 코드

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

모범 사례

SSC-EWI-TD0059

Snowflake 사용자 기본 타임존을 Teradata 값과 일치하도록 구성해야 할 수 있습니다

심각도

낮음

설명

Teradata처럼, 기본 타임존 값을 사용자에게 설정하면 세션에 새 값이 정의될 때까지 세션이 해당 타임존을 사용하여 시작됩니다.

이 경고는 Teradata의 사용자에게 정의된 타임존과 동일한 타임존을 Snowflake 사용자에게 설정해야 함을 알리기 위해 생성됩니다. 이를 수행하려면 Snowflake에서 ALTER SESSION SET TIMEZONE = 'equivalent_timezone' 쿼리를 사용합니다. Snowflake는 IANA 타임존 데이터베이스만 허용한다는 점에 유의하세요.

코드 예시

입력 코드:
 SET TIME ZONE USER;
Copy
생성된 코드:
 !!!RESOLVE EWI!!! /*** SSC-EWI-TD0059 - SNOWFLAKE USER DEFAULT TIME ZONE MAY REQUIRE CONFIGURATION TO MATCH TERADATA VALUE ***/!!!
ALTER SESSION UNSET TIMEZONE;
Copy

모범 사례

  • 사용자의 기본 타임존을 Teradata 사용자에게 설정된 타임존과 동일한 타임존으로 설정해야 합니다.

  • 추가 지원이 필요한 경우 snowconvert-support@snowflake.com으로 이메일을 보내주세요.

SSC-EWI-TD0060

JSON_TABLE이 변환되지 않았습니다. 의미 체계 정보에서 열 이름을 검색할 수 없습니다

참고

출력 코드의 일부 부분은 명확성을 위해 생략되었습니다.

심각도

낮음

설명

JSON_TABLE 함수는 SnowConvert AI에서 변환할 수 있지만, 변환을 위해서는 JSON_TABLE ON 하위 쿼리에서 선택되는 열의 이름을 알아야 합니다.

이 메시지는 열 이름이 하위 쿼리에 명시적으로 입력되지 않았으며(예: SELECT * 사용) 참조되는 테이블의 의미 체계 정보를 찾을 수 없어 열 이름을 추출할 수 없음을 경고하기 위해 생성됩니다.

JSON 데이터를 테이블에 로드하는 방법은 이 페이지를 참조하세요.

코드 예시

입력 코드:
 CREATE TABLE demo.Train (
    firstCol INT,
    jsonCol JSON(400),
    thirdCol VARCHAR(30)
);

SELECT * FROM JSON_TABLE 
(ON (SELECT T.*
           FROM demo.Train T)
USING rowexpr('$.schools[*]')
               colexpr('[ {"jsonpath" : "$.name",
                           "type" : "CHAR(20)"},
                          {"jsonpath" : "$.type",
                           "type" : "VARCHAR(20)"}]')
)
AS JT;

SELECT * FROM JSON_TABLE 
(ON (SELECT T.*
           FROM demo.missingTable T)
USING rowexpr('$.schools[*]')
               colexpr('[ {"jsonpath" : "$.name",
                           "type" : "CHAR(20)"},
                          {"jsonpath" : "$.type",
                           "type" : "VARCHAR(20)"}]')
)
AS JT;
Copy
생성된 코드:
 CREATE OR REPLACE TABLE demo.Train (
    firstCol INT,
    jsonCol VARIANT,
    thirdCol VARCHAR(30)
)
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "teradata",  "convertedOn": "12/16/2024",  "domain": "test" }}'
;

SELECT
    * FROM
    (
        SELECT
            firstCol,
            rowexpr.value:name :: CHAR(20) AS Column_0,
            rowexpr.value:type :: VARCHAR(20) AS Column_1,
            thirdCol
        FROM
            demo.Train T,
            TABLE(FLATTEN(INPUT => jsonCol:schools)) rowexpr
    ) JT;

    SELECT
    * FROM
    !!!RESOLVE EWI!!! /*** SSC-EWI-TD0060 - JSON_TABLE NOT TRANSFORMED, COLUMN NAMES COULD NOT BE RETRIEVED FROM SEMANTIC INFORMATION ***/!!! JSON_TABLE
   (ON (
        SELECT
            T.*
                  FROM
            demo.missingTable T)
   USING rowexpr('$.schools[*]')
                  colexpr('[ {"jsonpath" : "$.name",
                           "type" : "CHAR(20)"},
                          {"jsonpath" : "$.type",
                           "type" : "VARCHAR(20)"}]')
   )
   AS JT;
Copy

모범 사례

  • SnowConvert AI에 제공된 코드가 완전한지 확인합니다. 테이블 정의를 제공하지 않은 경우 존재하는 테이블 정의로 코드를 다시 실행합니다.

  • 추가 지원이 필요한 경우 snowconvert-support@snowflake.com으로 이메일을 보내주세요.

SSC-EWI-TD0061

TD_UNPIVOT 변환에 필요한 열 정보를 찾을 수 없으며, 결과에 열이 누락되었습니다

심각도

낮음

설명

SnowConvert AI는 테이블의 열을 행으로 표현하는 데 사용할 수 있는 TD_UNPIVOT 함수를 지원하고 변환하지 않습니다.

그러나 이 변환이 작동하려면 테이블 또는 테이블 열에 대한 정보, 특히 열의 이름이 필요합니다. 이 정보가 없으면 변환이 불완전한 상태(결과에 열이 누락)로 남아 있을 수 있습니다. 이러한 경우 EWI가 생성됩니다.

코드 예시

입력 코드:
 CREATE TABLE unpivotTable  (
	myKey INTEGER NOT NULL PRIMARY KEY,
	firstSemesterIncome DECIMAL(10,2),
	secondSemesterIncome DECIMAL(10,2),
	firstSemesterExpenses DECIMAL(10,2),
	secondSemesterExpenses DECIMAL(10,2)
);

SELECT * FROM
 TD_UNPIVOT(
 	ON unpivotTable 
 	USING
 	VALUE_COLUMNS('Income', 'Expenses')
 	UNPIVOT_COLUMN('Semester')
 	COLUMN_LIST('firstSemesterIncome, firstSemesterExpenses', 'secondSemesterIncome, secondSemesterExpenses')
 	COLUMN_ALIAS_LIST('First', 'Second')
 )X ORDER BY mykey;

SELECT * FROM
 TD_UNPIVOT(
 	ON unknownTable
 	USING
 	VALUE_COLUMNS('MonthIncome')
 	UNPIVOT_COLUMN('Months')
 	COLUMN_LIST('januaryIncome', 'februaryIncome', 'marchIncome', 'aprilIncome')
 	COLUMN_ALIAS_LIST('January', 'February', 'March', 'April')
 )X ORDER BY yearKey;
Copy
생성된 코드:
 CREATE OR REPLACE TABLE unpivotTable (
	myKey INTEGER NOT NULL PRIMARY KEY,
	firstSemesterIncome DECIMAL(10,2),
	secondSemesterIncome DECIMAL(10,2),
	firstSemesterExpenses DECIMAL(10,2),
	secondSemesterExpenses DECIMAL(10,2)
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"teradata"}}'
;

--** SSC-FDM-0007 - MISSING DEPENDENT OBJECTS "VALUE_COLUMNS", "UNPIVOT_COLUMN", "COLUMN_LIST", "COLUMN_ALIAS_LIST" **
SELECT
	* FROM
	(
		SELECT
			myKey,
			TRIM(GET_IGNORE_CASE(OBJECT_CONSTRUCT('FIRSTSEMESTERINCOME', 'First', 'FIRSTSEMESTEREXPENSES', 'First', 'SECONDSEMESTERINCOME', 'Second', 'SECONDSEMESTEREXPENSES', 'Second'), Semester), '"') AS Semester,
			Income,
			Expenses
		FROM
			unpivotTable UNPIVOT(Income FOR Semester IN (
				firstSemesterIncome,
				secondSemesterIncome
			)) UNPIVOT(Expenses FOR Semester1 IN (
				firstSemesterExpenses,
				secondSemesterExpenses
			))
		WHERE
			Semester = 'FIRSTSEMESTERINCOME'
			AND Semester1 = 'FIRSTSEMESTEREXPENSES'
			OR Semester = 'SECONDSEMESTERINCOME'
			AND Semester1 = 'SECONDSEMESTEREXPENSES'
	) X ORDER BY mykey;

	--** SSC-FDM-0007 - MISSING DEPENDENT OBJECTS "VALUE_COLUMNS", "UNPIVOT_COLUMN", "COLUMN_LIST", "COLUMN_ALIAS_LIST" **
	SELECT
	* FROM
	!!!RESOLVE EWI!!! /*** SSC-EWI-TD0061 - TD_UNPIVOT TRANSFORMATION REQUIRES COLUMN INFORMATION THAT COULD NOT BE FOUND, COLUMNS MISSING IN RESULT ***/!!!
	(
		SELECT
			TRIM(GET_IGNORE_CASE(OBJECT_CONSTRUCT('JANUARYINCOME', 'January', 'FEBRUARYINCOME', 'February', 'MARCHINCOME', 'March', 'APRILINCOME', 'April'), Months), '"') AS Months,
			MonthIncome
		FROM
			unknownTable UNPIVOT(MonthIncome FOR Months IN (
				januaryIncome,
				februaryIncome,
				marchIncome,
				aprilIncome
			))
	) X ORDER BY yearKey;
Copy

모범 사례

  • 열에 대한 정보를 변환 도구에 제공하는 두 가지 방법이 있습니다. 테이블 사양을 TD_UNPIVOT 호출과 동일한 파일에 포함하거나 ON 식의 SELECT 쿼리에 SELECT * 또는 테이블 이름 대신 열 목록을 지정하는 것입니다.

  • 입력 테이블 또는 테이블의 모든 열이 피벗 해제된 경우 이 문제를 무시해도 됩니다. 그렇지 않은 경우 결과에 열이 누락됩니다.

  • 추가 지원이 필요한 경우 snowconvert-support@snowflake.com으로 이메일을 보내주세요.

SSC-EWI-TD0063

JSON 경로가 인식되지 않습니다

참고

출력 코드의 일부 부분은 명확성을 위해 생략되었습니다.

심각도

Medium

설명

이 메시지는 문자열이 예상되는 JSON 형식이 아니어서 SnowConvert AI가 JSON 경로를 역직렬화할 수 없는 경우에 표시됩니다.

코드 예시

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

모범 사례

  • Json 경로에 예기치 않은 문자가 있거나 올바른 형식이 아닌지 확인합니다.

  • 추가 지원이 필요한 경우 snowconvert-support@snowflake.com으로 이메일을 보내주세요.

SSC-EWI-TD0066

다음 식별자에 snowflake에서 유효하지 않은 하나 이상의 유니코드 이스케이프 문자가 있습니다

참고

출력 코드의 일부 부분은 명확성을 위해 생략되었습니다.

심각도

낮음

설명

이 메시지는 SnowConvert AI가 Snowflake에서 유효하지 않은 문자가 있는 Teradata 유니코드 구분 식별자를 변환하는 경우에 표시됩니다.

코드 예시

입력 코드:
 SELECT * FROM U&"#000f#ffff" UESCAPE '#';
Copy
생성된 코드:
 // SnowConvert AI Helpers Code section is omitted.
SELECT
* FROM
!!!RESOLVE EWI!!! /*** SSC-EWI-TD0066 - THE FOLLOWING IDENTIFIER HAS ONE OR MORE UNICODE ESCAPE CHARACTERS THAT ARE INVALID IN SNOWFLAKE ***/!!!
"\u000f\uffff";
Copy

모범 사례

  • Snowflake에서 유효한 유니코드 문자가 있는 식별자를 사용합니다.

  • 추가 지원이 필요한 경우 snowconvert-support@snowflake.com으로 이메일을 보내주세요.

SSC-EWI-TD0068

Snowflake는 프로필을 지원하지 않으며, 대신 역할을 참조합니다

심각도

Medium

설명

Teradata 프로필을 사용하면 저장소 공간 및 비밀번호 제약 조건 관리와 관련된 여러 공통 매개 변수를 정의할 수 있습니다.

그러나 Snowflake는 클라우드 아키텍처를 기반으로 작동하며 저장소를 자동으로 관리 및 최적화합니다. 즉, 사용자 측에서 저장소 사용자 지정을 할 필요가 없습니다. 또한, 현재 Snowflake에는 비밀번호 정책이 정의되어 있습니다. 이 정책은 모든 사용자 비밀번호에 적용되며 수정할 수 없습니다.

이 오류는 Teradata 프로필에 대한 참조가 사용자의 역할에 대한 참조로 변경되었음을 발견한 경우에 발생합니다. 이 참조는 Snowflake의 프로필에 가장 가까운 근사치이지만, 사용자의 프로필 및 역할 이름이 동일하지 않으면 쿼리 결과에 차이가 있을 수 있습니다.

코드 예시

입력 코드:
 SELECT PROFILE;
Copy
생성된 코드:
 SELECT
CURRENT_ROLE() !!!RESOLVE EWI!!! /*** SSC-EWI-TD0068 - SNOWFLAKE DOES NOT SUPPORT PROFILES, REFERENCING ROLE INSTEAD ***/!!!;
Copy

모범 사례

  • 사용자 프로필을 참조하지 않습니다. 사용자 프로필은 지원되지 않으며 사용자의 프로필과 역할 모두의 이름이 동일하지 않으면 쿼리 결과가 달라집니다.

  • 추가 지원이 필요한 경우 snowconvert-support@snowflake.com으로 이메일을 보내주세요.

SSC-EWI-TD0069

ST_DISTANCE 결과가 ST_SPHERICALDISTANCE와 약간 다릅니다

참고

이 EWI는 더 이상 사용되지 않습니다. SSC-FDM-TD0031 설명서를 참조하세요.

심각도

낮음

설명

Teradata 함수 ST_SPHERICALDISTANCE는 Haversine 공식을 사용하여 행성의 두 구면 좌표 사이의 거리를 계산하지만, Snowflake ST_DISTANCE 함수는 Haversine 공식을 사용하여 두 지리적 지점 사이의 최소 거리를 계산하지 않습니다.

코드 예시

입력 코드:
 --The distance between New York and Los Angeles
Select Cast('POINT(-73.989308 40.741895)' As ST_GEOMETRY) As location1,
	Cast('POINT(40.741895 34.053691)' As ST_GEOMETRY) As location2,
	location1.ST_SPHERICALDISTANCE(location2) As Distance_In_km;
Copy
생성된 코드
 --The distance between New York and Los Angeles
SELECT
	Cast('POINT(-73.989308 40.741895)' As GEOGRAPHY) As location1,
	Cast('POINT(40.741895 34.053691)' As GEOGRAPHY) As location2,
	!!!RESOLVE EWI!!! /*** SSC-EWI-TD0069 - ST_DISTANCE RESULTS ARE SLIGHTLY DIFFERENT FROM ST_SPHERICALDISTANCE ***/!!!
	ST_DISTANCE(
	location1, location2) As Distance_In_km;
Copy

모범 사례

SSC-EWI-TD0070

동일한 실행 흐름을 보장하기 위해 Label 섹션의 끝에 Return 문이 추가되었습니다

참고

이 EWI는 더 이상 사용되지 않습니다. SSC-FDM-TD0030 설명서를 참조하세요.

심각도

Medium

설명

GOTO 문이 Label 섹션으로 바뀌고 Return 문이 포함되지 않은 경우 동일한 실행 흐름을 보장하기 위해 섹션 끝에 Return 문이 추가됩니다.

GOTO 명령이 실행된 후 BTEQ에서는 GOTO 명령과 이름이 같은 Label 명령 사이의 문은 무시됩니다. 따라서 이러한 문이 실행되지 않도록 방지하려면 Label 섹션에 Return 문이 포함되어야 합니다.

또한 GOTO 명령은 실행이 다시 시작되는 동일한 이름의 Label을 제외한 다른 모든 문을 건너뛴다는 점에 유의해야 합니다. 따라서 GOTO 명령 이전에 정의된 Label 섹션에서는 실행이 다시 시작되지 않습니다.

코드 예시

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

모범 사례

SSC-EWI-TD0076

Snowflake에서는 외래 테이블 사용이 지원되지 않습니다.

심각도

Medium

설명

외래 테이블을 사용하면 Amazon S3, Azure Blob storage, Google Cloud Storage의 반정형 및 비정형 데이터와 같은 외부 오브젝트 저장소의 데이터에 액세스할 수 있습니다. 이 구문은 Snowflake에서 지원되지 않습니다. 그러나 Snowflake에는 외부 테이블, Iceberg 테이블, 표준 테이블 등 대신 사용할 수 있는 다른 대안이 있습니다.

코드 예시

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

모범 사례

  • Teradata의 외래 테이블 대신 Snowflake 외부 테이블을 사용할 수 있습니다. 외부 테이블은 클라우드 저장소(Amazon S3, Google Cloud Storage 또는 Microsoft Azure) 데이터 레이크에 있는 데이터 파일을 참조합니다. 이를 통해 데이터 레이크의 파일에 저장된 데이터를 데이터베이스 내부에 있는 것처럼 쿼리할 수 있습니다. 외부 테이블은 COPYINTO<table> 문에서 지원하는 모든 형식으로 저장된 데이터에 액세스할 수 있습니다.

  • 또 다른 대안은 Snowflake의 Iceberg 테이블입니다. Iceberg 테이블을 개방형 형식과 고객이 제공하는 클라우드 저장소를 사용하는 테이블로 생각할 수 있습니다. 이 데이터는 Parquet 파일에 저장됩니다.

  • 마지막으로, 표준 Snowflake 테이블이 있습니다. 이 테이블은 Teradata에서 외래 테이블의 기능을 다루는 옵션이 될 수 있습니다.

  • 추가 지원이 필요한 경우 snowconvert-support@snowflake.com으로 이메일을 보내주세요.

SSC-EWI-TD0077

RESET WHEN 절은 해당 조건으로 인해 이 시나리오에서 지원되지 않습니다

참고

출력 코드의 일부 부분은 명확성을 위해 생략되었습니다.

심각도

Medium

설명

SnowConvert AI는 현재 바이너리 조건(<=, >= or =)이 있는 RESET WHEN 절만 지원합니다. IS NOT NULL과 같은 다른 유형의 조건, RESET WHEN 절은 Snowflake에서 지원되지 않으므로 제거되고 오류 메시지가 추가됩니다.

이 오류 메시지는 RESET WHEN 조건이 마이그레이션 도구에서 정의를 찾지 못한 식을 참조하는 경우에 표시됩니다. 현재, 이 도구는 동일한 쿼리에 정의된 열에 대한 별칭 참조를 지원합니다.

코드 예시

조건이 이진법이 아닙니다
입력 코드:
 SELECT
    account_id,
    month_id,
    balance,
    ROW_NUMBER() OVER (
        PARTITION BY account_id
        ORDER BY month_id
        RESET WHEN balance IS NOT NULL
        ROWS UNBOUNDED PRECEDING
    ) as balance_increase
FROM account_balance
ORDER BY 1,2;
Copy
생성된 코드
 // SnowConvert AI Helpers Code section is omitted.
SELECT
    account_id,
    month_id,
    balance,
    ROW_NUMBER() OVER (
        PARTITION BY account_id
    !!!RESOLVE EWI!!! /*** SSC-EWI-TD0077 - RESET WHEN CLAUSE IS NOT SUPPORTED IN THIS SCENARIO DUE TO ITS CONDITION ***/!!!
        ORDER BY month_id
        ROWS UNBOUNDED PRECEDING
    ) as balance_increase
FROM
    account_balance
ORDER BY 1,2;
Copy
조건 식을 찾을 수 없습니다
입력 코드:
 SELECT
    account_id,
    month_id,
    balance,
    ROW_NUMBER() OVER (
        PARTITION BY account_id
        ORDER BY month_id
        RESET WHEN balance <= not_found_expresion
    ) as balance_increase
FROM account_balance
ORDER BY 1,2;
Copy
생성된 코드
 // SnowConvert AI Helpers Code section is omitted.
SELECT
    account_id,
    month_id,
    balance,
    ROW_NUMBER() OVER (
        PARTITION BY account_id
    !!!RESOLVE EWI!!! /*** SSC-EWI-TD0077 - RESET WHEN CLAUSE IS NOT SUPPORTED IN THIS SCENARIO DUE TO ITS CONDITION ***/!!!
        ORDER BY month_id
    ) as balance_increase
FROM
    account_balance
ORDER BY 1,2;
Copy

모범 사례

SSC-EWI-TD0079

필수 기간 유형 열을 찾을 수 없음

참고

출력 코드의 일부 부분은 명확성을 위해 생략되었습니다.

심각도

낮음

설명

이 경고는 Normalize 절의 기능을 복제하는 데 필요한 기간 열을 찾을 수 없기 때문에 표시됩니다.

코드 예시

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

모범 사례

  • 이 경고를 수동으로 수정하려면 첫 번째 기간 열을 찾아 정의된 위치를 제외한 모든 참조를 제거한 후 PeriodColumn 열을 찾은 열로 바꾸면 됩니다.

  • 추가 지원이 필요한 경우 snowconvert-support@snowflake.com으로 이메일을 보내주세요.

SSC-EWI-TD0082

현재 인코딩을 사용한 변환 함수는 지원되지 않습니다

심각도

Medium

설명

Snowflake에서는 현재 인코딩 인자를 사용한 Translate 함수 사용이 지원되지 않습니다. 해당 함수는 변환 중에 주석 처리됩니다.

코드 예시

입력 코드:
 SELECT Translate('abc' USING KANJISJIS_TO_LATIN);
Copy
생성된 코드
 SELECT
!!!RESOLVE EWI!!! /*** SSC-EWI-TD0082 - TRANSLATE FUNCTION USING KANJISJIS_TO_LATIN ENCODING IS NOT SUPPORTED ***/!!!
Translate('abc' USING KANJISJIS_TO_LATIN);
Copy

모범 사례

SSC-EWI-TD0083

두 개 이상의 복잡한 Select 절을 한 번에 변환할 수 없습니다

참고

출력 코드의 일부 부분은 명확성을 위해 생략되었습니다.

심각도

Medium

설명

SnowConvert AI가 두 개 이상의 복잡한 SELECT 절을 변환하려면 CTE 또는 FROM 절에 매핑해야 하며, 이로 인해 매핑된 코드가 컴파일되지 않거나 논리 주기에 들어가지 않기 때문에 변환할 수 없습니다.

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

NORMALIZE, EXPAND ON이나 RESET WHEN과 같은 CTE 또는 복합 FROM 절에 매핑해야 하는 항목입니다.

코드 예시

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

모범 사례

SSC-EWI-TD0087

if 문 반전으로 인해 GOTO 문이 제거되었습니다.

참고

이 EWI는 더 이상 사용되지 않습니다. SSC-FDM-TD0026 설명서를 참조하세요.

참고

출력 코드의 일부 부분은 명확성을 위해 생략되었습니다.

심각도

Medium

설명

SQL if 문의 기능을 복제하기 위해 IF 및 LABEL 명령과 함께 GOTO 명령을 사용하는 것이 일반적입니다. 이러한 방식으로 사용하면 if, if-else 또는 if-elseif-else 문으로 직접 변환할 수 있습니다. 그러나 이러한 경우에는 GOTO 명령이 불필요해지므로 LABEL 섹션으로 대체되지 않도록 제거해야 합니다.

코드 예시

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

모범 사례

SSC-EWI-TD0091

식이 누락된 종속성으로 인해 오류가 발생할 수 있는 캐스트로 변환되었습니다.

참고

명확성을 위해 출력 코드의 일부가 생략되었습니다

심각도

Medium

설명

Teradata 스크립트에서 CAST 식에 다음 구문을 사용할 수 잇습니다.

<expression> ( <DataType> )

Copy

이러한 키워드는 각각 CURRENT_DATECURRENT_TIME 함수로도 동작하기 때문에 이 구문은 CAST를 DATE 또는 TIME으로 변환하려고 시도하는 경우 모호성을 발생시킵니다.

따라서 CAST 식에 대한 컨텍스트가 없다면, 실제 CAST인지, 아니면 DATE 또는 TIME을 매개 변수로 받는 함수인지 구분할 수 있는 확실한 방법이 없습니다.

즉, <expression>이 열인지, 아니면 사용자 정의 함수(UDF)인지 알아야 합니다. 이를 위해서는 코드를 변환할 때 <expression>이 종속된 CREATE TABLE 또는 CREATE FUNCTION을 추가해야 합니다.

예를 들어 다음 SELECT 문을 확인하세요. AMBIGUOUS_EXPR에 대한 컨텍스트가 없다면 함수 호출을 다루는지 또는 CAST에서 DATE로의 변환을 다루는지 확인할 방법이 없습니다. 그러나 COL1TAB 테이블의 열이므로 COL1 (DATE)이 실제로 CAST라는 것을 알 수 있습니다.

CREATE TABLE TAB (
    COL1 VARCHAR(23)
)

SELECT 
    COL1 (DATE),
    AMBIGUOUS_EXPR (DATE)
FROM TAB;

Copy

코드 예시

입력 코드:
 CREATE TABLE TAB (
    COL1 VARCHAR(23)
)

SELECT 
    COL1 (DATE),
    AMBIGUOUS_EXPR (DATE)
FROM TAB;
Copy
생성된 코드
 CREATE OR REPLACE TABLE TAB (
    COL1 VARCHAR(23)
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"teradata"}}'
;

SELECT
    TO_DATE(
    COL1, 'YYYY/MM/DD') AS COL1,
    !!!RESOLVE EWI!!! /*** SSC-EWI-TD0091 - EXPRESSION CONVERTED AS CAST BY DEFAULT. CONVERSION MIGHT PRESENT ERRORS DUE TO MISSING DEPENDENCIES FOR 'AMBIGUOUS_EXPR'. ***/!!!
    AMBIGUOUS_EXPR :: DATE
    FROM
    TAB;
Copy

모범 사례

SSC-EWI-TD0092

Teradata 기본 제공 테이블 및 뷰에 대한 변환은 현재 지원되지 않습니다

심각도

낮음

설명

이 EWI는 SnowConvert AI가 현재 변환되지 않은 Teradata 시스템 테이블을 발견한 경우에 추가됩니다.

코드 예시

입력 코드:
 SELECT
  CRLF || 
  TRIM(em.ErrorText) INTO :MsgText
FROM
  DBC.ErrorMsgs em
WHERE
  em.ErrorCode = SUBSTR(:SqlStateCode, 2, 4)
Copy
생성된 코드
 SELECT
  CRLF ||
  TRIM(em.ErrorText) INTO :MsgText
FROM
  !!!RESOLVE EWI!!! /*** SSC-EWI-TD0092 - TRANSLATION FOR TERADATA BUILT-IN TABLE/VIEW DBC.ErrorMsgs IS NOT CURRENTLY SUPPORTED. ***/!!!
  DBC.ErrorMsgs em
WHERE
  UPPER(RTRIM(
  em.ErrorCode)) = UPPER(RTRIM(SUBSTR(:SqlStateCode, 2, 4)));
Copy

모범 사례

  • 동등성을 위해 Information_Schema 또는 SNOWFLAKE.ACCOUNT_USAGE와 같은 Snowflake의 내부 테이블에서 검색합니다.

  • 추가 지원이 필요한 경우 snowconvert-support@snowflake.com으로 이메일을 보내주세요.

SSC-EWI-TD0093

형식은 지원되지 않으며 varchar로 캐스트되는 모든 경우에 업데이트해야 합니다.

심각도

높음

설명

이 EWI는 CAST 함수가 숫자 식을 지정된 형식의 다른 숫자 유형으로 캐스트하는 데 사용될 때 추가됩니다. 형식은 숫자 값 자체에 영향을 주지 않지만, 이후에 결과가 문자열로 캐스트되면 의도한 형식이 올바르게 적용되지 않습니다. 따라서 EWI에 정의된 형식이 사용되도록 결과가 VARCHAR로 캐스트되는 모든 인스턴스를 업데이트해야 합니다.

코드 예시

입력 코드:
SELECT
   CAST(245222.32 AS FORMAT '-(10)9.9(4)') AS FormattedAmount,
   CAST(FormattedAmount AS VARCHAR(30));
Copy
생성된 코드
SELECT
   245222.32 !!!RESOLVE EWI!!! /*** SSC-EWI-TD0093 - FORMAT '-(10)9.9(4)' IS NOT SUPPORTED AND MUST BE UPDATED TO THE FOLLOWING FORMAT 'S9999999999.0000' IN ALL VARCHAR CAST USAGES. ***/!!! AS FormattedAmount,
   LEFT(LTRIM(TO_VARCHAR(FormattedAmount, 'MI0.00000000000000EEEEE')), 10);
Copy

모범 사례