• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:DAOでSQLServerに接続し、LeftJoinで別DBのテーブル)

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

このQ&Aのポイント
  • VB6.0、SQLServer2008Expressで開発を行なっており、DAOを利用している。AというDBのT1とBというDBのT2のデータを結合して抽出したいが、エラーが発生する。
  • DBRでAを開き、Bが開けていないためエラーが発生している。複数のDBに存在するテーブルのデータを結合して取得する方法を教えてほしい。
  • Management Studioでは問題なく抽出できたが、VB6.0で実行するとファイルが見つからないエラーが発生する。

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

  • ベストアンサー
回答No.3

Aだけで正常終了しましたか。。。 AがよくてBはだめ。ManagementStudioはOKでVB6ではだめ。 構文は間違いなく合っていますので、あとは、B.dboの部分です。 正式な名称は違うと思いますが、正式名に予約語や全角 2 バイト文字や半角カタカナは入ってませんか? また、Bの所有者はdboですか?でしたらsaで統一してみるとかとか・・・ Bを疑うような部分がでてきましたら、 データベースをもう一個「TestDB」でのような半角英数字だけの名前で作成してそこに同じテーブルを作成し、テーブルAとLeft Joinしてみてください。 これで表示されるのでしたら、Bのデータベース設定に問題ありでしょう・・・ これ以外だと・・・・ごめんなさい。降参です。。。

pepepepepe
質問者

お礼

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

その他の回答 (2)

回答No.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しないで)試してみては?

pepepepepe
質問者

補足

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

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

pepepepepe
質問者

補足

ご回答ありがとうございます。 Bは同じインスタンスに存在しております。 SQL文を以下のように変更し、optionも同じに指定して再度試してみたのですが、ダメでした…。 select * from T1 left join [B].[dbo].T2 AS T_TEST on T1.AAA = T_TEST.AAA ですが、エラーメッセージが「From句の構文エラーです」に変わりました。 同じくManagementStudioでは正常に取得できます。