概要
ケース概要
SSMA で解析できないエラーの場合に出力される。本 issues が発生した場合には、コード全体が変換されなくなるため、ソース側の修正が必要となる。issue のケース数は複数ある可能性がある。Create Report
を実施することで、SSMA issue を確認することができる。
ケース 1 複数カラムを更新する Update 文 にてカラム名を未指定
CREATE TABLE DEPARTMENTS AS SELECT * FROM HR.DEPARTMENTS;
UPDATE departments A
SET
(
A.DEPARTMENT_ID,
A.department_name
) = (
SELECT
B.DEPARTMENT_ID,
CAST(B.department_name AS VARCHAR2(30))
FROM
HR.departments B
WHERE
B.department_id = A.department_id
)
WHERE
EXISTS (
SELECT
*
FROM
HR.departments B
WHERE
B.department_id = A.department_id
);
Azure SQL Database における対処法
対応方法 1
オラクル DB のソースにて、CAST(B.department_name AS VARCHAR2(30))
の箇所にてカラム名が設定されないため、AS department_name
を追記する。
UPDATE departments A
SET
(
A.DEPARTMENT_ID,
A.department_name
) = (
SELECT
B.DEPARTMENT_ID,
CAST(B.department_name AS VARCHAR2(30)) AS department_name
FROM
departments B
WHERE
B.department_id = A.department_id
)
WHERE
EXISTS (
SELECT
*
FROM
departments B
WHERE
B.department_id = A.department_id
);
SSMA により次のように変換される。
WITH
u$cte AS
(
SELECT B.DEPARTMENT_ID, CAST(B.DEPARTMENT_NAME AS varchar(30)) AS DEPARTMENT_NAME
FROM DEPARTMENTS AS B
)
UPDATE DEPARTMENTS
SET
DEPARTMENT_ID = u$cte.DEPARTMENT_ID,
DEPARTMENT_NAME = u$cte.DEPARTMENT_NAME
FROM DEPARTMENTS AS A
LEFT OUTER JOIN u$cte
ON u$cte.DEPARTMENT_ID = A.DEPARTMENT_ID
WHERE EXISTS
(
SELECT B$2.DEPARTMENT_ID, B$2.DEPARTMENT_NAME, B$2.MANAGER_ID, B$2.LOCATION_ID
FROM DEPARTMENTS AS B$2
WHERE B$2.DEPARTMENT_ID = A.DEPARTMENT_ID
)
GO