以前から何度かタスク処理にてデータを出しているが、新しい要望がある度に、やり方を再確認しているので、その備忘録
ストアドプロシージャを作成
SQL Server Managementで必要なデータを取り出すためのストアドを作成する。
今回は、毎月1日に過去2ヶ月分の契約一覧のデータを出す必要があるのだが、SQL自体は大して難しいモノではない。
気を付けるべき点は、日付けでの絞り込みの部分。
日付データを比較させるにあたっての問題は、月日のつもりが時間まで比較対象になっている点。
DBに保存されている日付データが文字列ならDATETIME型に変換して比較することになる。文字列の日付けをDATETIME方に変換すると時間は00:00:00になる。DATETIME型で保存されている場合は、時間部分を切り捨てて、00:00:00にする必要があるので、一旦文字列に変換して、再度DATETIME型に戻してやる。
時間部分が整ったところで、例えば11月1日~11月30日までのデータが欲しければ、「保存月日」>=11月1日 なおかつ「保存月日」< 12月1日という条件を付けてやればよい
SQL文の作成
ストアドが作成できたら、Windows側のタスクスケジューラーで走らせて、結果をcsvで保存させる。
タスクスケジューラーへの登録はbatファイルだが、そのbatファイルで指定するsqlを書いたsqlファイルを作成する。
use [DB名]
go
DECLARE @startDate char(10),@endDate char(10)
---日付を取得
SET @startDate = CONVERT(CHAR(10),DATEADD(MONTH, -1, GETDATE()),111)
SET @endDate = CONVERT(CHAR(10),GETDATE(),111)
---日にちを1日にセット
SET @startDate = STUFF(@startDate, 9,2,'1')
SET @endDate = STUFF(@endDate, 9,2,'1')
EXEC [ストアド名] @myDate @endDate
日付のパラメータは、ここで作らなくてもストアド内で作ってもよい。
batファイルを作る
OSのタスクスケジューラーで動かすためにbatファイルを作る。
SET YYYYMMDD=%DATE:/=%
SET DD=%YYYYMMDD:~-2%
IF "%DD%"=="01" GOTO SQL
IF "%DD%"=="05" GOTO SQL
IF "%DD%"=="15" GOTO SQL
GOTO END
:SQL
sqlcmd -S [サーバー名\インスタンス名] -U [ログインID] -P [パスワード] -i [sqlファイルのパス] -W -s "," -o [保存先のパス]\%YYYYMMDD%.csv
:END
上記の例では、毎月1日、5日、15日にSQLを走らせて、結果を保存させている。
あとは、タスクスケジューラーに登録するだけ。