Synapse studioのパイプラインでSQLスクリプトを扱う

## この記事に書いてあること
Synapse Studioでパイプラインを構築する際のTips。
主に「スクリプト」アクティビティと「変数の設定」アクティビティの使い方になります。

## スクリプトアクティビティの出力を利用する
### スクリプトの出力を別のスクリプトで読み込む
スクリプトでちょっとした処理を行い、その結果を別のスクリプトで利用したいというときは以下のように設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3634883/af24ec5f-3663-5fd7-0601-35e9d810db70.png)
ここではScript1とScript2を用意してScript1の出力をそのままScript2で読み込んで出力します。クエリ内容は以下の通りです。
```SQL
-- Script1
select
    1 as result1
    ,2 as result2
;
-- Script2
select
    @{activity('Script1').output.resultSets[0].rows[0].result1} as result
;
```
Script1の出力
```json
{
	"resultSetCount": 1,
	"recordsAffected": 0,
	"resultSets": [
		{
			"rowCount": 1,
			"rows": [
				{
					"result1": 1,
					"result2": 2
				}
			]
		}
	],
	以下略
}
```
Script2の出力
```json
{
	"resultSetCount": 1,
	"recordsAffected": 0,
	"resultSets": [
		{
			"rowCount": 1,
			"rows": [
				{
					"result": 1
				}
			]
		}
	],
	以下略
}
```
出力が複数行にわたる場合はrowsの中に増えていきます。

#### 文字列と数値の違い
先ほどのScript1ではresult1,result2に格納されていたデータは数値でした。
これを文字列に変更するとScript2実行時に以下のようなエラーが発生します。
```SQL
-- Script1
select
    'test1' as result1
    ,'test2' as result2
;

-- Script2
select
    @{activity('Script1').output.resultSets[0].rows[0].result1} as result
;
```
エラー文
```json
{
    "errorCode": "2011",
    "message": "Invalid column name 'test1'.",
    "failureType": "UserError",
    "target": "Script2",
    "details": []
}
```
これはScript2の中で ' ' によって囲われていない文字が列名として認識されていることが原因です。Script2を以下のように変更する必要があります。
```SQL
-- Script2
select
    '@{activity('Script1').output.resultSets[0].rows[0].result1}' as result
;
```
Script2の出力
```json
{
	"resultSetCount": 1,
	"recordsAffected": 0,
	"resultSets": [
		{
			"rowCount": 1,
			"rows": [
				{
					"result": "test1"
				}
			]
		}
	],
	以下略
}
```
### スクリプトの出力を変数に格納する
今度は以下のようにスクリプトの出力を変数に格納して、別のスクリプトでその変数を利用します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3634883/f699e299-bcb8-4970-4f55-6478bdf857c8.png)
Set variable1ではScript1の出力をtestというパイプライン変数に格納しています。

::: note info
ちなみにパイプライン変数に似たものでパイプラインパラメーターというものがあります。パイプラインパラメーターはパイプライン変数と似たような形で使えますがパイプライン実行後に上書きすることができないため、スクリプトの結果を格納できるのはパイプライン変数になります。
:::

```diff_SQL
-- Script1
select
    1 as result1
    ,2 as result2
;
-- Script2
select
+    @{varibles('test')} as result
-    @{activity('Script1').output.resultSets[0].rows[0].result1} as result
;
-- Set variable1
@activity('Script1').output.ResultSets[0].rows[0].result1
```
Script1の実行結果
```json
{
	"resultSetCount": 1,
	"recordsAffected": 0,
	"resultSets": [
		{
			"rowCount": 1,
			"rows": [
				{
					"result1": 1,
					"result2": 2
				}
			]
		}
	],
	以下略
}
```
Script2の実行結果
```json
{
	"resultSetCount": 1,
	"recordsAffected": 0,
	"resultSets": [
		{
			"rowCount": 1,
			"rows": [
				{
					"result": 1
				}
			]
		}
	],
	以下略
}
```
#### 文字列と数値の違い
Script1の出力を文字列にしてみます。
```SQL
select
    'test1' as result1
    ,'test2' as result2
;
-- Script2
select
    @{variables('test')} as result
;
-- Set variable1
@activity('Script1').output.ResultSets[0].rows[0].result1
```
Set variables1に変更はありませんがパイプライン変数の型をintegerからstringに変更します。
Script2でScript1の結果を直接受け取った時と同様のエラーが出ました。
```json
{
    "errorCode": "2011",
    "message": "Invalid column name 'test1'.",
    "failureType": "UserError",
    "target": "Script2",
    "details": []
}
```
ちなみに、set variables1の出力は以下のようになっています。
```json
{
	"name": "test",
	"value": "test1"
}
```

先ほどと同様にScript2で文字列を受け取れるように変更します。
```diff_SQL
-- Script2
select
+    '@{variables('test')}' as result
-    @{variables('test')} as result
;
```
無事にScript2で結果を取得することができました。
```json
{
	"resultSetCount": 1,
	"recordsAffected": 0,
	"resultSets": [
		{
			"rowCount": 1,
			"rows": [
				{
					"result": "test1"
				}
			]
		}
	],
	以下略
}
```
注意しなければならないのは、Set variable1で変数に格納する値が文字列であっても ' ' で囲う必要はないというところです。
例えば以下のように書いてしまうと、`'Script1'`のところでSynax Errorになります。
```SQL
-- set variable1
'@activity('Script1').output.ResultSets[0].rows[0].result1'
```