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;
输出代码¶
--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;
建议¶
如需更多支持,请通过以下方式联系我们的支持团队:snowconvert-support@snowflake.com
SSC-EWI-TD0079¶
部分输出代码已被移除,以使示例更清晰、更易于理解。
严重性¶
低
描述¶
出现此警告是因为找不到复制 Normalize 子句功能所需的“Period”列。
示例代码¶
输入代码:¶
SELECT NORMALIZE emp_id, duration2 FROM project;
输出代码¶
!!!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;
建议¶
要解决此警告,请在代码中找到第一个“Period”列并移除对其的所有引用,最初定义的地方除外。然后,将“PeriodColumn”替换为您找到的列的名称。
如需更多帮助,请通过 snowconvert-support@snowflake.com 联系我们
SSC-EWI-TD0008¶
严重性¶
低
描述¶
目前,Snowflake 没有某些字符串比较函数的直接等效项。
使用以下任何一种字符串比较方法时都会出现这个 EWI:jaro、n_gram、LD(Levenshtein 距离)、LDWS(替换后的 Levenshtein 距离)、OSA(最优字符串对齐)、DL(Damerau-Levenshtein)、hamming、LCS(最长公共子序列)、jaccard、cosine 或 soundexcode。
示例代码¶
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;
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;
建议¶
如需更多支持,请通过以下方式联系我们的支持团队:snowconvert-support@snowflake.com
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;
输出代码:¶
!!!RESOLVE EWI!!! /*** SSC-EWI-TD0059 - SNOWFLAKE USER DEFAULT TIME ZONE MAY REQUIRE CONFIGURATION TO MATCH TERADATA VALUE ***/!!!
ALTER SESSION UNSET TIMEZONE;
建议¶
确保将用户的默认时区配置为与原始 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() );
);
);
输出代码:¶
#*** 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()
建议¶
要解决此问题,您可以手动编写 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);
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"}}'
;
建议¶
如需更多支持,请通过 snowconvert-support@snowflake.com 联系我们
SSC-EWI-TD0039¶
严重性¶
中
描述¶
您尝试使用的文件格式与 Snowflake 不兼容。
示例代码¶
输入:¶
SELECT
CAST('01-12-2020' AS DATE FORMAT 'dd-mm-yyyy'),
CAST('01-12-2020' AS DATE FORMAT 'DDDBEEEE');
输出:¶
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 ***/!!!;
建议¶
如需更多支持,请通过以下方式联系我们的支持团队:snowconvert-support@snowflake.com
SSC-EWI-TD0068¶
严重性¶
中
描述¶
Teradata 配置文件允许您设置多个共享参数来控制存储空间和管理密码限制。
Snowflake 通过其云架构管理存储并自动处理所有优化,无需用户端存储配置。此外,Snowflake 强制执行标准密码政策,该策略普遍适用于所有用户,无法自定义。
当检测到 Teradata 配置文件引用并将其转换为 Snowflake 角色引用时,会发生此错误。虽然 Snowflake 中的角色与 Teradata 配置文件最接近,但查询结果可能会有所不同,除非 Teradata 中的配置文件名称与 Snowflake 中的角色名称相匹配。
示例代码¶
输入代码:¶
SELECT PROFILE;
输出代码:¶
SELECT
CURRENT_ROLE() !!!RESOLVE EWI!!! /*** SSC-EWI-TD0068 - SNOWFLAKE DOES NOT SUPPORT PROFILES, REFERENCING ROLE INSTEAD ***/!!!;
建议¶
请勿在查询中使用用户配置文件,因为不支持。如果用户配置文件名称与其角色名称不同,则查询结果可能会有所不同。
如需更多帮助,请通过 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
);
输出:¶
!!!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"}}'
;
建议¶
如需更多支持,请通过以下方式联系我们的支持团队:snowconvert-support@snowflake.com
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);
输出代码:¶
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);
建议¶
验证 JSON 路径的格式是否正确,并且不包含无效字符。
如需更多帮助,请通过 snowconvert-support@snowflake.com 联系我们
SSC-EWI-TD0057¶
严重性¶
低
描述¶
NEW JSON 函数接受字符串或二进制格式的 JSON 数据。当数据为二进制格式时,该函数保持不变,因为 Snowflake 无法解释有关 JSON 对象的二进制格式元数据。更多详细信息,请参阅 NEW JSON 文档 (https://docs.teradata.com/r/C8cVEJ54PO4~YXWXeXGvsA/QpXrJfufgZ4uyeXFz7Rtcg)。
示例代码¶
输入代码¶
SELECT NEW JSON ('160000000268656C6C6F0006000000776F726C640000'xb, BSON);
输出代码¶
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);
建议¶
如需更多支持,请通过以下方式联系我们的支持团队:snowconvert-support@snowflake.com
SSC-EWI-TD0006¶
严重性¶
低
描述¶
FLOAT 数据类型不支持使用 DEFAULT TIME、DEFAULT DATE、DEFAULT CURRENT_DATE、DEFAULT CURRENT_TIME,或 DEFAULT CURRENT_TIMESTAMP 规范的默认值。
示例代码¶
Teradata:¶
CREATE TABLE T_2004
(
-- In the output code all of these columns will be FLOAT type
-- and will include the SSC-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"}}'
;
建议¶
您无需执行任何操作。
如需更多支持,请通过 snowconvert-support@snowflake.com 联系我们
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;
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;
建议¶
如需更多支持,请通过 snowconvert-support@snowflake.com 联系我们
SSC-EWI-TD0053¶
部分代码已被移除,以使示例更清晰、更易于理解。
生成的 Varchar 表示的精度¶
PERIOD_UDF 函数使用 Snowflake 的默认时间戳和时间格式创建时间段的字符串表示形式。默认情况下,时间戳包含三个小数位以保证精度,而时间变量没有小数位。如果您需要调整输出字符串的精度,则有两个选项可供选择。
使用此 PRECISIONDIGITS
参数的三参数版本 PERIOD_UDF此参数接受 0 到 9 之间的整数,并控制结果的分数时间部分的小数位数。虽然 Snowflake 最多支持九位小数,但 Teradata 最多仅支持六位。例如:
调用 |
结果 |
---|---|
|
|
|
|
|
|
设置会话输出的时间格式:使用命令
ALTER SESSION SET TIMESTAMP_NTZ_OUTPUT_FORMAT = <format>
和ALTER SESSION SET TIME_OUTPUT_FORMAT = <format>
修改会话中时间戳和时间的显示方式。
您可以修改 Snowflake 当前会话的默认格式,以指定所需的精度位数。这些更改将影响会话期间对 PERIOD_UDF 的所有后续执行。
示例代码¶
输入代码:¶
create table vacations (
employeeName varchar(50),
duration period(date)
);
insert into vacations values ('Richard', period(date '2021-05-15', date '2021-06-15'));
select end(duration) from vacations;
输出代码:¶
CREATE OR REPLACE TABLE vacations (
employeeName varchar(50),
duration VARCHAR(24) !!!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;
建议¶
由于
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;
输出代码¶
// 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;
未找到条件表达式¶
输入代码:¶
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;
输出代码¶
// 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;
建议¶
如需更多支持,请通过以下方式联系我们的支持团队:snowconvert-support@snowflake.com
SSC-EWI-TD0012¶
严重性¶
低
描述¶
当 SnowConvert 检测到具有 DEFAULT 值的 BINARY 数据类型列时,会出现此警告。由于 Snowflake 不支持 BINARY 列的默认值,因此 SnowConvert 移除了 DEFAULT 规范。
示例代码¶
Teradata:¶
CREATE TABLE TableExample
(
ColumnExample BINARY DEFAULT '00000000'XB NOT NULL
)
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"}}'
;
建议¶
如需更多支持,请通过以下方式联系我们的支持团队:snowconvert-support@snowflake.com
SSC-EWI-TD0003¶
严重性¶
低
描述¶
在 Snowflake 中,Trim 函数(LTRIM、RTRIM
或 TRIM
)仅在移除空格或空白字符时支持排序规则。它们不支持其他字符类型的排序规则。
当 SnowConvert 在排序后的列上遇到 LTRIM
、RTRIM
,或 TRIM
(带有 LEADING
或 TRAILING
选项)函数时,它会自动添加一个 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;
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;
建议¶
为了保持一致的比较行为,使用
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;
输出代码:¶
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;
建议¶
您无需执行任何操作。
如需更多支持,请通过 snowconvert-support@snowflake.com 联系我们
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 '#';
输出代码:¶
// 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";
建议¶
在 Snowflake 中创建标识符时,仅使用有效的 Unicode 字符。
如需更多帮助,请通过 snowconvert-support@snowflake.com 联系我们
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
);
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"}}'
;
建议¶
手动创建 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;
输出代码:¶
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;
建议¶
要替换 Teradata 外部表,您可以使用 Snowflake 外部表。这些表直接从云存储平台(Amazon S3、Google Cloud Storage 或 Microsoft Azure)读取数据。这样您可以像查询数据库表一样查询数据湖文件。外部表支持所有可与 COPY INTO
Snowflake 的 Iceberg 表 提供另一种选择。这些表使用开放格式,并将数据作为 Parquet 文件存储在您自己的云存储中。
标准 Snowflake 表 也可以取代 Teradata 外部表功能。
如需更多帮助,请通过以下方式联系我们:snowconvert-support@snowflake.com
如需更多支持,请通过 snowconvert-support@snowflake.com 联系我们
注意:您可以使用
EVENT TABLE
在 Snowflake 中复制跟踪功能。有关更多信息,请参阅 Snowflake 文档 记录和跟踪。如需更多帮助,请通过 snowconvert-support@snowflake.com 联系我们
如需更多支持,请通过以下方式联系我们的支持团队:snowconvert-support@snowflake.com
手动应用建议的替代方案。
查看 SSC-FDM-TD0033 来了解使用
LAST_QUERY_ID
的限制及其处理方式。如需更多帮助,请通过以下方式联系我们:snowconvert-support@snowflake.com
在 Teradata 中,BYTES 函数 将始终计算末尾零 (https://docs.teradata.com/r/1DcoER_KpnGTfgPinRAFUw/f7V55vW7OB1nU2WltjLxig),因为它使用固定长度的存储。这意味着它返回列的大小而非实际的数据大小。
在 Snowflake 中,LENGTH 函数返回存储数据的实际大小,因为它对二进制类型使用可变长度存储。
BYTES 函数结果分析表明,Snowflake LENGTH 函数已经提供了所需的行为,因此无需修改。
如需更多帮助,请通过 snowconvert-support@snowflake.com 联系我们
如需更多支持,请通过以下方式联系我们的支持团队:snowconvert-support@snowflake.com
如需更多支持,请通过 snowconvert-support@snowflake.com 联系我们
存储数据时,
UPPERCASE
子句将小写字符转换为大写。例如,“aaa”存储为“AAA”。要处理这个问题,您可以将 UPPER 函数添加到所有插入语句中。但是,请注意,您还需要修改任何加载外部数据的 ETL 进程。如需更多帮助,请通过 snowconvert-support@snowflake.com 联系我们
如需更多支持,请通过 snowconvert-support@snowflake.com 联系我们
您可以使用以下两种方法之一向转换工具提供列信息:
将表格规范与 TD_UNPIVOT 调用包含在相同文件中
列出 ON 表达式的 SELECT 查询中的特定列,而不是使用 SELECT* 或仅使用表名
如果您取消透视输入表中的 ALL 列,则可以忽略此问题。但是,如果您仅取消透视某些列,则结果将缺少数据。
如需更多支持,请通过 snowconvert-support@snowflake.com 联系我们
找出可能导致异常的语句并将其封装在代码块中,类似于 Continue Handler 转换引用 中显示的示例。
如需更多帮助,请通过以下方式联系我们的支持团队:snowconvert-support@snowflake.com
D:映射到
DAYOFWEEK
函数。请注意,由于默认设置不同,Teradata 和 Snowflake 的结果可能有所不同。Teradata 使用星期日作为一周的第一天,而 Snowflake 使用星期一。WW:映射到
WEEK
函数。由于不同的周计算政策,结果可能会有所不同。Snowflake 默认使用 ISO 标准(第一周必须包含一月份的至少四天),而 Teradata 将 1 月 1 日视为第一周的开始。TIMESTAMP_LTZ_OUTPUT_FORMAT
TIMESTAMP_NTZ_OUTPUT_FORMAT
TIMESTAMP_TZ_OUTPUT_FORMAT
TIME_OUTPUT_FORMAT
在使用格式函数 (FF) 时,请使用与 Teradata 精度相匹配的 DateTime 类型,或者在格式元素中指定精度以确保行为一致。
对于时区格式,请确保第一个参数的类型为
TIMESTAMP_TZ
以获得一致的结果。请注意,Snowflake 的TIME
数据类型不支持时区信息。将会话参数配置为与 Teradata 的默认值保持一致,以保持一致行为。
如需更多帮助,请通过以下方式联系我们:snowconvert-support@snowflake.com
如需更多支持,请通过 snowconvert-support@snowflake.com 联系我们
Lookahead
Lookbehind
非捕获组
查看每种正则表达式模式,以确定是否需要手动调整。有关 Snowflake 的正则表达式功能和替代选项的更多详细信息,请查看 此处 (https://community.snowflake.com/s/question/0D50Z00007ENLKsSAP/expanded-support-for-regular-expressions-regex)。
如需更多帮助,请通过以下方式联系我们的支持团队:snowconvert-support@snowflake.com
向 SnowConvert 提供代码时,请务必包括表定义。没有它们,您需要再次运行代码。
如需更多帮助,请通过以下方式联系我们:snowconvert-support@snowflake.com
如需更多支持,请通过 snowconvert-support@snowflake.com 联系我们
有关 BTEQ 到 Python 转换的详细信息,请参阅 BTEQ 到 Python 的转换规范。
如需更多支持,请通过以下方式联系我们:snowconvert-support@snowflake.com
如需更多支持,请通过以下方式联系我们的支持团队:snowconvert-support@snowflake.com
如需更多支持,请通过以下方式联系我们的支持团队:snowconvert-support@snowflake.com
检查您的代码中是否存在递归正向别名。EWI 标识了第一个递归别名,但您的代码中可能还有其他需要注意的内容。
如需更多帮助,请通过以下方式联系我们:snowconvert-support@snowflake.com
如需更多支持,请通过以下方式联系我们的支持团队:snowconvert-support@snowflake.com
验证转换后的代码的功能是否与源代码相同。
如需更多帮助,请通过以下方式联系我们的支持团队:snowconvert-support@snowflake.com
如需更多支持,请通过以下方式联系我们的支持团队:snowconvert-support@snowflake.com
SSC-EWI-TD0091¶
为了便于理解,部分输出代码已被移除。
严重性¶
中
描述¶
在 Teradata 脚本中,您可以使用具有以下语法的 CAST 表达式转换数据类型:
<expression> ( <DataType> )
当使用 CAST 与 DATE
或 TIME
转换数据类型时,可能会出现歧义,因为这些关键字还分别用作 CURRENT_DATE
和 CURRENT_TIME
函数。
因此,在检查代码时,如果没有关于需要 CAST 操作的表达式的其他上下文,则很难区分真正的 CAST 操作和仅将 DATE 或 TIME 参数作为输入的函数。
要确定 <expression>
是列还是用户定义函数 (UDF),在转换代码时必须包含相应的 CREATE TABLE
或 CREATE FUNCTION
语句。这提供了有关表达式定义的必要上下文。
例如,让我们来看看下面的 SELECT
语句。当我们遇到 AMBIGUOUS_EXPR
时,如果没有额外的上下文,我们无法确定它代表函数调用还是 DATE
类型转换。但是,我们可以肯定 COL1 (DATE)
是一个类型转换 (CAST) 操作,因为 COL1
是表 TAB
中的一列。
CREATE TABLE TAB (
COL1 VARCHAR(23)
)
SELECT
COL1 (DATE),
AMBIGUOUS_EXPR (DATE)
FROM TAB;
示例代码¶
输入代码:¶
CREATE TABLE TAB (
COL1 VARCHAR(23)
)
SELECT
COL1 (DATE),
AMBIGUOUS_EXPR (DATE)
FROM TAB;
输出代码¶
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;
建议¶
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
)
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"}}'
;
建议¶
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;
输出:¶
CREATE OR REPLACE VIEW SAMPLE_VIEW
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "teradata", "convertedOn": "08/14/2024" }}'
AS
SELECT
!!!RESOLVE EWI!!! /*** SSC-EWI-TD0046 - BUILT-IN REFERENCE TO PROTECTIONTYPE IS NOT SUPPORTED IN SNOWFLAKE ***/!!!
PROTECTIONTYPE FROM
INFORMATION_SCHEMA.DATABASES;
建议¶
SSC-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()));
在 SELECT
或 SETINTOVARIABLE
语句中使用 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;
$$;
手动修复¶
要检索插入、更新或删除的行数,可以使用上述部分替代方案。
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;
$$;
要在 Snowflake 中使用此查询,您需要对其进行修改以使用 Snowflake 的 SELECT INTO VARIABLE 语法。
此外,如果您在使用 RESULT_SCAN(LAST_QUERY_ID())
时发现不正确的结果,请参阅 SSC-FDM-TD0033,了解有关潜在限制及其处理方式的信息。
建议¶
SSC-EWI-TD0051¶
严重性¶
低
描述¶
在处理字节数据类型时,Teradata 和 Snowflake 之间有一个重要的区别:
以下是说明这种差异的示例:
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
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
示例代码:¶
输入代码:¶
create table sampleTable(
byteColumn byte(10),
varbyteColumn varbyte(15)
);
select bytes(byteColumn), bytes(varbyteColumn) from sampleTable;
输出代码:¶
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;
建议¶
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;
输出:¶
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`);
}
$$;
建议¶
SSC-EWI-TD0024¶
严重性¶
低
描述¶
当在存储过程内注释掉的 ABORT
语句中使用 AGGREGATE
函数时,会出现此警告。
示例代码¶
Teradata:¶
REPLACE PROCEDURE ABORT_SAMPLE()
BEGIN
ABORT WHERE SUM(TABLE1.COL1) < 2;
END;
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;
$$;
建议¶
SSC-EWI-TD0010¶
严重性¶
低
描述¶
用于将文本转换为大写字母的 UPPERCASE 列属性在 Snowflake 中不可用。
示例代码¶
Teradata:¶
CREATE TABLE T_2010
(
col1 VARCHAR(1) UPPERCASE
);
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"}}'
;
建议¶
SSC-EWI-TD0041¶
严重性¶
低
描述¶
系统不支持您提供的文件格式。
示例代码¶
输入:¶
SELECT
cast(T_2041.integer_column as integer);
输出:¶
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. ***/!!!;
建议¶
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;
输出代码:¶
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;
建议¶
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;
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;
$$;
建议¶
SSC-EWI-TD0055¶
不再支持此预警问题 (EWI)。请参阅 SSCFDM-TD0029 文档,了解当前信息。
依赖会话参数的格式元素¶
以下 Teradata 格式元素映射到需要特定会话参数设置的 Snowflake 函数。为确保 Teradata 和 Snowflake 之间结果一致,必须配置以下会话参数以匹配您的 Teradata 设置:
要更改会话参数,请使用 ALTER SESSION SET parameter_name = value
命令。有关可用会话参数及其用法的更多详细信息,请访问 此页面。
TO_CHAR 的单参数版本¶
带有单个参数的 TO_CHAR(Datetime)
函数使用会话参数中定义的默认日期和时间格式。这些参数包括:
为确保 Teradata 和 Snowflake 之间的行为一致,请确保上述参数与 Teradata 设置保持一致。
使用 TO_CHAR(Numeric)
将数值转换为字符串时,Snowflake 会自动使用 TM9
或 TME
格式来创建紧凑的字符串表示形式。由于 Teradata 也默认创建紧凑的数字表示形式,因此无需进行额外的格式设置。
示例代码¶
输入代码:¶
select to_char(date '2008-09-13', 'DD/RM/YYYY');
select to_char(date '2010-10-20', 'DS');
select to_char(1255.495, 'SC9999.9999', 'nls_iso_currency = ''EUR''');
select to_char(45620);
输出代码:¶
SELECT
TO_CHAR(date '2008-09-13', 'DD/') || PUBLIC.ROMAN_NUMERALS_MONTH_UDF(date '2008-09-13') || TO_CHAR(date '2008-09-13', '/YYYY') !!!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 ***/!!!;
建议¶
SSC-EWI-TD0082¶
严重性¶
中
描述¶
在 Snowflake 中不能使用带有当前编码参数的 Translate 函数。在转换过程中,此功能将被注释掉。
示例代码¶
输入代码:¶
SELECT Translate('abc' USING KANJISJIS_TO_LATIN);
输出代码¶
SELECT
!!!RESOLVE EWI!!! /*** SSC-EWI-TD0082 - TRANSLATE FUNCTION USING KANJISJIS_TO_LATIN ENCODING IS NOT SUPPORTED ***/!!!
Translate('abc' USING KANJISJIS_TO_LATIN);
建议¶
SSC-EWI-TD0020¶
此警告消息已不再使用。有关当前文档,请参阅 SSC-EWI-0009。
严重性¶
低
描述¶
Snowflake 目前仅支持 POSIX 基本正则表达式语法。高级正则表达式特性不可用。
每当对 REGEX_SUBSTR、REGEX_REPLACE 或 REGEX_INSTR 的函数调用转换为 Snowflake 时,就会出现此警告。它提醒用户,Snowflake 可能不支持某些正则表达式特性。不支持 的重要功能包括:
示例代码¶
Teradata:¶
SELECT REGEXP_SUBSTR('qaqequ','q(?=u)', 1, 1);
Snowflake Scripting:¶
SELECT
!!!RESOLVE EWI!!! /*** SSC-EWI-TD0020 - REGEXP_SUBSTR FUNCTION ONLY SUPPORTS POSIX REGULAR EXPRESSIONS ***/!!!
REGEXP_SUBSTR('qaqequ','q(?=u)', 1, 1);
建议¶
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;
输出代码:¶
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;
建议¶
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
输出:¶
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
建议¶
SSC-EWI-TD0005¶
严重性¶
关键
描述¶
代码已成功转换,但可能无法按预期运行,因为此功能尚未完全实现。
该警告通知用户,使用此语句将产生与原始脚本不同的功能。
示例来源¶
BTEQ 输入代码:¶
.SET SIDETITLES ON
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()
建议¶
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;
输出代码¶
// 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;
建议¶
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';
输出代码¶
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
$$
建议¶
SSC-EWI-TD0001¶
为了便于理解,部分输出代码已被移除。
严重性¶
低
描述¶
当 SnowConvert 识别别名表达式中的递归模式时,会出现此警告。在这种情况下,SnowConvert 无法执行前向别名转换,而这是别名在 Snowflake 中正常运作所必需的。
当两个或多个别名以循环模式相互引用时,就会出现递归别名。这种情况可能直接发生,例如别名 A 引用别名 B,同时别名 B 又引用别名 A,也可能间接发生,即通过多个中间别名传递性地形成循环引用。
示例代码¶
注意: 虽然 Snowflake 通常不支持递归别名,但支持一些基本用例。
注意:Snowflake 通常不支持递归别名。但是,支持一些基本用例,如以下示例所示。
以下代码演示了完成迁移过程后在 Snowflake 中的成功执行:
Teradata:¶
SELECT
COL1 AS COL2,
COL2 AS COL1
FROM
TABLE_EXAMPLE;
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;
下面显示的代码示例将无法正常执行:
Teradata:¶
SELECT
A + B as C,
COL2 + C AS A,
COL3 AS B
FROM
TABLE_EXAMPLE;
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;
建议¶
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;
输出代码¶
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
$$
建议¶
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;
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;
建议¶
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)'
);
输出:¶
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" }}'
;