人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

【エスパー急募】
どう質問したらいいのかもわからないくらいわかりません。
自分が何をやってるのかもよくわかりません。

『ASP VBS SQL SQLServer』
こんな単語が出てくる本を読んでます。

私のやりたいことがわかって解決方法もわかるエスパー様をお待ちしております。
----------
サーバー名:サーバー1
DB名:DB1
TABLE名:社員情報
フィールド名:社員番号,社員名

サーバー名:サーバー2
DB名:DB2
TABLE名:部門情報
フィールド名:社員番号,部門名

これを社員番号でつないで、社員番号、社員名、部門名を表示したいです。
社員番号がDB1にしかなかった場合も、社員番号と社員名は表示、部門名に "登録無" など文字列を表示させたいです。

Accessであれば、ひとつのファイルにリンクテーブルを貼れば簡単にできるのですが、
vbsではどうしたらよいでしょうか。考え方を教えてください。

画像のようなイメージなんですが、もちろん他の方法でもかまいません。
実際には4つのサーバー&データベースをまたがってます。
画像のSQLがINNER JOINになってますが、LEFT JOINですね。

※ どこかのサーバーなどに新しくDBを作ることもできません。

1194500562
●拡大する

●質問者: panana
●カテゴリ:ウェブ制作
✍キーワード:access ASP dB DB2 SQL
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● degucho
●30ポイント

メインのサーバ上にリンクサーバを作成してください

(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あたりを駆使するしかないでしょうか…。

とりあえず教えていただいたリンク先を読んでみます。


2 ● daigakuinsei
●15ポイント

DBが別でサーバもさわれないとすると、

SQL一発だと無理かと思います。

DB1のデータをSELECTしたのを元にループをまわして、

DB2をSELECT(DB1のデータをWHERE文に書いて)

するしかないかと・・・

◎質問者からの返答

回答ありがとうございます。


>SQL一発だと無理かと思います。

ですよね。


>DB1のデータをSELECTしたのを元にループをまわして、

>DB2をSELECT(DB1のデータをWHERE文に書いて)

この辺の考え方を、もう少し詳しく書いていただくことはできますか?


とはいえちょっとリンクサーバーというものに興味を持ったのですがイマイチよくわからないです。

一応調べ続けているんですけどね。


3 ● daigakuinsei
●35ポイント ベストアンサー

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やら駆使したコードじゃないとダメなのか、

確認というか交渉をしてみようと思います。

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

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