SnowConvert:Teradata 问题

SSC-EWI-TD0069

不再支持此预警问题 (EWI)。请参阅 SSCFDM-TD0031 文档,了解当前信息。

严重性

描述

Teradata 函数 ST_SPHERICALDISTANCE 和 Snowflake 的 ST_DISTANCE 函数以不同的方式计算地理点之间的距离。Teradata 使用 Haversine 公式来测量球体(如地球)上两点之间的距离,而 Snowflake 的 ST_DISTANCE 使用不同的方法来确定两个地理坐标之间的最小距离。

示例代码

输入代码:

--The distance between New York and Los Angeles
Select Cast('POINT(-73.989308 40.741895)' As ST_GEOMETRY) As location1,
	Cast('POINT(40.741895 34.053691)' As ST_GEOMETRY) As location2,
	location1.ST_SPHERICALDISTANCE(location2) As Distance_In_km;
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-TD0079

部分输出代码已被移除,以使示例更清晰、更易于理解。

严重性

描述

出现此警告是因为找不到复制 Normalize 子句功能所需的“Period”列。

示例代码

输入代码:

SELECT NORMALIZE emp_id, duration2 FROM project;
Copy

输出代码

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

建议

  • 要解决此警告,请在代码中找到第一个“Period”列并移除对其的所有引用,最初定义的地方除外。然后,将“PeriodColumn”替换为您找到的列的名称。

  • 如需更多帮助,请通过 snowconvert-support@snowflake.com 联系我们

SSC-EWI-TD0008

严重性

描述

目前,Snowflake 没有某些字符串比较函数的直接等效项。

使用以下任何一种字符串比较方法时都会出现这个 EWI:jaron_gramLD(Levenshtein 距离)、LDWS(替换后的 Levenshtein 距离)、OSA(最优字符串对齐)、DL(Damerau-Levenshtein)、hammingLCS(最长公共子序列)、jaccardcosinesoundexcode

示例代码

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

建议

SSC-EWI-TD0059

严重性

描述

与 Teradata 类似,当您为用户设置默认时区时,他们的所有会话都将使用该时区,直到为会话指定不同的时区。

此警告提醒您在 Snowflake 中设置与之前为 Teradata 用户定义的时区相同的时区。要在 Snowflake 中设置时区,请运行以下查询:

ALTER SESSION SET TIMEZONE = 'equivalent_timezone'

