- - PR -
osqlのバッチ処理について
1
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2005-10-02 06:53
お世話になります。
OSQLを使い、バッチ処理でSQLserver2000のDBバックアップ を取得するバッチを作成しています。 その際、処理の結果をイベントログへ出力したく、下記の ような内容のバッチを作成したのですが、バックアップは 上手くいくものの、ERRORLEVELによる条件分岐は 「'ERRORLEVEL' の近くに無効な構文があります。」との エラーが発生し上手くいきません。 BACKUP DATABASE コマンドは実は終了コードを返さないコマンドで、 %ERRORLEVEL%に値が渡らないということなのでしょうか? だとしたら、当処理はERRORLEVELによる条件分岐では実現できないのでしょうか? 何卒ご教授の程、よろしくお願いいたします。 ---------以下、バッチファイルの内容です。-------------- OSQL -E GO USE TESTDB GO BACKUP DATABASE TESTDB TO DISK = 'D:\\test.bak' IF %ERRORLEVEL% == 0 GOTO true IF %ERRORLEVEL% == 1 GOTO false :true eventcreate /ID 100 /L APPLICATION /SO Cmd /T Information /D "バックア ップ成功" ECHO 成功 :false eventcreate /ID 101 /L APPLICATION /SO Cmd /T ERROR /D "バックアップ失 敗" ECHO 失敗 ------------------------------------------------------- | ||||
|
投稿日時: 2005-10-02 08:31
お疲れさまです。 まず,何故エラーになってしまうかというと, osql に制御が移っている状態で,DOS コマンドの ERRORLEVEL 変数などは使えないため です。 QUIT して osql から制御を戻せば取得できますが,ERRORLEVEL が取得するのは, osql が起動して〜正常に終了したこと であって, osql の中で実行された SQLバッチの終了コードではありません。 osql の中で実行する BACKUP ステートメントのステータスで条件分岐させるためには T-SQL の構文に従って処理を記述する必要があります。 @@ERROR と IF 〜 BEGIN 〜 END 構文です。 また,イベントログに記録を行うためには,RISERROR ステートメントが使用できます。 RISERROE によって,アドホックメッセージを作成してもよいですし, sp_addmessage で事前定義してもよいと思います。 ただ, BACKUP ステートメントは既定で成否に関するログを SQL ログとアプリケーションログに記録しますよね。 ----- TLC が検証済みのコードはブログにアップしておきます。 まずは,ご自分で実験してみてください。 ---------- TimberLandChapel http://blogs.timberlandchapel.com/blogs/timberlandchapel/ | ||||
|
投稿日時: 2005-10-02 17:01
TLC様、ご回答ありがとうございます。
(前回のDTSのvbs処理の質問の際はお世話になりました。) 教えていただきました内容を元にいろいろと試して みました。そこで、以下のような仕組みを作りました。 (殆ど教えていただいた内容なので恐縮なのですが。。。) バッチを使って、sqlスクリプトを呼ぶ処理です。 --sqlスクリプト呼び出しバッチ----- cd d:\\osql -E -i D:\\BKtest.sql -n ------------------------------- --BKtest.sql(sqlスクリプト)----------------------------------------------------- EXEC sp_addmessage @msgnum = 50001, @severity =1, @msgtext ='ID :%d, NAME:%s Backup success.',@with_log=True,@lang = 'us_english' --lang = 'us_english' を追加しました。 EXEC sp_addmessage @msgnum =50002, @severity =1, @msgtext ='ID :%d, NAME:%s Backup fail.',@with_log=True,@lang = 'us_english' --lang = 'us_english' を追加しました。 USE testDB DECLARE @DBID INT DECLARE @DBNAME NVARCHAR(128) SET @DBID = DB_ID() SET @DBNAME = DB_NAME() BACKUP DATABASE testDB TO DISK = 'D:\\test.bak' IF @@ERROR = 0 BEGIN RAISERROR (50001, 1, 1, @DBID, @DBNAME) END ELSE BEGIN RAISERROR (50002, 1, 1, @DBID, @DBNAME) END GO --------------------------------------------------------------------- この処理を実行すると、一度目は正常に終了するのですが、続けて実行すると バックアップ処理、ログ出力は成功するものの、下記のようなメッセージが 表示されます。 「既存のメッセージに上書きする場合は 'REPLACE' を指定してください。」 オンラインヘルプでREPLACEを調べたのですが、エラーメッセージの置き換え を具体的にどうすればよいのかわかりませんでした。 また、バックアップしたファイルについてですが、処理の度にファイルサイズが 一度目のバックアップファイルの3倍、4倍となってしまうのです。 BACKUPコマンドはファイル上書きだったと思ったのですが、実はデータは既存の ファイルに追加されていくのでしょうか? お手数をおかけして申し訳ありませんが、情報お持ちでしたらご教授の程 よろしくお願いいたします。 | ||||
|
投稿日時: 2005-10-02 17:50
お疲れ様です。 このメッセージは,あらかじめ作成したカスタムエラーメッセージに対して, 2度目のバッチで同じ番号で新たにメッセージを作成しようとしていることで起こっています。 ですので, BACKUP ステートメントの動作とは関連がないんですね。 sp_addmessage は,1度ログ記録するメッセージを作ってしまえば,後は実行する必要がありません。 ですので, ■バッチからは抜いておく必要があります。 バッチには ・バックアップ実行 ・エラー情報の送信 だけを指定すればいいんですね。 もし,バッチの中でエラー情報を毎回定義するようであれば, もう一つの例のアドホックエラーメッセージの手法を使うようにしてください。 ---------- TimberLandChapel http://blogs.timberlandchapel.com/blogs/timberlandchapel/ | ||||
|
投稿日時: 2005-10-02 20:43
お世話になります。
>sp_addmessage は,1度ログ記録するメッセージを作ってしまえば,後は実行する >必要がありません。 >ですので, >■バッチからは抜いておく必要があります。 一度つくってしまえば後は必要ないのですか、ナットクです。 後は自分でなんとかできそうです。 バックアップファイルの上書きの方は WITH INIT をつけて BACKUP DATABASE testDB TO DISK = 'D:\\test.bak' WITH INIT とすることでできました。(BACKUPはデフォルトでは追加型のようですね。) 御忙しいところありがとうございました。 |
1