# Salesforce Marketing Cloud V2 Export Integration Using CLI

Treasure CLIを使用してクエリを実行し、出力結果をSalesforce Marketing Cloudに書き込むことができます。

## Treasure CLIでクエリを実行する

**Asynchronous API**と**Legacy package**を使用した例


```bash
td query \
  -d database_name \
  -r '{
    "type": "salesforce_marketing_cloud",
    "client_id": "Th1s1s4n3x4mpl3Cl13nt1ds",
    "client_secret": "Th1s1s4F4k3dCl13ntS3cr3t",
    "auth_type": "v2",
    "de_name": "data_extension_name",
    "async": true,
    "records_per_batch": 32000
  }' \
  "SELECT primary_key, mytext, myinteger, mydecimal, myphone, myemail, mydate, mylocale, myboolean = 1 AS myboolean FROM my_1_million" \
  -T presto
```

- `database_name`: クエリのソーステーブルを格納するTreasure Dataデータベース。
- `client_id`, `client_secret`: Salesforce Marketing Cloud API認証情報。
- `de_name`: Salesforce Marketing Cloudのターゲット Data Extension 名。
- `async`: 非同期APIエクスポートを使用する場合は `true` に設定します。
- `records_per_batch`: バッチリクエストあたりの最大行数。
- `-T presto`: Prestoエンジンでクエリを実行します（必要に応じてHiveなどに切り替えます）。
- 最後のSQL文: エクスポートする列に合わせて `SELECT` 句を調整します。


**Asynchronous API**と**Enhanced package**を使用した例


```bash
td query \
  -d database_name \
  -r '{
    "type": "salesforce_marketing_cloud_v2",
    "client_id": "Th1s1s4n3x4mpl3Cl13nt1ds",
    "client_secret": "Th1s1s4F4k3dCl13ntS3cr3t",
    "auth_type": "v2",
    "auth_uri": "https://th1s1sf4k3d1nst4nc3h0st.auth.marketingcloudapis.com/",
    "de_name": "data_extension_name",
    "async": true,
    "records_per_batch": 32000
  }' \
  "SELECT primary_key, mytext, myinteger, mydecimal, myphone, myemail, mydate, mylocale, myboolean = 1 AS myboolean FROM my_1_million" \
  -T presto
```

- `type`: Enhanced packageには `salesforce_marketing_cloud_v2` を使用します。
- `auth_uri`: SFMCインスタンスのベース認証エンドポイント（パッケージ設定で確認できます）。
- 残りのパラメータはLegacyの例と同じで、ターゲット Data Extension とクエリ出力に一致させる必要があります。


**Synchronous API**と**Legacy package**を使用した例


```bash
td query \
  -d database_name \
  -r '{
    "type": "salesforce_marketing_cloud",
    "client_id": "Th1s1s4n3x4mpl3Cl13nt1ds",
    "client_secret": "Th1s1s4F4k3dCl13ntS3cr3t",
    "auth_type": "v1",
    "de_name": "data_extension_name",
    "async": false,
    "continue_on_failure": true
  }' \
  "SELECT primary_key, mytext, myinteger, mydecimal, myphone, myemail, mydate, mylocale, myboolean = 1 AS myboolean FROM my_1_million" \
  -T presto
```

- `auth_type`: レガシーSOAP認証フローを使用する場合は `v1` に設定します。
- `async`: 同期APIに切り替えるには `false` に設定します。
- `continue_on_failure`: ジョブが失敗した行をスキップして処理を続行できるようにします。


**Synchronous API**と**Enhanced package**を使用した例


```bash
td query \
  -d database_name \
  -r '{
    "type": "salesforce_marketing_cloud_v2",
    "client_id": "Th1s1s4n3x4mpl3Cl13nt1ds",
    "client_secret": "Th1s1s4F4k3dCl13ntS3cr3t",
    "auth_type": "v2",
    "auth_uri": "https://th1s1sf4k3d1nst4nc3h0st.auth.marketingcloudapis.com/",
    "de_name": "data_extension_name",
    "async": false,
    "continue_on_failure": true
  }' \
  "SELECT primary_key, mytext, myinteger, mydecimal, myphone, myemail, mydate, mylocale, myboolean = 1 AS myboolean FROM my_1_million" \
  -T presto
```

- `auth_type`: Enhanced REST APIで認証するには `v2` のままにします。
- `async`: エクスポートを同期的に実行するには `false` に設定します。
- `continue_on_failure`: 個々の行が失敗した場合でもエクスポートを続行できるようにします。


**Synchronous API**と**Enhanced package**を使用し、存在しない場合に新しい**Sendable data extension**を作成する例