注意:Snowflake 仅接受 IANA 时区数据库 (https://www.iana.org/time-zones) 中的时区。

示例代码

输入代码:

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-TD0049

严重性

描述

该工具无法在 TPT 中处理和转换 DML 语句。这通常发生在以下情况下:

  • 脚本变量串联在语句中

  • 该语句包含转义引号

示例代码

输入代码:

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

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

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

建议

  • 要解决此问题,您可以手动编写 INSERT 语句,也可以联系 SnowConvert 团队请求对该特定 DML 语句的支持,因为该语句目前不受支持。

  • 如需更多帮助,请发送电子邮件至 snowconvert-support@snowflake.com 联系我们

SSC-EWI-TD0009

严重性

描述

Teradata 的时态表使用派生时间段列来跟踪列级别上基于时间的数据。此功能目前在 Snowflake 中不可用。

示例代码

Teradata:

CREATE MULTISET TABLE Policy(
      Policy_ID INTEGER,
      Customer_ID INTEGER,
      Policy_Type CHAR(2) NOT NULL,
      Policy_Details CHAR(40),
      Policy_Start DATE NOT NULL,
      Policy_End DATE NOT NULL,
      PERIOD FOR Validity(Policy_Start,Policy_End) AS VALIDTIME
      )
   PRIMARY INDEX(Policy_ID);
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

建议

SSC-EWI-TD0039

严重性

描述

您尝试使用的文件格式与 Snowflake 不兼容。

示例代码

输入:

SELECT
    CAST('01-12-2020' AS DATE FORMAT 'dd-mm-yyyy'),
    CAST('01-12-2020' AS DATE FORMAT 'DDDBEEEE');
Copy

输出:

SELECT
    TO_DATE('01-12-2020', 'DD-MM-YYYY') !!!RESOLVE EWI!!! /*** SSC-EWI-TD0025 - OUTPUT FORMAT 'dd-mm-yyyy' NOT SUPPORTED. ***/!!!,
    TO_DATE('01-12-2020', 'DDD EEEE') !!!RESOLVE EWI!!! /*** SSC-EWI-TD0025 - OUTPUT FORMAT 'DDDBEEEE' NOT SUPPORTED. ***/!!!!!!RESOLVE EWI!!! /*** SSC-EWI-TD0039 - INPUT FORMAT 'DDD EEEE' NOT SUPPORTED ***/!!!;
Copy

建议

SSC-EWI-TD0068

严重性

描述

Teradata 配置文件允许您设置多个共享参数来控制存储空间和管理密码限制。

Snowflake 通过其云架构管理存储并自动处理所有优化,无需用户端存储配置。此外,Snowflake 强制执行标准密码政策,该策略普遍适用于所有用户,无法自定义。

当检测到 Teradata 配置文件引用并将其转换为 Snowflake 角色引用时,会发生此错误。虽然 Snowflake 中的角色与 Teradata 配置文件最接近,但查询结果可能会有所不同,除非 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-TD0029

严重性

描述

迁移使用 QUEUE (https://www.docs.teradata.com/r/rgAb27O_xRmMVc_aQq2VGw/tHvboDYXkHchWgJ2CD6Uig) 属性的 TABLE 时会出现此警告。由于 Snowflake 不支持 QUEUE 关键字,因此将在迁移期间将其移除。

示例代码

输入:

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-TD0063

部分输出代码已被移除,以使示例更清晰、更易于理解。

严重性

描述

当 SnowConvert 遇到不符合所需 JSON 格式且无法正确反序列化的 JSON 路径字符串时,就会出现此错误。

示例代码

输入代码:

SELECT
    *
FROM
JSON_TABLE (
    ON (
        SELECT
            id,
            trainSchedule as ts
        FROM
            demo.PUBLIC.Train T
    ) USING rowexpr('$weekShedule.Monday[*]') colexpr(
        '[{"jsonpath"  "$.time",
              "type"" : "CHAR ( 12 )"}]'
    )
) AS JT(Id, Ordinal, Time, City);
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

建议

SSC-EWI-TD0057

严重性

描述

NEW JSON 函数接受字符串或二进制格式的 JSON 数据。当数据为二进制格式时,该函数保持不变,因为 Snowflake 无法解释有关 JSON 对象的二进制格式元数据。更多详细信息,请参阅 NEW JSON 文档 (https://docs.teradata.com/r/C8cVEJ54PO4~YXWXeXGvsA/QpXrJfufgZ4uyeXFz7Rtcg)。

示例代码

输入代码

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-TD0006

严重性

描述

FLOAT 数据类型不支持使用 DEFAULT TIMEDEFAULT DATEDEFAULT CURRENT_DATEDEFAULT CURRENT_TIME,或 DEFAULT CURRENT_TIMESTAMP 规范的默认值。

示例代码

Teradata:

CREATE TABLE T_2004
(
    -- In the output code all of these columns will be FLOAT type
    -- and will include the SSC-EWI-TD0006 message.
    COL1 FLOAT DEFAULT TIME,
    COL2 FLOAT DEFAULT DATE,
    COL3 FLOAT DEFAULT CURRENT_DATE,
    COL4 FLOAT DEFAULT CURRENT_TIME,
    COL5 FLOAT DEFAULT CURRENT_TIMESTAMP
);
Copy

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

建议

SSC-EWI-TD0002

自 SnowConvert 28.1.100 版本发布以来,此 EWI 已被弃用。

严重性

描述

当 SQL 语句包含类型为 INTERVAL 的列选择器时,SnowConvert 将添加 EWI(错误、警告、信息)消息并创建存根函数。由于 Snowflake 不支持 INTERVAL 数据类型,因此转换过程完成后需要手动干预。

示例代码

Teradata:

SELECT
     CAST('07:00' AS INTERVAL HOUR(2) TO MINUTE),
     CAST('08:00' AS INTERVAL HOUR(2) TO MINUTE) As Test_Interval;
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

建议

SSC-EWI-TD0053

部分代码已被移除,以使示例更清晰、更易于理解。

生成的 Varchar 表示的精度

PERIOD_UDF 函数使用 Snowflake 的默认时间戳和时间格式创建时间段的字符串表示形式。默认情况下,时间戳包含三个小数位以保证精度,而时间变量没有小数位。如果您需要调整输出字符串的精度,则有两个选项可供选择。

使用此 PRECISIONDIGITS 参数的三参数版本 PERIOD_UDF此参数接受 0 到 9 之间的整数,并控制结果的分数时间部分的小数位数。虽然 Snowflake 最多支持九位小数,但 Teradata 最多仅支持六位。例如:

调用

结果

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'

  • 设置会话输出的时间格式:使用命令 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) !!!RESOLVE EWI!!! /*** SSC-EWI-TD0053 - SNOWFLAKE DOES NOT SUPPORT THE PERIOD DATATYPE, ALL PERIODS ARE HANDLED AS VARCHAR INSTEAD ***/!!!
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"teradata"}}'
;

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

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

