どう質問したらいいのかもわからないくらいわかりません。
自分が何をやってるのかもよくわかりません。
『ASP VBS SQL SQLServer』
こんな単語が出てくる本を読んでます。
私のやりたいことがわかって解決方法もわかるエスパー様をお待ちしております。
----------
サーバー名:サーバー1
DB名:DB1
TABLE名:社員情報
フィールド名:社員番号,社員名
サーバー名:サーバー2
DB名:DB2
TABLE名:部門情報
フィールド名:社員番号,部門名
これを社員番号でつないで、社員番号、社員名、部門名を表示したいです。
社員番号がDB1にしかなかった場合も、社員番号と社員名は表示、部門名に "登録無" など文字列を表示させたいです。
Accessであれば、ひとつのファイルにリンクテーブルを貼れば簡単にできるのですが、
vbsではどうしたらよいでしょうか。考え方を教えてください。
画像のようなイメージなんですが、もちろん他の方法でもかまいません。
実際には4つのサーバー&データベースをまたがってます。
画像のSQLがINNER JOINになってますが、LEFT JOINですね。
※ どこかのサーバーなどに新しくDBを作ることもできません。
Set RS1 = Server.CreateObject("ADODB.Recordset")
Set RS2 = Server.CreateObject("ADODB.Recordset")
SQL = "SELECT 社員番号, 社員名 FROM 社員情報 ORDER BY 社員番号"
RS1.Open SQL, ObjConn01, 3, 3
Do Until RS1.EOF
SQL = "SELECT 社員番号, 部署名 FROM 部門情報 WHERE 社員番号 = '" & RS1!社員番号 & "'"
RS2.Open SQL, ObjConn02, 3, 3
If Not RS2.EOF Then
Debug.Print RS1!社員番号 & ", " & RS1!社員名 & ", " & RS1!部署名
Else
Debug.Print RS1!社員番号 & ", " & RS1!社員名 & ", 登録無"
EndIf
RS2.Close
RS1.MoveNext
Loop
RS1.Close
こういうことですかね???
VBA手元に無いので、あくまでもイメージですが。
でも、リンクサーバが使えるなら、
絶対そっちのほうがいいです。
全然、速度と負荷が違います。
メインのサーバ上にリンクサーバを作成してください
(Accessのリンクテーブルみたいなものです。コネクションはそこだけにする)
概要;
http://msdn2.microsoft.com/ja-jp/library/ms188279.aspx
テーブル参照方法
http://msdn2.microsoft.com/ja-jp/library/ms190406.aspx
バージョンや実際のODBC接続先が不明ですが、作成はEnterprise ManagerなどのGUIでやるなりsp_addlinkedserverなどのSQLでやるなりしてください
(ネット検索すると出てくると思います)
回答ありがとうございます。
う~ん。
こちらでサーバー内をいじれない場合はどうしたらいいでしょう?
(今あるデータベースのテーブルを見に行くことしかできない)
配列やFor、Whileあたりを駆使するしかないでしょうか…。
とりあえず教えていただいたリンク先を読んでみます。
DBが別でサーバもさわれないとすると、
SQL一発だと無理かと思います。
DB1のデータをSELECTしたのを元にループをまわして、
DB2をSELECT(DB1のデータをWHERE文に書いて)
するしかないかと・・・
回答ありがとうございます。
>SQL一発だと無理かと思います。
ですよね。
>DB1のデータをSELECTしたのを元にループをまわして、
>DB2をSELECT(DB1のデータをWHERE文に書いて)
この辺の考え方を、もう少し詳しく書いていただくことはできますか?
とはいえちょっとリンクサーバーというものに興味を持ったのですがイマイチよくわからないです。
一応調べ続けているんですけどね。
Set RS1 = Server.CreateObject("ADODB.Recordset")
Set RS2 = Server.CreateObject("ADODB.Recordset")
SQL = "SELECT 社員番号, 社員名 FROM 社員情報 ORDER BY 社員番号"
RS1.Open SQL, ObjConn01, 3, 3
Do Until RS1.EOF
SQL = "SELECT 社員番号, 部署名 FROM 部門情報 WHERE 社員番号 = '" & RS1!社員番号 & "'"
RS2.Open SQL, ObjConn02, 3, 3
If Not RS2.EOF Then
Debug.Print RS1!社員番号 & ", " & RS1!社員名 & ", " & RS1!部署名
Else
Debug.Print RS1!社員番号 & ", " & RS1!社員名 & ", 登録無"
EndIf
RS2.Close
RS1.MoveNext
Loop
RS1.Close
こういうことですかね???
VBA手元に無いので、あくまでもイメージですが。
でも、リンクサーバが使えるなら、
絶対そっちのほうがいいです。
全然、速度と負荷が違います。
回答ありがとうございます。
後ほど(遅ければ来週かも…)改めてコメントいたします。
よろしければお付き合いいただければと思います。
取り急ぎお礼まで。 2007-11-08 18:07:39
----------
追記
考え方が大変参考になりました。ありがとうございます。
このままだと「RS1!社員名」このあたりがエラーになるので、
変数を使って処理を考えようと思います。
一度作ってみた上で、耐えられない速度・負荷になるようでしたら、
リンクサーバーも提案してみようと思います。 2007-11-12 10:47:50
----------
さらに追記。
RS1!社員番号 → RS1("社員番号")
RS1!社員名 → RS1("社員番名")
RS1!部署名 → RS1("部署名")
Debug.Print → Response.Write
の変更で動きました。
これを4つのデータベースに増やすと、IFの入れ子がものすごい階層になり、
速度もですが、メンテナンスにも優しくないだろうと思いました。
どうしてもForやらIFやら駆使したコードじゃないとダメなのか、
確認というか交渉をしてみようと思います。
ありがとうございました。
回答ありがとうございます。
後ほど(遅ければ来週かも…)改めてコメントいたします。
よろしければお付き合いいただければと思います。
取り急ぎお礼まで。 2007-11-08 18:07:39
----------
追記
考え方が大変参考になりました。ありがとうございます。
このままだと「RS1!社員名」このあたりがエラーになるので、
変数を使って処理を考えようと思います。
一度作ってみた上で、耐えられない速度・負荷になるようでしたら、
リンクサーバーも提案してみようと思います。 2007-11-12 10:47:50
----------
さらに追記。
RS1!社員番号 → RS1("社員番号")
RS1!社員名 → RS1("社員番名")
RS1!部署名 → RS1("部署名")
Debug.Print → Response.Write
の変更で動きました。
これを4つのデータベースに増やすと、IFの入れ子がものすごい階層になり、
速度もですが、メンテナンスにも優しくないだろうと思いました。
どうしてもForやらIFやら駆使したコードじゃないとダメなのか、
確認というか交渉をしてみようと思います。
ありがとうございました。