Azure Data Factory のメタデータ駆動のコピータスクにて差分読み込み（`DeltaLoad`）時に`CopySourceSettings`列の`sqlReaderQuery`の値を利用する方法


## 概要

Azure Data Factory のメタデータ駆動のコピータスクにて差分読み込み（`DeltaLoad`）時に`CopySourceSettings`列の`sqlReaderQuery`の値を利用する方法を共有します。

全体の読み込み（`FullLoad`）の際には SQL を記述することでき、その値は`CopySourceSettings`列の`sqlReaderQuery`に値がセットされます。この値は差分読み込み（`DeltaLoad`）の場合には値がセットされません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/e3b1abd4-bf4b-d993-f6aa-b802b2490b7e.png)

差分読み込みにおいても同様に SQL を記述できることで利便性が向上するため、その実装方法を記述します。本手順のデメリットとしては、`CopySourceSettings`列の`sqlReaderQuery`の値をセットする必要があることです。


## 実施手順

### 1. Azure SQL Database にてテーブル作成と初期データを登録


```sql
IF  OBJECT_ID(N'dbo.adf_metadata_01', N'U') IS NOT NULL
    DROP TABLE dbo.adf_metadata_01
CREATE TABLE dbo.adf_metadata_01
(
    ID INT IDENTITY(1,1) PRIMARY KEY,
	NAME varchar(10),
    update_timestamp DATETIME
);

INSERT INTO dbo.adf_metadata_01
(
	NAME,
	update_timestamp
)
SELECT 'A' AS NAME,CAST('2024-06-01' AS datetime2) AS update_timestamp
UNION ALL
SELECT 'B' AS NAME,CAST('2024-06-02' AS datetime2) AS update_timestamp
UNION ALL
SELECT 'C' AS NAME,CAST('2024-06-03' AS datetime2) AS update_timestamp
;

SELECT
	*
	FROM
		dbo.adf_metadata_01
```

### 2. Azure Data Factory にて差分読み込みのメタデータ駆動のコピータスクを作成

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/ca475e56-7475-2f08-5f73-e035286c3321.png)


### 3. メイン制御テーブルに登録する SQL にて `CopySourceSettings`列の`sqlReaderQuery`の値を変更後にテーブルとして登録


<修正前>

```json
        "CopySourceSettings": {
            "isolationLevel": "ReadUncommitted",
            "partitionOption": "None",
            "sqlReaderQuery": null,
            "partitionLowerBound": null,
            "partitionUpperBound": null,
            "partitionColumnName": null,
            "partitionNames": null
        },
```

<修正後>

```json
        "CopySourceSettings": {
            "isolationLevel": "ReadUncommitted",
            "partitionOption": "None",
            "sqlReaderQuery": "SELECT ID,NAME FROM [dbo].[adf_metadata_01]",
            "partitionLowerBound": null,
            "partitionUpperBound": null,
            "partitionColumnName": null,
            "partitionNames": null
        },
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/19bf0af8-9e79-ceaf-0865-0dfbbb8729c9.png)

### 4. `MetadataDrivenCopyTask_xxx_BottomLevel`パイプラインにおける`DeltaLoadOneObjectアクティビティ`のクエリの一部を修正

<修正前>

```json
select * from [@{json(item().SourceObjectSettings).schema}].[@{json(item().SourceObjectSettings).table}]
```

<修正後>

```json
@{json(item().CopySourceSettings).sqlReaderQuery}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/99c0572d-1f15-7115-d0e9-b4bfd7c2a16f.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/f994764e-8f64-2091-31b1-1abfd812af28.png)

### 5. Azure Data Factory にてメタデータ駆動のコピータスクを実行後に`DeltaLoadOneObject`アクティビティの`sqlReaderQuery`の値が想定通りであることを確認

```sql
SELECT ID,NAME FROM [dbo].[adf_metadata_01]
    where [update_timestamp] > '2024-06-03T00:00:00'
    and [update_timestamp] <= '2024-06-03T00:00:00
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/6ae9e017-e589-0e4c-0a56-661acd279484.png)