建议

  • 由于 PERIOD 及其相关函数使用 Varchar 数据类型模拟,因此我们建议您验证结果的准确性。

  • 如需更多帮助,请通过 snowconvert-support@snowflake.com 联系我们

SSC-EWI-TD0077

部分输出代码已被移除,以使示例更清晰、更易于理解。

严重性

中等

描述

SnowConvert (SC) 仅支持使用二进制比较运算符(<=, >= 或 =)的 RESETWHEN 子句。如果您使用任何其他条件,例如 ISNOTNULL,SC 将移除 RESETWHEN 子句并显示错误消息,因为 Snowflake 不支持这些条件。

RESETWHEN 条件引用迁移工具无法找到的表达式时,会出现此错误消息。目前,该工具仅支持在同一查询中定义的列别名。

示例代码

条件非二进制

输入代码:

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 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 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-TD0012

严重性

描述

当 SnowConvert 检测到具有 DEFAULT 值的 BINARY 数据类型列时,会出现此警告。由于 Snowflake 不支持 BINARY 列的默认值,因此 SnowConvert 移除了 DEFAULT 规范。

示例代码

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

建议

SSC-EWI-TD0003

严重性

描述

在 Snowflake 中,Trim 函数(LTRIM、RTRIMTRIM)仅在移除空格或空白字符时支持排序规则。它们不支持其他字符类型的排序规则。

当 SnowConvert 在排序后的列上遇到 LTRIMRTRIM,或 TRIM(带有 LEADINGTRAILING 选项)函数时,它会自动添加一个 COLLATE 函数。在应用修剪操作之前,此函数会创建输入列的未排序副本。预警指标 (EWI) 会提醒您,在应用修剪函数之前,该列的排序规则已被移除。因此,修剪后的输出将没有排序规则设置,这可能会影响随后使用此结果进行字符串比较。

示例代码

Teradata:

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

SELECT
    TRIM(BOTH '0' FROM col1),
    TRIM(LEADING '  ' FROM col1),
    TRIM(TRAILING '0' FROM col1),
    LTRIM(col1, '0'),
    RTRIM(col1)
FROM
    collateTable;
Copy

Snowflake Scripting:

CREATE OR REPLACE TABLE collateTable (
	col1 VARCHAR(50) COLLATE 'en-cs'
)
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "teradata",  "convertedOn": "06/17/2024" }}'
;

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

建议

  • 为了保持一致的比较行为,使用 COLLATE 函数将原始列的排序规则附加到 TRIM 函数结果中。在第二个实参中将原始排序规则值指定为字面量字符串。

  • 如需更多帮助,请通过以下方式联系我们:snowconvert-support@snowflake.com

SSC-EWI-TD0052

严重性

描述

当将字符串值传递给需要数字参数的函数时,Teradata 和 Snowflake 都会自动将字符串值转换为数字。对字符串值进行解析并转换为其等效数字。

Teradata 和目标语言处理数字字符串的方式不同。Teradata 更加灵活,可以将各种字符串格式解析为数字,包括:

  • 空字符串或只有空格的字符串

  • 带嵌入式破折号的字符串

  • 尾数或指数中没有数字的数字

  • 货币符号

  • 带数字分隔符的数字

  • 数字之后出现符号的数字

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

  • '$50' -> 50

  • '5000-' -> -5000

  • '1,569,284.55' -> 1569284.55

Snowflake 使用 自动乐观字符串转换,并期望字符串与 TM9 或 TME 格式相匹配。当字符串与这些格式不匹配时,转换失败。为了解决这个问题,SnowConvert 通过生成与 TM9 或 TME 格式相匹配的字符串来处理需要转换为数值的字符串字面量。这样可以确保 Snowflake 可以正确解析它们。请注意,此转换仅适用于字面量字符串值;Snowflake 可能无法成功解析非字面量值。

示例代码

输入代码:

create table myTable(
    stringCol varchar(30)
);

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

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

select cos(stringCol) from myTable;
Copy

输出代码:

CREATE OR REPLACE TABLE myTable (
    stringCol varchar(30)
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"teradata"}}'
;

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

SELECT
    cos('-1236857.45');

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

建议

SSC-EWI-TD0066

部分输出代码已被移除,以使示例更清晰、更易于理解。

严重性

描述

