1194500562 【エスパー急募】

どう質問したらいいのかもわからないくらいわかりません。
自分が何をやってるのかもよくわかりません。

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

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

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

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

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

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

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

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2007/11/13 10:14:34
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:daigakuinsei No.3

回答回数11ベストアンサー獲得回数1

ポイント35pt

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手元に無いので、あくまでもイメージですが。

でも、リンクサーバが使えるなら、

絶対そっちのほうがいいです。

全然、速度と負荷が違います。

id:panana

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

後ほど(遅ければ来週かも…)改めてコメントいたします。

よろしければお付き合いいただければと思います。


取り急ぎお礼まで。 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/13 10:09:08

その他の回答2件)

id:degucho No.1

回答回数281ベストアンサー獲得回数75

ポイント30pt

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

(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でやるなりしてください

(ネット検索すると出てくると思います)

id:panana

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


う~ん。

こちらでサーバー内をいじれない場合はどうしたらいいでしょう?

(今あるデータベースのテーブルを見に行くことしかできない)

配列やFor、Whileあたりを駆使するしかないでしょうか…。

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

2007/11/08 15:54:15
id:daigakuinsei No.2

回答回数11ベストアンサー獲得回数1

ポイント15pt

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

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

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

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

するしかないかと・・・

id:panana

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


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

ですよね。


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

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

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


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

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

2007/11/08 16:59:43
id:daigakuinsei No.3

回答回数11ベストアンサー獲得回数1ここでベストアンサー

ポイント35pt

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手元に無いので、あくまでもイメージですが。

でも、リンクサーバが使えるなら、

絶対そっちのほうがいいです。

全然、速度と負荷が違います。

id:panana

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

後ほど(遅ければ来週かも…)改めてコメントいたします。

よろしければお付き合いいただければと思います。


取り急ぎお礼まで。 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/13 10:09:08
  • id:degucho
    Accessに馴れているのであれば、各サーバへのリンクテーブルを作成した
    MDBをサーバ上に置いて接続はそこだけにするのが一番簡単かもしれません(現状DSNが作成してあるのならAccessのインストールは不要です。)。
    速度はそれなりですが
    <br />
    リンクサーバですが、アドホック接続も可能です
    http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/tsqlref/ts_oa-oz_2be1.asp
    http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/tsqlref/ts_oa-oz_78z8.asp
  • id:panana
    コメントもありがとうございます。

    >各サーバへのリンクテーブルを作成したMDBをサーバ上に置いて接続はそこだけにする
    これが一番手軽な気がします。問題はそういうものを置かせてもらえるかどうかですね。

    回答やコメントで頂いている言葉の意味を調べるところから始めてます…orz

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません