• 締切済み

バッチプログラムでSQLSever2008を操作

教えてください。 (1) SQLSever2008内にあるデータベース1のテーブルAのデータを削除 (2) 同じインスタンス内にあるデータベース2のテーブルAのデータを、DB1のテーブルAにコピー (3) (2)の処理が失敗したらロールバック 上記のことを、バッチプログラムで行いたいと思っております。 単にコマンドプロンプトで入力するというのであれば(1)も(2)もできるのですが、 バッチプログラムで行うとなると、どうやっていいのか見当もつきません。 さらに(3)は、(2)でSQLを実行した戻り値も見なければならないと思います。 データベース1のテーブルAとデータベース2のテーブルAはまったく同じ構成です。 自分なりに色々調べてはいるのですがどうしてもわかりません。 もしどなたかご存知の方がいらっしゃったらぜひ教えてください。 どうぞよろしくお願いいたします。

みんなの回答

  • 0909union
  • ベストアンサー率39% (325/818)
回答No.3

すみません。 >どうやっていいのか見当もつきません。 でしたね。 >(3) (2)の処理が失敗したらロールバック これを知っているなら、 http://technet.microsoft.com/ja-jp/library/ms175523(SQL.100).aspx http://technet.microsoft.com/ja-jp/library/ms188929(SQL.100).aspx (前述のページからたどったページ) トランザクションの仕組みは業務用DBSでは必ずあり、やり方はほとんど同じです。 BEGIN (性格には違うが) でトラップをセット。これからの処理がDBSによって無い場合も、 エラーになった場合、自動でロールバックがかかります。エラーになったところより後半は実行されません。エラーになった戻り値を終了番号として、CMDに渡されます。それを判断する。 このやり方が一つ。他は構造化したやり方で、明示的に指定する方法。 BEGIN 1 command BEGIN 2 command などとすると(そこに注意書きがあるので、それに従う事)、その実行単位でのトランザクショントラップになります。 VBやVBS、VBAなではおなじみの on error と言うステートメントと同じ。この辺が上記のサイトのリファレンスをたどっていけば記述されているという事です。つまり、他の言語を学習した事があるかたなら、おなじみのやり方で、構造化できると言う事です。構造化しないで、単純に、エラーコードやえらめーっセージをで判断する方法もあるので、ケースバイケースです。 これは、他のVBからのAPI呼び出しでも同じなので、それぞれ呼び出し側のエラーとラップ方法に依存するやり方もありますよ。と言うこと、CMDのバッチエラー処理は前回提示しましたね。 なのでエラートラップは、設計者しだいで、いかようにもなります。 まとめ、BEGIN・・と言う、エラーとラップを使って構造化する方法と、コマンド実行のエラーステートメントを利用する方法を使う。 VB、VBA、VBSなどのエラートラップによく似ているので、慣れていれば親しみやすい。 予断ですが、ユーザー管理等で、LDAPを使うかRDBMSを使うか、システムの選択をするとき、システムの機能ではエラートラップが構造化している(ロールバックがある)RDBMSを選ぶ理由はそこにある。 ただ、LDAPでも使用している言語なりフレームワークのエラートラップを使えるので、ロールバックと似た事は簡単(オブジェクトのクローン作成)。

  • 0909union
  • ベストアンサー率39% (325/818)
回答No.2