当 SnowConvert 遇到包含 Snowflake 不支持的字符的 Teradata Unicode 分隔标识符时,就会出现此消息。有关更多信息,请参阅 Teradata Unicode 分隔标识符 (https://docs.teradata.com/r/Teradata-Database-SQL-Fundamentals/June-2017/Basic-SQL-Syntax/Working-with-Unicode-Delimited-Identifiers)。

示例代码

输入代码:

SELECT * FROM U&"#000f#ffff" UESCAPE '#';
Copy

输出代码:

// SnowConvert Helpers Code section is omitted.
SELECT
* FROM
!!!RESOLVE EWI!!! /*** SSC-EWI-TD0066 - THE FOLLOWING IDENTIFIER HAS ONE OR MORE UNICODE ESCAPE CHARACTERS THAT ARE INVALID IN SNOWFLAKE ***/!!!
"\u000f\uffff";
Copy

建议

SSC-EWI-TD0027

严重性

描述

Snowflake 不支持 Teradata 的内置时间属性,例如 VALIDTIME 或 TRANSACTIONTIME,这会导致 EWI(错误、警告、信息)消息。

示例代码

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 ***/!!!!!!RESOLVE EWI!!! /*** SSC-EWI-TD0053 - SNOWFLAKE DOES NOT SUPPORT THE PERIOD DATATYPE, ALL PERIODS ARE HANDLED AS VARCHAR INSTEAD ***/!!!
   )
   COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"teradata"}}'
;
Copy

建议

  • 手动创建 TIMESTAMP 列并将其默认值设置为 CURRENT_TIMESTAMP。

  • 使用表格流跟踪数据的变化并捕获每次修改的元数据。(指南)

  • 如需更多帮助,请通过以下方式联系我们:snowconvert-support@snowflake.com

SSC-EWI-TD0076

严重性

中等

描述

