とあるプログラマーの覚書

Access編:テーブルやカラム名のネーミングについて

本日もAccessに関するトピックになります。
最近、旧仕様のMDBファイルから、新仕様のMDBファイルへのデータ移行プログラムを作成したのですが、そのときに困ったというか気付いた事がありましたので、記載したいと思います。

移行方法は、SQLでINSERT SELECT文を記述して、そのSQL文をモジュールで実行(CurrentDb.Executeとか使って)するというようなやり方です。
具体的に発行しようとしたSQLは、、、


DELETE FROM テーブル1;
INSERT INTO テーブル1 (カラム1,カラム2,…,カラムN)
 SELECT カラム1,カラム2,…,カラムN FROM テーブル2;


「テーブル2」の全レコードを「テーブル1」へ挿入する、という処理ですね。
その前に、「テーブル1」は全クリアしておくと。
まぁこんな感じで、移行が必要な全テーブルを移行させようとしました。

で、毎回起こるわけではないのですが、テーブルによっては、以下のA、B、Cのようなエラーが起こったわけです。
A.実行時エラー 3131 FROM 句の構文エラーです。
B.実行時エラー 3134 INSERT INTO ステートメントの構文エラーです。
C.実行時エラー 3075 クエリ式 ‘2カラム’の構文エラー:演算子がありません。

Aのエラーは、最初のDELETE文にて発生するエラーでした。
原因は、テーブル名に半角ハイフンが使われていたからでした。
Bのエラーの原因は、カラム名(列名)に半角の括弧「(」「)」が使われていたからでした。
AやBのエラーが発生する文字は、他にも発生する記号があるかもしれません。

Cのエラーの原因は、カラム名(列名)の先頭文字が数字(半角、全角問わず)だったからでした。

対策方法は、問題のあるテーブル名やカラム名には、「[」「]」で括ってやるとOKです。
逆に言うと、全テーブル名と全カラム名には「[」「]」で括ってやればOKなのですが、メンドクサイので問題があるところだけ括りました。

SQL文の文法に問題無いはずなのに、同じようなエラーに悩んでいたら、テーブル名かカラム名を見てみてください。
アンダーバー等、エラーが起こらない記号であればOKですが、テーブル名やカラム名には、あまり記号を使わない方がいいと思いますね。

あと、カラム名(列名)が、数字だけで構成されている場合も要注意です。
例えば、「1」とか「10」とか。
このようなカラム名を持つテーブルを、上記のINSERT SELECT文で移行しようとすると、エラーにはならないのですが、意図したように移行されません。
実際のSQLとしては以下のようになります。


INSERT INTO テーブル1 (1,10)
 SELECT 1,10 FROM テーブル2;


この場合、テーブル1には、テーブル2の「1」「10」というカラムから取得したデータではなく、「1」カラムには全て1が、「10」カラムには全て10という数値が挿入されてしまいます。
この場合も、カラム名を括弧([,])で括ってやればOKです。
まぁ、カラム名に数値だけのネーミングするセンスがどうかって思いますけど(笑)

今回は以上です。


スポンサーリンク

URL :
TRACKBACK URL :

Leave a Reply

*
*
* (公開されません)

*

Return Top