こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

DAOでSQLServerに接続し、LeftJoinで別DBのテーブル

DAOでSQLServerに接続し、LeftJoinで別DBのテーブルを参照したい。

いつもお世話になっております。
標題についてなのですが、
VB6.0、SQLServer2008Expressで開発を行なっております。
接続にはDAOを利用しています。

その際に、AというDBのT1というテーブルとBというDBのT2というテーブルのデータを結合して抽出したいのですが、エラーが出てしまいます。
ソースは以下の通りです。

Dim DBR As Database
Dim T_TEST As Recordset

Set DBR = Workspaces(0).OpenDatabase("", False, False,
        "ODBC;Driver={SQL Server};SERVER=hoge;DATABASE=A;UID=sa;PWD=admin")
Set T_TEST = DBR.OpenRecordset("select * from T1 left join B.dbo.T2 on T1.AAA = T2.AAA")

で実行すると、T_TESTをOPENするところで、実行エラー3024が発生します。
エラー内容は「ファイル C:\*******\B.dboが見つかりません」と、ソースが保存されているフォルダにB.dboがありませんといった内容です。
クエリは、ManagementStudioでは問題なく抽出できました。

DBRでAを開いて、Bが開けていないからだとは思うのですが、どのようにすれば複数のDBに存在するテーブルのデータを結合して取得できるでしょうか。
ご教授お願いいたします。

投稿日時 - 2010-09-07 20:11:49

QNo.6165869

すぐに回答ほしいです

質問者が選んだベストアンサー

Aだけで正常終了しましたか。。。

AがよくてBはだめ。ManagementStudioはOKでVB6ではだめ。

構文は間違いなく合っていますので、あとは、B.dboの部分です。
正式な名称は違うと思いますが、正式名に予約語や全角 2 バイト文字や半角カタカナは入ってませんか?
また、Bの所有者はdboですか?でしたらsaで統一してみるとかとか・・・

Bを疑うような部分がでてきましたら、
データベースをもう一個「TestDB」でのような半角英数字だけの名前で作成してそこに同じテーブルを作成し、テーブルAとLeft Joinしてみてください。
これで表示されるのでしたら、Bのデータベース設定に問題ありでしょう・・・

これ以外だと・・・・ごめんなさい。降参です。。。

投稿日時 - 2010-09-08 16:45:19

お礼

何度もありがとうございます。
調べていくと、SQL文をDAOが解釈してSQLServerに投げているから
その解釈の部分を飛ばすように以下のように書き換えると良いという
記事を見つけたので試してみたら、うまく行きました。
サブクエリとかも同じ理由でダメだそうです。
うーん。良く分かりません。。。

OpenRecordset(Query, dbOpenDynaset, dbSQLPassThrough)

dbSQLPassThroughで、SQL文をまんまSQLServerに投げかけるみたいです。

投稿日時 - 2010-09-10 16:28:09

このQ&Aは役に立ちましたか?

6人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.2

ごめんなさい。
エラーが違っていたのは、無駄に[]とAsを付けてしまいました。

Set T_TEST = DBR.OpenRecordSet("Select * From T1 Left Join B.dbo.T2 TEST2 on T1.AAA = TEST2.AAA",dbOpenDynaset, dbSeeChanges)

これでいかないとなると・・・ODBC文ですかね~?
試しにAのT1だけで(Left joinしないで)試してみては?

投稿日時 - 2010-09-08 13:19:47

補足

再度ありがとうございます。
[ ]をどけて試してみると、質問文と同じエラーに戻ってしまいました。
Left Join無しだと正常にデータが取得できます。

投稿日時 - 2010-09-08 15:59:31

ANo.1

当方の環境では問題ありませんでした。
>BRでAを開いて、Bが開けていないからだとは思うのですが
これはSQLServerにAとBのデータベースがあるのでしたら、問題ないと思います。
セキュリティも同じと思いますので・・・

OpenRecordSetの部分がちょっと違ったので、確認します。

Set T_TEST = DBR.OpenRecordSet("Select * From T1 Left Join [B].[dbo].T2 As TEST2 on T1.AAA = TEST2.AAA",dbOpenDynaset, dbSeeChanges)

でOKだったのです・・・

Bの存在 DBのアクセス権 SQLServer上でのDBの存在などなどそちらのチェックが先なのかな?と思います。
的外れならごめんなさい・・・

投稿日時 - 2010-09-07 21:05:25

補足

ご回答ありがとうございます。
Bは同じインスタンスに存在しております。
SQL文を以下のように変更し、optionも同じに指定して再度試してみたのですが、ダメでした…。

select * from T1 left join [B].[dbo].T2 AS T_TEST on T1.AAA = T_TEST.AAA

ですが、エラーメッセージが「From句の構文エラーです」に変わりました。
同じくManagementStudioでは正常に取得できます。

投稿日時 - 2010-09-08 10:42:21

あなたにオススメの質問