C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: SQLServerストアド内でDB接続先変更


(過去ログ 107 を表示中)

[トピック内 5 記事 (1 - 5 表示)]  << 0 >>

■63749 / inTopicNo.1)  SQLServerストアド内でDB接続先変更
  
□投稿者/ jinaicho (1回)-(2012/10/05(Fri) 13:58:25)

分類:[データベース全般] 

初めまして、とあるDB上にあるストアドプロシジャーから、他のDBにあるTBLにDELETE文を発行する方法で、
ストアドに引数を与えて動的に対象DBを変更する方法を調べています。

SQLServer2010のストアドプロシジャーにて以下をやりたく
・DB-A、DB-B、DB-Xと3つのDBがある前提
・DB-Xに存在するストアドプロシジャーは指定したTBLに対してDELETEを行う。
 但し、DB-Xに存在するストアドプロシジャーに引数でDB名を与えて、それを受けてDB-X上にあるストアドプロシジャーから
 DB-AやDB-Bに存在するTBLを動的に指定してDELETEを行いたい。

例:DB-X上にあるストアドプロシジャー「PROC_DEL_TBL」に以下のような引数を与えて実行する
  PROC_DEL_TBL 'DB-A'
この場合はDB-Aにある特定のTBLにDELETEを行う。

  PROC_DEL_TBL 'DB-B'
この場合はDB-Bにある特定のTBLにDELETEを行う。

  ※いずれも特定のTBLは同じ名称なので、それはDB-X上にあるストアドプロシジャー「PROC_DEL_TBL」に固定で書く予定


引数で区分を与えて、「PROC_DEL_TBL」内でIF文に分けて処理する方法は成功したのですが、
それだと対象DBが増える度にメンテが必要で、
また、「PROC_DEL_TBL」内でDELETE文を文字列変数に入れて、その際に引数で指定したDB名を使って動的にSQL文字列を変えて、
それをEXECで実行するという方法も成功したのですが、エレガントではないので困っています。
どなたか解決方法ご存じではないでしょうか?

以上、ご回答の程よろしくお願い致します。




引用返信 編集キー/
■63750 / inTopicNo.2)  Re[1]: SQLServerストアド内でDB接続先変更
□投稿者/ shu (81回)-(2012/10/05(Fri) 14:20:25)
No63749 (jinaicho さん) に返信

SQL文字列を渡して動的に実行するには
sp_executesql
ですかね。
引用返信 編集キー/
■63751 / inTopicNo.3)  Re[1]: SQLServerストアド内でDB接続先変更
□投稿者/ COCOE (2回)-(2012/10/05(Fri) 14:33:40)
No63749 (jinaicho さん) に返信

> また、「PROC_DEL_TBL」内でDELETE文を文字列変数に入れて、その際に引数で指定したDB名を使って動的にSQL文字列を変えて、
> それをEXECで実行するという方法も成功したのですが、エレガントではないので困っています。

ストアド単体で実現しようとしたら↑の方法しかないと思います。

呼びだし側で事前の処理が許されるのであれば、
ストアド内の対象テーブルをシノニムで設定しておいて、ストアド呼びだし前に
対象シノニムをDrop→Createで作り直すという手もあります。

引用返信 編集キー/
■63755 / inTopicNo.4)  Re[2]: SQLServerストアド内でDB接続先変更
□投稿者/ jinaicho (3回)-(2012/10/05(Fri) 17:49:26)
No63750 (shu さん) に返信
> ■No63749 (jinaicho さん) に返信
>
> SQL文字列を渡して動的に実行するには
> sp_executesql
> ですかね。

ありがとうございました。

sp_executesqlを使って、OUTPUT変数も文字列で作成し、
それに入った値を本体のSPの変数に戻す方法も試してみました。
上手くは行くのですが、ソースが複雑になってメンテナンス性が悪いので、
それ以外で何か無いかなというところです。。。

引用返信 編集キー/
■63756 / inTopicNo.5)  Re[2]: SQLServerストアド内でDB接続先変更
□投稿者/ jinaicho (4回)-(2012/10/05(Fri) 17:50:24)
No63751 (COCOE さん) に返信
> ■No63749 (jinaicho さん) に返信
>
>>また、「PROC_DEL_TBL」内でDELETE文を文字列変数に入れて、その際に引数で指定したDB名を使って動的にSQL文字列を変えて、
>>それをEXECで実行するという方法も成功したのですが、エレガントではないので困っています。
>
> ストアド単体で実現しようとしたら↑の方法しかないと思います。
>
> 呼びだし側で事前の処理が許されるのであれば、
> ストアド内の対象テーブルをシノニムで設定しておいて、ストアド呼びだし前に
> 対象シノニムをDrop→Createで作り直すという手もあります。
>

ありがとうございました。

シノニムまで使う予定はありません。
おっしゃる通り、ストアド単体だと文字列でEXECするしかないのかもしれませんね。


引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -