- 締切済み
sql文でcsvファイルをインポートする方法
txtファイルをDoCmd.TransferTextでインポートする事は出来ているのですが、データが15~30万件ほどありかなり時間が掛かります。SQL文でのレコード全件DELETEがかなり高速だった為、インポートもSQLの方が処理が早いのでは?と思い色々サンプルをさがし、下記のようにしてみたのですが、SQL文をうまく書けず、作動しません。 間違い部分を指摘していただけませんでしょうか? DoCmd.RunSQL "INSERT INTO Add_house_TEMP ( ハウス,カスト,SG1ステータス )"& _ "SELECT [add_house#txt].F1,[add_house#txt].F2,add_house#txt].F3"& _ "FROM add_house#txt IN "\\sv999999\_営業部\個人\作業場\20071115" "Text;HDR=NO;"
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- cz611cgy
- ベストアンサー率56% (190/338)
#1です > データが15~30万件ほどあり > DB:MS-ACCESS2000 この時点で色々な意味で厳しいです 当のMicrosoft自身が複数ユーザでの利用や大量データで使う場合 MS-Accessは推奨しない、そういう場合のためにSQLServerがあると言っています 勘違いされるかもしれないので補足しますが、DBMSとして問題が大きいのであって フロントエンド(フォームやレポートでDB上のデータを表示したり印刷)として使う分には有りと思います ・現在: DBMS(MS-Access200)→フロントエンド(MS-Access200) ・推奨: DBMS(Access以外)→フロントエンド(MS-Access200) 自分は過去に色々有ってフロントエンドとしても絶対に使いませんが... > やはりインポート定義を指定したTransferTextメソッドが早いという事でしょうか? どうしてもMS-AccessをDBMSとして使いたいという場合、私にはわかりません ただし、フロントエンドとして使うという事で有れば他のDBMSにインポートして Accessからはリンクテーブル(昔の記憶からです、今は呼び方が違うかも)として参照します 予算が厳しいという場合でもMySQLやPostgreSQL等、MS-Accessより安定した DBMSが有りますから、そういう物で代用します MS-Access用のODBCドライバ等も揃っていますから検討されてはどうでしょう? こういった感じで移行できますが、環境構築や文字コード、型の違いなどではまるのも目に見えていそうな... http://oshiete1.goo.ne.jp/qa1810819.html http://oshiete1.goo.ne.jp/qa3282664.html http://oshiete1.goo.ne.jp/qa2952024.html でも、MS-AccessのMDBにデータを保存していると行詰るのも早いので 大量データを扱い続けたいのでしたら移行をお勧めします データベースの最適化と修復が常に必要なDBMSは、恐ろしいです
- cz611cgy
- ベストアンサー率56% (190/338)
コードの断片から想像するにVBあたりでしょうか? 仕事柄、速度優先する案件が殆どなのでVB(や.NET)は使う事もなく的外れかもしれませんが^^ どのようなデータベースを使われているか不明ですが大量ですので MS-Accessという事は無いという前提で^^ Microsoft自体が大量データを入れちゃいかんという見解ですから^^ まともなデータベースシステムであればテキストファイルからのインポート ユーティリティが付属しています。 そのユーティリティをシステムコールで呼び出すのが一番高速です 例: oracleの「imp」コマンド 番外編として、質問者の環境で使えるかどうか不明ですがテキストドライバを 経由して表に見せかける事も可能ですが、あまり早く無いと思います インポート用のファイルはデータベース毎に微妙な書式の違いが出てしまうため 大昔に汎用性を持たせるためにDelphiで自作しましたが、メーカー純正の ユーティリティの速度では勝てません 最終的には各DBに合わせた書式へ変換するためのプログラムを間に挟む 事にしました 例: 日付型をインポートする際に「YYYY-MM-DD」「YYYY/MM/DD」「YYYYMMDD」のように受け入れ可能な物がばらばらだった ユーティリティの起動オプションで対処可能な場合も有りますが 各データベースの標準的な書式(オプション無しで取り込める)に合わせるのが 一番問題が少ないと思います 参考までにメーカー純正のユーティリティでは速度を稼ぐために 色々なオプションが有ります 良く検討してから使わないと、落とし穴にはまるかもしれませんので慎重に^^ 例: キー重複時の動作、インデックスを含めた制約の反映タイミング等
補足
os:windows2000, DB:MS-ACCESS2000 です。記入漏れしていました。 >そのユーティリティをシステムコールで呼び出すのが一番高速です やはりインポート定義を指定したTransferTextメソッドが早いという事でしょうか?