Teradata 中的 外部表 (https://docs.teradata.com/r/Teradata-VantageTM-SQL-Data-Definition-Language-Syntax-and-Examples/September-2020/Table-Statements/CREATE-FOREIGN-TABLE) 允许您访问存储在外部位置的数据,例如 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
!!!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)读取数据。这样您可以像查询数据库表一样查询数据湖文件。外部表支持所有可与 COPY INTO

  • Snowflake 的 Iceberg 表 提供另一种选择。这些表使用开放格式,并将数据作为 Parquet 文件存储在您自己的云存储中。

  • 标准 Snowflake 表 也可以取代 Teradata 外部表功能。

  • 如需更多帮助,请通过以下方式联系我们:snowconvert-support@snowflake.com

  • SSC-EWI-TD0091

    为了便于理解,部分输出代码已被移除。

    严重性

    描述

    在 Teradata 脚本中,您可以使用具有以下语法的 CAST 表达式转换数据类型:

    <expression> ( <DataType> )
    
    Copy

    当使用 CAST 与 DATETIME 转换数据类型时,可能会出现歧义,因为这些关键字还分别用作 CURRENT_DATECURRENT_TIME 函数。

    因此,在检查代码时,如果没有关于需要 CAST 操作的表达式的其他上下文,则很难区分真正的 CAST 操作和仅将 DATE 或 TIME 参数作为输入的函数。

    要确定 <expression> 是列还是用户定义函数 (UDF),在转换代码时必须包含相应的 CREATE TABLECREATE FUNCTION 语句。这提供了有关表达式定义的必要上下文。

    例如,让我们来看看下面的 SELECT 语句。当我们遇到 AMBIGUOUS_EXPR 时,如果没有额外的上下文,我们无法确定它代表函数调用还是 DATE 类型转换。但是,我们可以肯定 COL1 (DATE) 是一个类型转换 (CAST) 操作,因为 COL1 是表 TAB 中的一列。

    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-TD0017

    严重性

    描述

    当 SnowConvert 检测到包含 GLOBAL TEMPORARY TRACE 选项的 CREATE TABLE 语句时,会出现此警告。此功能特定于 Teradata(TRACE 功能 (https://docs.teradata.com/r/Enterprise_IntelliFlex_VMware/SQL-Data-Definition-Language-Syntax-and-Examples/Table-Statements/CREATE-GLOBAL-TEMPORARY-TRACE-TABLE)),在 Snowflake 中不可用且将在转换期间移除。

    示例代码

    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

    建议

    SSC-EWI-TD0046

    严重性

    描述

    当引用 DBC (https://docs.teradata.com/r/Teradata-Archive/Recovery-Utility-Reference/March-2019/Archive/Recovery-Operations/Database-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-TD0023

    严重性

    描述

    ACTIVITY_COUNT 状态变量用于在嵌入式 SQL 或存储过程中显示 SQL DML 语句(如 INSERT、UPDATE 或 DELETE)修改的行数。有关更多详细信息,请访问 此处 (https://docs.teradata.com/r/Enterprise_IntelliFlex_VMware/SQL-Stored-Procedures-and-Embedded-SQL/Result-Code-Variables/ACTIVITY_COUNT)。

    要复制 ACTIVITY_COUNT 的行为,可使用转换规范中所述的替代方案。

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

    SELECTSETINTOVARIABLE 语句中使用 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;
    
    Copy

    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 中使用此查询,您需要对其进行修改以使用 Snowflake 的 SELECT INTO VARIABLE 语法。

    此外,如果您在使用 RESULT_SCAN(LAST_QUERY_ID()) 时发现不正确的结果,请参阅 SSC-FDM-TD0033,了解有关潜在限制及其处理方式的信息。

    建议

    SSC-EWI-TD0051

    严重性

    描述

    在处理字节数据类型时,Teradata 和 Snowflake 之间有一个重要的区别:

    • 在 Teradata 中,BYTES 函数 将始终计算末尾零 (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-TD0034

    部分输出代码已被移除,以使示例更清晰、更易于理解。

    严重性

    描述

    不支持在单个请求中执行多个 SQL 语句。您的请求已作为单笔事务处理。

    此错误警告信息 (EWI) 仅在使用以下命令将 PL 目标语言标志设置为 Javascript 时出现:'--PLTargetLanguage Javascript'

    示例代码

    输入:

    -- Additional Params: --PLTargetLanguage Javascript
    REPLACE PROCEDURE proc1()
      BEGIN
        BEGIN REQUEST;
          SELECT* FROM TABLE1;
        END REQUEST;
    END;
    
    Copy

    输出:

    CREATE OR REPLACE PROCEDURE proc1 ()
    RETURNS STRING
    LANGUAGE JAVASCRIPT
    COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"teradata"}}'
    EXECUTE AS CALLER
    AS
    $$
      // SnowConvert Helpers Code section is omitted.
    
      var TRANSACTION_HANDLER = function (error) {
        throw error;
      };
      // ** SSC-EWI-TD0034 - MULTISTATEMENT SQL EXECUTION NOT SUPPORTED, REQUEST HANDLED AS TRANSACTION **
      try {
        EXEC(`BEGIN`);
        EXEC(`SELECT
       *
    FROM
       TABLE1`,[],undefined,TRANSACTION_HANDLER);
        EXEC(`COMMIT`);
      } catch(error) {
        EXEC(`ROLLBACK`);
      }
    $$;
    
    Copy

    建议

    SSC-EWI-TD0024

    严重性

    描述

    当在存储过程内注释掉的 ABORT 语句中使用 AGGREGATE 函数时,会出现此警告。

    示例代码

    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-TD0010

    严重性

    描述

    用于将文本转换为大写字母的 UPPERCASE 列属性在 Snowflake 中不可用。

    示例代码

    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

    建议

    • 存储数据时,UPPERCASE 子句将小写字符转换为大写。例如,“aaa”存储为“AAA”。要处理这个问题,您可以将 UPPER 函数添加到所有插入语句中。但是,请注意,您还需要修改任何加载外部数据的 ETL 进程。

    • 如需更多帮助,请通过 snowconvert-support@snowflake.com 联系我们

    SSC-EWI-TD0041

    严重性

    描述

    系统不支持您提供的文件格式。

    示例代码

    输入:

    SELECT
        cast(T_2041.integer_column as integer);
    
    Copy

    输出:

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

    建议

    SSC-EWI-TD0061

    严重性

    描述

    SnowConvert 不支持或转换 TD_UNPIVOT (https://docs.teradata.com/r/Enterprise_IntelliFlex_VMware/SQL-Operators-and-User-Defined-Functions/Table-Operators/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* 或仅使用表名

    • 如果您取消透视输入表中的 ALL 列,则可以忽略此问题。但是,如果您仅取消透视某些列,则结果将缺少数据。

    • 如需更多支持,请通过 snowconvert-support@snowflake.com 联系我们

    SSC-EWI-TD0004

    严重性

    描述

    Snowflake 过程没有与 Teradata 的 Continue Handler 功能直接对等的函数。虽然 SnowConvert 可以处理某些异常代码并模拟类似行为,但在 Continue Handler 语句中遇到不支持的异常代码时,它将生成 EWI(错误、警告或信息)消息。

    示例代码

    Teradata:

    REPLACE PROCEDURE PURGING_ADD_TABLE
    (
     IN inDatabaseName     	VARCHAR(30),
     IN inTableName    		VARCHAR(30)
    )
    BEGIN
     DECLARE vCHAR_SQLSTATE CHAR(5);
     DECLARE vSUCCESS       CHAR(5);
    
      DECLARE CONTINUE HANDLER FOR SQLSTATE 'UNSUPPORTED'
      BEGIN
         SET vCHAR_SQLSTATE = SQLCODE;
         SET vSUCCESS    = SQLCODE;
      END;
    
      SELECT 1;
    
    END;
    
    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

    建议

    SSC-EWI-TD0055

    不再支持此预警问题 (EWI)。请参阅 SSCFDM-TD0029 文档,了解当前信息。

    依赖会话参数的格式元素

    以下 Teradata 格式元素映射到需要特定会话参数设置的 Snowflake 函数。为确保 Teradata 和 Snowflake 之间结果一致,必须配置以下会话参数以匹配您的 Teradata 设置:

    • D:映射到 DAYOFWEEK 函数。请注意,由于默认设置不同,Teradata 和 Snowflake 的结果可能有所不同。Teradata 使用星期日作为一周的第一天,而 Snowflake 使用星期一。

    • WW:映射到 WEEK 函数。由于不同的周计算政策,结果可能会有所不同。Snowflake 默认使用 ISO 标准(第一周必须包含一月份的至少四天),而 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 会自动使用 TM9TME 格式来创建紧凑的字符串表示形式。由于 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-TD0082

    严重性

    描述

    在 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-TD0020

    此警告消息已不再使用。有关当前文档,请参阅 SSC-EWI-0009

    严重性

    描述

    Snowflake 目前仅支持 POSIX 基本正则表达式语法。高级正则表达式特性不可用。

    每当对 REGEX_SUBSTR、REGEX_REPLACE 或 REGEX_INSTR 的函数调用转换为 Snowflake 时,就会出现此警告。它提醒用户,Snowflake 可能不支持某些正则表达式特性。不支持 的重要功能包括:

    • Lookahead

    • Lookbehind

    • 非捕获组

    示例代码

    Teradata:

    SELECT REGEXP_SUBSTR('qaqequ','q(?=u)', 1, 1);
    
    Copy

    Snowflake Scripting:

    SELECT
    !!!RESOLVE EWI!!! /*** SSC-EWI-TD0020 - 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-EWI-TD0060

    部分输出代码已被移除,以使示例更清晰、更易于理解。

    严重性

    描述

    SnowConvert 工具可以转换 JSON_TABLE 函数,但它需要知道在 JSON_TABLE ON 子查询中选择的特定列名才能正确执行转换。

    当子查询中未明确指定列名(例如使用 SELECT * 时)且系统找不到表的结构信息时,就会出现此警告。没有这些信息,就无法自动确定列名。

    要了解如何将 JSON 数据加载到表中,请参阅我们的 文档页面

    示例代码

    输入代码:

    CREATE TABLE demo.Train (
        firstCol INT,
        jsonCol JSON(400),
        thirdCol VARCHAR(30)
    );
    
    SELECT * FROM JSON_TABLE
    (ON (SELECT T.*
               FROM demo.Train T)
    USING rowexpr('$.schools[*]')
                   colexpr('[ {"jsonpath" : "$.name",
                               "type" : "CHAR(20)"},
                              {"jsonpath" : "$.type",
                               "type" : "VARCHAR(20)"}]')
    )
    AS JT;
    
    SELECT * FROM JSON_TABLE
    (ON (SELECT T.*
               FROM demo.missingTable T)
    USING rowexpr('$.schools[*]')
                   colexpr('[ {"jsonpath" : "$.name",
                               "type" : "CHAR(20)"},
                              {"jsonpath" : "$.type",
                               "type" : "VARCHAR(20)"}]')
    )
    AS JT;
    
    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 提供代码时,请务必包括表定义。没有它们,您需要再次运行代码。

    • 如需更多帮助,请通过以下方式联系我们:snowconvert-support@snowflake.com

    SSC-EWI-TD0031

    严重性

    描述

    在比较 Teradata 和 Snowflake 中的 CHAR 数据类型时,有一个重要的区别需要注意。在 Teradata 中,CHAR 为固定长度,这意味着 LIKE 函数会尝试匹配整个列长度,包括末尾空格。这可能会导致意想不到的结果。相比之下,Snowflake 的 CHAR 类型是为可变长度,因此 LIKE 函数仅与存储的实际值进行匹配,不考虑末尾空格。以下为该行为演示示例:

    示例代码

    输入:

    CREATE TABLE table1
    (
        col1 VARCHAR(36),
        col2 CHAR(36)
    );
    
    INSERT INTO table1 VALUES ('Gabriel', 'Gabriel');
    INSERT INTO table1 VALUES ('Barnum', 'Barnum');
    INSERT INTO table1 VALUES ('Sergio', 'Sergio');
    
    SELECT col1 FROM table1 where col1 LIKE 'Barnum';
    -- The result is a single row with 'Barnum'
    SELECT col2 FROM table1 where col2 LIKE 'Barnum';
    -- It does not return any row
    
    Copy

    输出:

    CREATE OR REPLACE TABLE table1
    (
        col1 VARCHAR(36),
        col2 CHAR(36)
    )
    COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"teradata"}}'
    ;
    
    INSERT INTO table1
    VALUES ('Gabriel', 'Gabriel');
    
    INSERT INTO table1
    VALUES ('Barnum', 'Barnum');
    
    INSERT INTO table1
    VALUES ('Sergio', 'Sergio');
    
    SELECT
        col1 FROM
        table1
    where col1 LIKE 'Barnum';
    -- The result is a single row with 'Barnum'
        SELECT
        col2 FROM
        table1
        where
        !!!RESOLVE EWI!!! /*** SSC-EWI-TD0031 - THE RESULT OF LIKE MAY DIFFER DUE TO CHAR TYPE HAVING A FIXED LENGTH IN TERADATA ***/!!! col2 LIKE 'Barnum';
        -- It does not return any row
    
    Copy

    建议

    SSC-EWI-TD0005

    严重性

    关键

    描述

    代码已成功转换,但可能无法按预期运行,因为此功能尚未完全实现。

    该警告通知用户,使用此语句将产生与原始脚本不同的功能。

    示例来源

    BTEQ 输入代码:

    .SET SIDETITLES ON
    
    Copy

    Python 输出代码:

    #*** Generated code is based on the SnowConvert Python Helpers version 2.0.6 ***
    
    import os
    import sys
    import snowconvert.helpers
    from snowconvert.helpers import Export
    from snowconvert.helpers import exec
    from snowconvert.helpers import BeginLoading
    con = None
    def main():
      snowconvert.helpers.configure_log()
      con = snowconvert.helpers.log_on()
      #** SSC-EWI-TD0005 - THE STATEMENT WAS CONVERTED BUT ITS FUNCTIONALITY IS NOT IMPLEMENTED YET **
      Export.side_titles(True)
      snowconvert.helpers.quit_application()
    
    if __name__ == "__main__":
      main()
    
    Copy

    建议

    SSC-EWI-TD0083

    为了便于理解,部分输出代码已被移除。

    严重性

    描述

    SnowConvert 无法同时处理多个复杂的 SELECT 语句。之所以存在这种限制,是因为转换这些语句需要将它们映射到公用表表达式 (CTEs) 或复合 FROM 子句,这可能会导致编译错误或无限逻辑循环。

    我们如何看待 SELECT 复杂子句?

    需要映射到公用表表达式 (CTE) 或复合 FROM 子句的语句,包括 NORMALIZE、EXPAND ON 和 RESET WHEN 函数。

    示例代码

    输入代码:

    SELECT
       NORMALIZE emp_id,
       duration,
       dept_id,
       balance,
       (
         ROW_NUMBER() OVER (
           PARTITION BY emp_id
           ORDER BY
             dept_id RESET WHEN balance <= SUM(balance) OVER (
               PARTITION BY emp_id
               ORDER BY dept_id
               ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING
             )
         ) -1
       ) AS balance_increase
    FROM project
    EXPAND ON duration AS bg BY ANCHOR ANCHOR_SECOND
    ORDER BY 1, 2;
    
    Copy

    输出代码

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

    建议

    SSC-EWI-TD0070

    不再支持此预警问题 (EWI)。请参阅 SSCFDM-TD0030 文档,了解当前信息。

    严重性

    描述

    当 SC 将 Goto 语句替换为 Label 部分时,如果该部分的末尾没有返回语句,则会自动在末尾添加一个返回语句。这确保了程序的执行流程与原始代码一致。

    执行 BTEQ Goto 命令时,从该命令到对应的标签之间的所有语句都会被跳过。为避免执行到标签部分后继续执行之后的语句,您应在该部分添加一个返回语句。

    请务必注意,执行 Goto 命令时,它会跳过所有语句,直到到达匹配的 LABEL 为止。然后,程序继续从该 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-TD0001

    为了便于理解,部分输出代码已被移除。

    严重性

    描述

    当 SnowConvert 识别别名表达式中的递归模式时,会出现此警告。在这种情况下,SnowConvert 无法执行前向别名转换,而这是别名在 Snowflake 中正常运作所必需的。

    当两个或多个别名以循环模式相互引用时,就会出现递归别名。这种情况可能直接发生,例如别名 A 引用别名 B,同时别名 B 又引用别名 A,也可能间接发生,即通过多个中间别名传递性地形成循环引用。

    示例代码

    注意: 虽然 Snowflake 通常不支持递归别名,但支持一些基本用例。

    注意:Snowflake 通常不支持递归别名。但是,支持一些基本用例,如以下示例所示。

    以下代码演示了完成迁移过程后在 Snowflake 中的成功执行:

    Teradata:

    SELECT
        COL1 AS COL2,
        COL2 AS COL1
    FROM
        TABLE_EXAMPLE;
    
    Copy

    Snowflake Scripting:

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

    下面显示的代码示例将无法正常执行:

    Teradata:

    SELECT
        A + B as C,
        COL2 + C AS A,
        COL3 AS B
    FROM
        TABLE_EXAMPLE;
    
    Copy

    Snowflake Scripting:

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

    建议

    • 检查您的代码中是否存在递归正向别名。EWI 标识了第一个递归别名,但您的代码中可能还有其他需要注意的内容。

    • 如需更多帮助,请通过以下方式联系我们:snowconvert-support@snowflake.com

    SSC-EWI-TD0087

    此文档已不再维护。有关当前信息,请参阅 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
          !!!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-TD0025

    严重性

    描述

    当您使用具有 Snowflake Scripting 不支持的输出格式的 CAST 函数时,会出现此警告。

    代码示例

    Teradata:

    CREATE TABLE SAMPLE_TABLE
    (
        VARCHAR_TYPE VARCHAR
    );
    
    REPLACE VIEW SAMPLE_VIEW
    AS
    SELECT
    CAST(VARCHAR_TYPE AS FLOAT FORMAT 'ZZZ.ZZZZZ'),
    CAST('01:02.030405' AS TIME(1) WITH TIME ZONE FORMAT 'MI:SS.S(6)'),
    CAST('01-12-2020' AS DATE FORMAT 'dd-mm-yyyy')
    FROM SAMPLE_TABLE;
    
    Copy

    Snowflake Scripting:

    CREATE OR REPLACE TABLE SAMPLE_TABLE (
        VARCHAR_TYPE VARCHAR
    )
    COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"teradata"}}'
    ;
    
    CREATE OR REPLACE VIEW SAMPLE_VIEW
    COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"teradata"}}'
    AS
    SELECT
        TO_NUMBER(VARCHAR_TYPE, '999.00000', 38, 10) !!!RESOLVE EWI!!! /*** SSC-EWI-TD0025 - OUTPUT FORMAT 'ZZZ.ZZZZZ' NOT SUPPORTED. ***/!!!,
        TO_TIME('01:02.030405', 'MI:SS.FF6') !!!RESOLVE EWI!!! /*** SSC-EWI-TD0025 - OUTPUT FORMAT 'MI:SS.S(6)' NOT SUPPORTED. ***/!!!,
        TO_DATE('01-12-2020', 'DD-MM-YYYY') !!!RESOLVE EWI!!! /*** SSC-EWI-TD0025 - OUTPUT FORMAT 'dd-mm-yyyy' NOT SUPPORTED. ***/!!!
       FROM
        SAMPLE_TABLE;
    
    Copy

    建议

    • 验证转换后的代码的功能是否与源代码相同。

    • 如需更多帮助,请通过以下方式联系我们的支持团队:snowconvert-support@snowflake.com

    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) COLLATE 'en-cs' FORMAT 'X(50)' !!!RESOLVE EWI!!! /*** SSC-EWI-TD0040 - FORMAT IN TABLE T_2040 NOT SUPPORTED ***/!!!,
        C2 VARCHAR(255) COLLATE 'en-cs' FORMAT 'X(75)' !!!RESOLVE EWI!!! /*** SSC-EWI-TD0040 - FORMAT IN TABLE T_2040 NOT SUPPORTED ***/!!!
    )
    COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "teradata",  "convertedOn": "06/17/2024" }}'
    ;
    
    Copy

    建议

    命令一起使用的文件格式。
语言: 中文