外部データから一時テーブルを作成するには?

解決


ぷく  2005-07-11 20:15:52  No: 123404

いつもお世話になっております。

環境:Windows2000  VB6.0SP5

SQL Serverに
外部データ(カンマ区切りのテキストファイル)から
一時テーブルを作成する方法を考えているのですが、

どなたかヒントをいただけないでしょうか。

以下のようなSQL文を作ってみたのですが、
「'IN'付近に正しくない構文があります。」というエラーが出てしまいます。

strSQL = "SELECT [Sample#txt].F1, [Sample#txt].F2 INTO T_Sample " _
        & "FROM [Sample#txt] IN 'C:\Work\Data'[Text;HDR=NO;];"


特攻隊長まるるう  2005-07-11 22:06:31  No: 123405

接続に利用してるオブジェクトは何でしょうか?それによってサポートされて
無い機能がありますので、質問には必須事項です。
データベースはデータベースサーバー上ですか?VBのアプリ実行場所は?
CSVファイルの場所は?このSQL文は何が実行するのでしょうか?
DAO 接続上で発行しないと難しいようです。
[csvファイルをsqlserverのテーブルにinsert]
http://www7.big.or.jp/~pinball/discus/sqls/27738.html

エラーとは関係ないですが、テーブル名が[Sample#txt]では一時テーブルには
ならない気がしますが?


特攻隊長まるるう  2005-07-11 22:10:54  No: 123406

>エラーとは関係ないですが、テーブル名が[Sample#txt]では一時テーブルには
>ならない気がしますが?
あ、間違い!。挿入先 T_Sample だった。でもやっぱり一時テーブルではない…。


ぷく  2005-07-12 01:04:47  No: 123407

説明不足で申し訳ありません。
接続に使用しているオブジェクトはADOです。
一時テーブルを作成したいDBはサーバ上です。
VBアプリの実行場所はクライアント側です。

行いたいのは、
「テキストファイルのフィールド(F1,F2)のデータを一時テーブルに保存し、
そこからレコードセット等を作成する」
という処理です。

>でもやっぱり一時テーブルではない…。
失礼いたしました。テーブル名の前に#が必要なのですよね?

以下のように処理を行っているのですが...。

Set Cn = New ADODB.Connection
Set Qy = New ADODB.Command

Cn.Open sDSN, "sa", ""
Qy.ActiveConnection = Cn

sSQL = "SELECT [Sample#txt].F1, [Sample#txt].F2 INTO #T_Sample " _
        & "FROM [Sample#txt] IN 'C:\Work\Data'[Text;HDR=NO;];"

Qy.CommandText = strSQL
Set rst1 = Qy.Execute


特攻隊長まるるう  2005-07-12 01:46:47  No: 123408

>説明不足で申し訳ありません。
そのヘンは分かってるなら問題ないです。
>VBアプリの実行場所はクライアント側です。
CSVファイルの場所もクライアントと思っていいですか?
…で、リンク先の内容には目を通して頂けました???

SQL Server 上でのSQL発行のみでやるのと
MDBファイルを使ってやるので大きく方法が
変わると思われます。
先のリンクの下のツリー階層にコメントありましたよね?
特にボクからのコメントは無いんですが?(^^;)
http://www7.big.or.jp/~pinball/discus/sqls/27755.html


もげ  2005-07-12 17:47:13  No: 123409

>Cn.Open sDSN, "sa", ""

のDSNがどこに接続しているのか不明ですが、"sa"でパスワード無しなら
SQLServerのような気がします。(セキュリティの観点からパスワードは推奨^^;)

>sSQL = "SELECT [Sample#txt].F1, [Sample#txt].F2 INTO #T_Sample " _
>        & "FROM [Sample#txt] IN 'C:\Work\Data'[Text;HDR=NO;];"

この文法自体がJetのものなので、
http://www7.big.or.jp/~pinball/discus/sqls/27755.html
にあるようにAccess上からか、もしくはダミー(空)でもいいので、
MDBに接続して発行する必要があるでしょう。
もしくは、ぷく殿のケースの場合は、こちらのほうがむしろいいような気もします。
http://blogs.sqlpassj.org/mitsugi/archive/2004/07/07/3215.aspx


もげ  2005-07-12 17:50:06  No: 123410

追記。

http://blogs.sqlpassj.org/mitsugi/archive/2004/07/07/3215.aspx
の場合は、サーバ側からクライアント側のCSVファイルが見えていることが前提になります。

普通は、私なら、BCP や BULK INSERT かな。


特攻隊長まるるう  2005-07-12 22:27:28  No: 123411

>http://blogs.sqlpassj.org/mitsugi/archive/2004/07/07/3215.aspx
今日行ったら過去の記事のテキストデータが見れん…昨日は見れたのに…。

>普通は、私なら、BCP や BULK INSERT かな。
うん(^^;)。板違いだし、最初の質問のSQLから回答の方向を
決めたんだけど、一度、データベース系のサイトでどんな方法があるか
調べておくべきですよね。

あと、ベタな方法で、CSVから読んだデータを1行ずつ
SQL文を編集して挿入していっても…数千行くらいまでなら
問題ないと思う…それなりに時間が掛かるけどw。VBの
初心者掲示板の回答としては、まずコレかなぁ…と思ってたり。


ぷく  2005-07-13 01:48:44  No: 123412

特攻隊長まるるう様、もげ様、ありがとうございます。
>…で、リンク先の内容には目を通して頂けました???
見過ごしておりました。申し訳ありません。すぐに拝見致しました。

>私なら、BCP や BULK INSERT かな。
このような方法があるんですね。勉強になりました。

テキストファイルが数百行しかないので、最初はべたな方法も考えたのですが、重複レコードのチェックや並替え等の処理もしたかったので、
テーブルに入れれないかなと思案しまして...。

お二方のアドバイスをもとに色々試しておりまして、
時間がかかりそうですので、
とりあえず、御礼とともに解決とさせていただきます。
ありがとうございました。


※返信する前に利用規約をご確認ください。




  


  このエントリーをはてなブックマークに追加