```bash
td query \
  -d database_name \
  -r '{
    "type": "salesforce_marketing_cloud_v2",
    "client_id": "Th1s1s4n3x4mpl3Cl13nt1ds",
    "client_secret": "Th1s1s4F4k3dCl13ntS3cr3t",
    "auth_type": "v2",
    "auth_uri": "https://th1s1sf4k3d1nst4nc3h0st.auth.marketingcloudapis.com/",
    "de_name": "data_extension_name",
    "create_new_de": true,
    "primary_column": "primary_key",
    "column_options": "col1:TEXT(100);col2:NUMBER;col3:DECIMAL(18,2);col4:DATE",
    "is_sendable": true,
    "sendable_column": "mytext",
    "sendable_rule": "Subscriber Key",
    "async": false,
    "continue_on_failure": true
  }' \
  "SELECT primary_key, mytext, myinteger, mydecimal, myphone, myemail, mydate, mylocale, myboolean = 1 AS myboolean FROM my_1_million" \
  -T presto
```

- `create_new_de`: Data Extensionが存在しない場合に作成します。
- `primary_column`: 新しい Data Extension のプライマリキーフィールドを設定します。
- `column_options`: 新しい Data Extension の各列のデータ型を指定します。
- `is_sendable`: Data Extensionをsendableとして作成します。
- `sendable_column`: sendable属性として使用される列。
- `sendable_rule`: sendable列とペアになるSubscriber属性。


**Enhanced package**を使用し、**行ベースのリテンション**を設定して新しいData Extensionを作成する例


```bash
td query \
  -d database_name \
  -r '{
    "type": "salesforce_marketing_cloud_v2",
    "client_id": "Th1s1s4n3x4mpl3Cl13nt1ds",
    "client_secret": "Th1s1s4F4k3dCl13ntS3cr3t",
    "auth_type": "v2",
    "auth_uri": "https://th1s1sf4k3d1nst4nc3h0st.auth.marketingcloudapis.com/",
    "de_name": "data_extension_name",
    "create_new_de": true,
    "primary_column": "primary_key",
    "enable_row_based_retention": true,
    "retention_period_days": 30
  }' \
  "SELECT primary_key, mytext FROM my_table" \
  -T presto
```

- `enable_row_based_retention`: 新しいData Extensionで行ベースのリテンションを有効にするには `true` に設定します。
- `retention_period_days`: 各行を保持する日数。`enable_row_based_retention` が `true` の場合は必須です。


**特定のフォルダにdata extensionをエクスポートする例**


```bash
td query \
-d database_name \
-r '{
      "type": "salesforce_marketing_cloud_v2",
      "client_id": "Th1s1s4n3x4mpl3Cl13nt1ds",
      "client_secret": "Th1s1s4F4k3dCl13ntS3cr3t",
      "auth_type": "v2",
      "auth_uri": "https://th1s1sf4k3d1nst4nc3h0st.auth.marketingcloudapis.com/",
      "folder_path": "/Data Extensions/FolderPath2/FolderPath3/FolderPath3",
      "create_folder_if_not_exists": true,
      "de_name": "data_extension_name",
      "create_new_de": true,
      "primary_column": "primary_key",
      "is_sendable": true,
      "sendable_column": "mytext",
      "sendable_rule": "Subscriber Key",
      "async": false,
      "continue_on_failure": true
  }' \
"SELECT primary_key, mytext, myinteger, mydecimal, myphone, myemail, mydate, mylocale, myboolean = 1 AS myboolean FROM my_1_million" \
-T presto
```

- `folder_path`: Salesforce Marketing Cloud内の宛先フォルダパス。
- `create_folder_if_not_exists`: フォルダ階層が存在しない場合にオンデマンドで作成します。


## クエリ結果とData Extension列名のマッピング

クエリ結果と Data Extension 列の間でマッピングするために、クエリで **as** キーワードを使用できます。

**例1:**

サブスクライバー情報を含む以下の Data Extension があるとします:

name: de_1 Columns: primary_key, cust_email, cust_first_name, cust_last_name, cust_phone_number

ユーザーアカウント情報を含む以下のテーブルがあるとします:

name: account_table

Columns: id, login_id, first_name, last_name, contact_number

テーブルと Data Extension の間でマッピングするために、**as** キーワードを使用した以下のクエリを使用できます。


```sql
SELECT
  id AS primary_key,
  login_id AS cust_email,
  first_name AS cust_first_name,
  last_name AS cust_last_name,
  contact_number AS cust_phone_number
FROM account_table;
```

**例2:**

電話番号（10桁の数字）を含むデータをアップロードする場合、'0'で始まる電話番号によるエラーを回避するために、以下のクエリを使用して電話番号をSTRINGとしてキャストすることもできます


```sql
SELECT
  primary,
  text,
  CAST(number AS VARCHAR) AS number
FROM table_name
WHERE type = 'SUCCESS';
```