SQLServerで実行されたSQLやストアドをキャプチャする方法

##はじめに
- クライアント：Windowsアプリ
- サーバ：SQLServer

といった構成のシステムを約7年ほどやってきたのですが、
年月経ち、プロジェクトに人の入れ替え等が発生すると、
仕様書が更新されておらず、ソースから仕様を解析するということ、
エンジニアのみなさんならご経験があるかと思います。。。

私が仕様解析で一番苦労したのが画面とデータの解析でしたが、
その際に役立ったツールが、今回紹介する「SQLServerProfiler」というツールになります。

自前でサーバを立てず、クラウドを使用する風潮の昨今、
需要は少ないかもしれませんが、本記事が、
自分と同じ苦労をされているエンジニアの皆さんの助けとなれば幸いです。

##環境説明

環境は以下となります。

- Windows10 64bit
- Visual Studio 2017 Community
- .NET Framework 4.6.1
- SQL Server 2017 Developer

SQLServer2017では、Developerというエディションが出ており、
統合環境である「SQLServerManagementStudio」の機能が
無料かつ無制限で使えるようです。

インストーラーは[ここ](https://www.microsoft.com/ja-jp/sql-server/sql-server-downloads)から入手できます。
余裕あったら、SQLServer2017のインストール手順記事も作成しようと思いますが、
今回は上記環境が用意されている状態を前提に進めさせていただきます。

また、本記事の記載している手順で試せるよう、
githubにクエリおよびソースをを格納していますので、
あわせて確認いただけると幸いです。
https://github.com/zakizaki-ri9/SQLServerProfilerSample

###SQLServer

「SQL Server Management Studio」を起動してください。
ログイン先のサーバーは`localhost` 、ユーザーは`sa` で問題ありません。

「オブジェクトエクスプローラー」を右クリック、
`SampleDB`というデータベースを新規作成します。
（オプションなど、細かい設定は不要です。）
![21.png](https://qiita-image-store.s3.amazonaws.com/0/140704/03b78dfb-0176-614a-7a94-186dfe815f9a.png)

以下クエリを実行し、テーブルと初期データを設定します。

```01_create_table.sql
use SampleDB

if exists(select obj.* from sys.objects as obj where obj.name = N'SampleTable')
begin
	drop table SampleTable
end

create table SampleTable
(
	id			int
,	sample_name	nvarchar(max)
,	option_a	nvarchar(max)
)

insert into SampleTable select 1, N'AAA', N''
insert into SampleTable select 2, N'BBB', N'a'
insert into SampleTable select 3, N'CCC', N''
insert into SampleTable select 4, N'AAA', N'a'
```

以下クエリを実行し、検証用のストアドプロシージャを登録します。

```02_create_procedure.sql
USE SampleDB

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

DROP PROCEDURE GetSampleTable
GO

CREATE PROCEDURE GetSampleTable
	@sample_name	NVARCHAR(MAX) = null
,	@option_a		NVARCHAR(MAX) = null
AS
BEGIN
	SET NOCOUNT ON;

	SELECT * FROM SampleTable WHERE
		(@sample_name IS NULL OR sample_name = @sample_name) AND
		(@option_a IS NULL OR option_a = @option_a)
END
GO
```

###Windowsアプリ
githubから[SqlServerProfilerSample](https://github.com/zakizaki-ri9/SQLServerProfilerSample)をダウンロードし、
Visual Studio 2017から`SQLServerProfilerSample.sln`を開いてください。

ご自身の環境にあわせて`Form1.cs/CreateConnection()`に定義されているSQLServerへのログイン情報を変更してください。

```Form1.cs
        private string CreateConnectionString()
        {
            // 接続文字列生成
            var conStrBuilder = new SqlConnectionStringBuilder()
            {
                DataSource = "localhost",
                InitialCatalog = "SampleDB",
                UserID = "sa",
                Password = "pass"
            };
            return conStrBuilder.ToString();
        }
```

Debug実行し、以下のWindowが起動すれば準備OKです。
![22.png](https://qiita-image-store.s3.amazonaws.com/0/140704/99c1056c-856e-4fd3-a93b-aec72769323d.png)


##SQLServerProfilerを試す

では実際にSQLServerProfilerを試していきたいと思います。

###SQLServerProfilerの設定`

SQLServerManegementStudioから、
「ツール」→「SQLServerプロファイラー」を起動してください。

![23.png](https://qiita-image-store.s3.amazonaws.com/0/140704/0d559e69-b912-c935-23fa-38798b17983e.png)

SQLServerManegementStudioを起動した時同様、ログインが求められます。
SQLServerManegementStudioログイン時と同じ情報を入力し、ログインしてください。

![24.png](https://qiita-image-store.s3.amazonaws.com/0/140704/837cd050-d684-d291-65fa-c32402f3d353.png)

以下の画面が表示されますので、タブ「イベントの選択」を選択してください。

![25.png](https://qiita-image-store.s3.amazonaws.com/0/140704/02b7af15-2b2f-ae15-241c-677ae45856c5.png)

タブ「イベントの選択」では、
ログオンしたサーバーで発生する様々なイベントをキャプチャするための
条件を指定することが可能です。

今回は、ストアドプロシージャとSQL発行のみをキャプチャしますので、
「RPC:Completed、SQL:BatchCompleted」以外のチェックは外します。

![26.png](https://qiita-image-store.s3.amazonaws.com/0/140704/6c1a1f55-2f1c-d934-f525-9076a067af8a.png)

では、「実行」ボタンをクリックします。
クリック後、即キャプチャが始まってしまいますので、
「一時停止」ボタンをクリックし、以下赤枠の状態にします。

![27.png](https://qiita-image-store.s3.amazonaws.com/0/140704/ee4496e4-2ff2-ed3e-6d94-7cfad8bb9156.png)

###キャプチャ実行

それでは、キャプチャを実行していきます。
先ほどのWindowsアプリを起動します。

SQLServerProfilerの「再生」ボタンをクリックし、
Windowsアプリのボタンを適当にぽちぽちクリック、
その後、SQLServerProfilerの「一時停止」ボタンをクリックしてください。

![28.png](https://qiita-image-store.s3.amazonaws.com/0/140704/5809e152-3611-cf00-56ec-1988dbf66665.png)

本記事作成時は、Windowsアプリからストアド「sample_〜」ボタン、
SQL「option〜」ボタンをクリックしています。
すると、SQLServerProfilerで以下のようなキャプチャが取れています。
青枠はストアド、赤枠はSQL発行時のキャプチャになります。

![29.png](https://qiita-image-store.s3.amazonaws.com/0/140704/2ba774aa-52f9-c984-dde2-fa1cfe08781f.png)

青枠と赤枠の行を`Ctrl+左クリック`で選択すると、
SQLServerに対して実行されたクエリが以下赤枠のように表示されます。

![30.png](https://qiita-image-store.s3.amazonaws.com/0/140704/2f2acc3a-f650-af68-37ea-32fdc5a75260.png)

以上です。お疲れ様でした。

##おわりに

他にもイベントやフィルタの設定を行うことで、
様々なキャプチャを行うことができます。

今回用意したWindowsアプリでは、ストアド・SQL発行のパターンでしたが、
EntityFramework等のORマッパーを通じてのSQL発行もキャプチャ可能なはずですので、
ソース解析といったシーンだけでなく、動作確認時等のシーンでもご活用いただければ幸いです。

また、今回初投稿でしたが、いかがだったでしょうか。
（ちょっと内容が冗長かな・・・というのが自分の正直な感想ですw）

内容等お気づきの点がありましたら、ご指摘いただけると大変助かります。