更新时间:2023-03-17 GMT+08:00

DSC约束和限制

DSC的约束和限制如下:

通用

  • DSC仅用于语法迁移,不支持数据迁移。
  • 如果在将IN/NOT IN操作符转换为EXISTS/NOT EXISTS时,子查询的SELECT子句包含aggregate函数,则迁移的脚本可能发生问题。

Teradata

  • DSC无法区分SQL语句中的mod是否是关键字,当mod并非关键字时也会被替换为%。

    例如:DSC将SQL语句中的mod字符串迁移为%。

    1
    2
    3
    SELECT sal 
     FROM employee 
     WHERE name LIKE 'mod (%';
    

    该查询转换如下:

    1
    2
    3
    SELECT sal 
     FROM employee 
     WHERE name LIKE 'mod (%';
    
  • 如果含有FORMAT参数的case语句未用半角括号“()”括起来,该语句不会处理。
    例如:
    1
    case when column1='0' then column1='value' end (FORMAT 'YYYYMMDD')as alias1
    

    在该示例中,case when column1="0", column1="value" end未用半角括号括起,因此不会处理该语句。

  • 如果Teradata查询中同时使用SELECT *和QUALIFY子句,迁移的查询会为QUALIFY子句多返回一列。

    例如:

    Teradata查询

    1
    2
    3
    4
    SELECT * FROM dwQErrDtl_mc.C03_CORP_TIME_DPSIT_ACCT
    WHERE 1 = 1
    AND Data_Dt = CAST( '20150801' AS DATE FORMAT 'YYYYMMDD' )
    QUALIFY ROW_NUMBER( ) OVER( PARTITION BY Agt_Num, Agt_Modif_Num ORDER BY NULL ) = 1;
    

    迁移后的查询

    1
    2
    3
    4
    5
    6
    7
    SELECT * FROM (
    SELECT *, ROW_NUMBER( ) OVER( PARTITION BY Agt_Num, Agt_Modif_Num ORDER BY NULL ) AS ROW_NUM1
    FROM dwQErrDtl_mc.C03_CORP_TIME_DPSIT_ACCT
    WHERE 1 = 1
    AND Data_Dt = CAST( '20150801' AS DATE )
    ) Q1
    WHERE Q1.ROW_NUM1 = 1;
    

    在迁移后的查询中,ROW_NUMBER( ) OVER( PARTITION BY Agt_Num ,Agt_Modif_Num ORDER BY NULL ) AS ROW_NUM1列为额外返回的一列。

  • 子查询或函数内不支持对表的命名引用。
    例如,如果输入的查询包含表名(例如foo),迁移工具不会将基于该表命名的引用从子查询(foo.fooid)中迁移到该表中,或从调用该子查询的函数(getfoo(foo.fooid))中迁移到该表中。
    1
    2
    3
    4
    5
    6
    SELECT * FROM foo
     WHERE foosubid IN (
                         SELECT foosubid
                           FROM getfoo(foo.fooid) z
                          WHERE z.fooid = foo.fooid
                          );
    

Oracle

  • 在如下场景中不处理ROWID:
    1
    SELECT empno,ename ,d.deptno,d.rowid  FROM ( SELECT * FROM employees where deptno is not null) e  , dept d WHERE d.deptno = e.deptno;
    
  • 窗口函数(RANK,ROW_NUMBER)中的aggregate在字段列表中不可用。

    例如:

    1
    2
    3
    4
    5
    6
    7
    8
    SELECT
          TIME, Region, ROW_NUMBER ( ) OVER (ORDER BY SUM (profit) DESC) AS rownumber
            , GROUPING (TIME) AS T
            , GROUPING (Region) AS R
        FROM Sales GROUP BY
            CUBE (TIME, Region)
        ORDER BY
            TIME, Region;
    
  • 如果在SELECT语句中指定了星号(*),并且未指定VALUES子句,则INSERT FIRST或INSERT ALL查询的迁移将无法正常运行。
  • DSC只支持在WHERE子句的末尾指定ROWNUM条件。
    例如:
    1
    2
    3
    4
    SELECT ROWNUM, ename,empid
    FROM employees
    WHERE empid = 10 AND deptno = 10 AND ROWNUM < 3
    ORDER BY ename;
    
  • 该工具不支持在UPDATE子句中使用ROWNUM函数。

    例如:

    1
    2
    UPDATE tableName SET empno = ROWNUM
       where column = "value";
    
  • 该工具不支持INDEX子句中基于列表分区的功能。

    例如:

    1
    2
    3
    4
    5
    6
    7
    8
    CREATE TABLE sales(acct_no NUMBER(5)                 
         ORGANIZATION INDEX
                 INCLUDING acct_no
                 OVERFLOW TABLESPACE example
         PARTITION BY LIST (acct_no)
                (PARTITION VALUES (1)
         PARTITION VALUES (DEFAULT)
                       TABLESPACE example);
    
  • DSC不支持没有表名或表别名的JOIN条件。
  • 存储过程和函数必须以“/”结尾。