アプリ版:「スタンプのみでお礼する」機能のリリースについて

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に存在するテーブルのデータを結合して取得できるでしょうか。
ご教授お願いいたします。

A 回答 (3件)

当方の環境では問題ありませんでした。


>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の存在などなどそちらのチェックが先なのかな?と思います。
的外れならごめんなさい・・・

この回答への補足

ご回答ありがとうございます。
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
    • good
    • 0

ごめんなさい。


エラーが違っていたのは、無駄に[]と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しないで)試してみては?

この回答への補足

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

補足日時:2010/09/08 15:59
    • good
    • 0

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

。。

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

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

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

これ以外だと・・・・ごめんなさい。降参です。。。
    • good
    • 0
この回答へのお礼

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

OpenRecordset(Query, dbOpenDynaset, dbSQLPassThrough)

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

お礼日時:2010/09/10 16:28

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!