- PR -

SQLServerのジョブについて

1
投稿者投稿内容
osamu
ベテラン
会議室デビュー日: 2004/03/22
投稿数: 67
投稿日時: 2005-08-19 17:12
お世話になります。
かなり初歩的な質問なのですが・・・。

SQLServer2000のSQLServerエージェントのジョブで
決まった時間に、Aという名前のテーブルのBという列が「1」になっている
データを「0」に更新した上で、更新したデータのCという列の値を
メールで知らせるようにしたいのですが、できますでしょうか?
TLC
大ベテラン
会議室デビュー日: 2005/05/31
投稿数: 152
お住まい・勤務地: 東京都
投稿日時: 2005-08-19 18:04
引用:

osamuさんの書き込み (2005-08-19 17:12) より:

SQLServer2000のSQLServerエージェントのジョブで
決まった時間に、Aという名前のテーブルのBという列が「1」になっている
データを「0」に更新した上で、更新したデータのCという列の値を
メールで知らせるようにしたい



お疲れ様です。

端的に回答いたしますと,
可能です。

「1」→「0」のアップデートは,T-SQL スクリプトジョブステップで実現,
メール送信は「xp_SendMail」が利用できるように SQL Server を構成することで可能です。

更新し終わった段階で,更新された行の「C」を読み取る,と考えてしまうと,
ジョブステップを組むときに悩んでしまうかもしれないですが,

・ActiveX スクリプトタスクで VB ライクにコードを書く
・ジョブステップの実行順を工夫して対応する

などすれば,実現できると思います。
がんばってください。

----------
TimberLandChapel
http://blogs.timberlandchapel.com/blogs/timberlandchapel/
osamu
ベテラン
会議室デビュー日: 2004/03/22
投稿数: 67
投稿日時: 2005-08-19 19:32
TLC様、ご返答ありがとうございます。
>ActiveX スクリプトタスクで VB ライクにコードを書く
・・・というところまではわかっていたのですが、

ジョブステップを考えたとき・・・
1、Select文で更新対象のデータを抽出
2、抽出したデータをメール送信
3、Update文で更新

といった流れを考えました。
1と3についてはSQLを実行するだけなので問題ありませんが
2がどう実現すればよいかわかりません。
1で抽出されたデータをどのようにして、2に受け渡すのか、というところです。
メール送信そのものはできます。
TLC
大ベテラン
会議室デビュー日: 2005/05/31
投稿数: 152
お住まい・勤務地: 東京都
投稿日時: 2005-08-20 19:40
引用:

osamuさんの書き込み (2005-08-19 19:32) より:

2がどう実現すればよいかわかりません。
1で抽出されたデータをどのようにして、2に受け渡すのか、というところです。




お疲れ様です。
xp_SendMail には @query というパラメータがあります。
詳細は BooksOnline の 「xp_SendMail」 を参照ください。

UPDATE の際の更新異常エラーなどを検知するシナリオも追加すると,より複雑になってしまいますが,
エラーが発生した場合は追加でメールを送信する。
などと簡単に考えてしまえば実現が容易になるのではないでしょうか?

この辺は,要件との相談になりますね。

実際には T-SQL スクリプトステップを細かく分割するより,
一括で作業を行うストアドをキックするなどとしたほうが
メンテナンスがしやすいのではないかと僕は考える派です。

----------
TimberLandChapel
http://blogs.timberlandchapel.com/blogs/timberlandchapel/

[ メッセージ編集済み 編集者: TLC 編集日時 2005-08-20 19:48 ]
osamu
ベテラン
会議室デビュー日: 2004/03/22
投稿数: 67
投稿日時: 2005-08-22 17:27
TLC様
xp_SendMail についての情報ありがとうございました。
調べたところ、xp_SendMail はメーラがOutlookでないといけないみたいですよね?
http://www.sqlpassj.org/bunkakai/begin/report/040129.aspx

そのため、OutlookExpressでも送信可能な「xp_smtp_sendmail」というのを
http://www.sqldev.net/xp/xpsmtp.htm
から入れて、テストしてみたところメール送信自体はできましたが
@queryと同じ働きをする引数が今のところないとのことでした・・・。

そこでストップしてしまっています。
TLC
大ベテラン
会議室デビュー日: 2005/05/31
投稿数: 152
お住まい・勤務地: 東京都
投稿日時: 2005-08-22 18:22
引用:

osamuさんの書き込み (2005-08-22 17:27) より:
xp_SendMail はメーラがOutlookでないといけないみたいですよね?

そのため、OutlookExpressでも送信可能な「xp_smtp_sendmail」というのを
http://www.sqldev.net/xp/xpsmtp.htm
から入れて、テストしてみたところメール送信自体はできましたが
@queryと同じ働きをする引数が今のところないとのことでした・・・。




お疲れ様です。
xp_sendmail は,参照先の堀川さんの記事でも語られていますが,MAPI を利用します。
端的に言うと,Outlook が入っていないと使えない。ということになります。

一方,sqldev さんのところで提供されている xp_smtp_sendmail は

純粋に smtp だけを使って細かな設定をしたメールを送信すること
を提供しています。

しかし,
ここでよく考えてください。

メールの内容に記述されて送信されてくる結果セットの情報も,

 「メールの機能としてはたんなるテキストデータを送っているだけ」

ということです。

小さな結果セットでしたら,メール送信するストアドのローカル変数に
結果セットをテキストに加工したものをストアして,

@message に引き渡せばできます。

これを行うにはカーソル操作が見た目も加工できていいですかね。
カーソルの簡単な使い方は自分のブログでも書いています。
 ↓
http://blogs.timberlandchapel.com/blogs/timberlandchapel/archive/2005/07/15/79.aspx

一方,巨大な結果セットであれば,

1.一端 osql ユーティリティの「-o」オプションを使用して中間ファイルに出力して,
2.それを xp_smtp_sendmail の @attachment に指定することで実現できますね。

いくつかのツールを組み合わせることによっていろいろなことが可能です。
いろいろと試してみるところからはじめてみてください。

----------
TimberLandChapel
http://blogs.timberlandchapel.com/blogs/timberlandchapel/
1

スキルアップ/キャリアアップ(JOB@IT)