>自分なりに色々調べてはいるのですがどうしてもわかりません 先に述べておきます。 この程度の問題で、人に聞く必要がある方が、このような処理を行う事は、周りの方に大変迷惑をかけます。 また、これから業務で行うとしたら、その業務には向いていません。これからの内容は、人に聞いて解決する事は少なくなってきます。OJTなど直に生のデーターに触れないとわからない部分が必ず出ます。 SQLについて。 http://www.google.co.jp/search?hl=ja&q=sql+delete&lr=lang_ja このうち http://www.near-future.com/sqlserver/04sql_server_delete.html など バッチファイルなど。 http://www.google.co.jp/search?hl=ja&lr=lang_ja&tbs=lr:lang_1ja&&sa=X&ei=gDxwTcO-DIz8vQPhrvG9AQ&ved=0CDIQBSgA&q=SQLServer2008+sqlcmd&spell=1 このうち http://msdn.microsoft.com/ja-jp/library/ms180944.aspx http://okwave.jp/qa/q5507539.html http://msdn.microsoft.com/ja-jp/library/ms191136.aspx このページは本家のリファレンスです http://msdn.microsoft.com/ja-jp/library/ms165702.aspx http://msdn.microsoft.com/ja-jp/library/ms191136.aspx http://technet.microsoft.com/ja-jp/library/ms191136(SQL.100).aspx これでわかるようでないと。 >バッチプログラムで行うとなると、どうやっていいのか見当もつきません 本当ですか? 上記のサイトみてわからないんですか? この程度のサイト1分もかからないで見つけましたが? やっぱり、あきらめた方がいいです。 それでも一応。 バッチファイルとは何かから勉強してください。そこから始めないとわからい方のようですね。 普通バッチファイルとはDOSコマンドを処理順に箇条書きする物です。この言葉が一般化して、「バッチファイル」=スクリプトファイル=自動化、と言うことになっています。 つまり、命令するコマンドを箇条書きにすればいいだけです。SQLファイルなら、SQLを箇条書きに羅列するだけです。 さらに、当然プログラム言語ですので書式が存在します。sqlcmdなら、それに即した書式があり、従う必要があります。 さらに、sqlcmdはWindowsではCMDと言うWindowsのShellで動作させるので、そこでのしきたり(書式)に従う必要がある。 と言う事は、 http://okwave.jp/qa/q5507539.html のようにdos.batとsqlcmd.sqlと言うバッチファイルとSQLファイルを2つ用意する必要がある。書式やり方は、上記サイトにある。 (名前は任意。拡張子はそれぞれ意味があるが、SQLは意味なし) なおエラー処理は、いくつものやり方があり、説明するのは大変です。勉強してください。上記サイトを見てわからないのであれば、これらの業務につく資格がありません。 ヒントだけ、DOSのバッチはエラーレベルと言うのでコマンドの戻り値を取得可能です。 if errorlevel 3 処理1コマンド if errorlevel 2 処理2 sqlcmdでエラーごとにメッセージを変える事ができる。そのエラー内容をDOSで解釈する。 他の方がOracleとの比較がありましたが、ちょっとマイクソフトのやり方をしらないのかも。PL/SQLにあたるのがプロシージャーなどです。PL/SQLと言えば、インタープリター的なスクリプト言語の扱いですが、それがSQL言語と組み合わせて使えるこちに便利さがありますが、sqlcmdも同じです。 いずれにせよ、SQL言語を習う事と、sqlcmdの中で使用できるコマンド郡と書式を習う必要があります。さらにDOSバッチファイルの書式及び使い方を習いましょう。 http://technet.microsoft.com/ja-jp/scriptcenter/ff621418 No1の方のやり方が記載されている本家のサンプルサイトです。大変参考になります(”SQLServer2008 サンプル”で検索しました)

  • nora1962
  • ベストアンサー率60% (431/717)
回答No.1

sqlcmdからのスクリプト入力ではエラー時のハンドリングが難しいみたいですね。 ここのあたりはOracleがうらやましい。 とりあえず、 Dim cn On Error Resume Next Set Cn = CreateObject("ADODB.Connection") cn.connectionstring = "PROVIDER=SQLOLEDB;DATA SOURCE=コンピュータ名\インスタンス名;DATABASE=データベース1;USER ID=<username>;PASSWORD=<strong password>;" cn.BeginTrans cn.execute("delete from テーブルA") if Err.Number <> 0 then Wscript.quit(1) end if cn.execute("insert into テーブルA select * from データベース2.dbo.テーブルA") if Err.Number <> 0 then Wscript.quit(1) end if cn.CommitTrans() cn.close set cn = nothing WScript.Quit(0) という内容をファイルにして cscript /nologo スクリプトファイル ではいけませんか。