• ベストアンサー

SQLのINSERT文での利用者一括登録

会社のほうで、500人くらいのスタッフを管理するシステムを入れています。 自分はシステムの直接の担当ではないのです。専門家でもないです。MSのACCESSで初歩的な売上管理のDBは作成したことはあるレベルです。 スタッフの入力を現在、画面上のフォーマットでひとつひとつやっているのですが、 CSVで入れるようなシステムはついていません。 この挿入を、SQLのinsert文で、一気にやることは、それほど詳しくない素人レベルでは可能でしょうか。

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

  • ベストアンサー
  • TIGANS
  • ベストアンサー率35% (245/681)
回答No.1

普通にやるなら、CSVをExcelで読み込んで ACCESSなどのDBにインポートすればよいのでは? https://www.kenschool.jp/blog/?p=3096 汎用なポータブルinsert文にしたいならばsqliteを使って csvをインポートして、DBをdump出力すれば、3分あれば変換可能でしょう。 https://qiita.com/Kunikata/items/61b5ee2c6a715f610493 https://www.dbonline.jp/sqlite/manage/index4.html ただしimportに先立ってTABLE定義を行わないと CSV内の数字も文字列として認識されてimportされてdumpされます。

spongetak
質問者

お礼

ありがとうございます。 ある程度の勉強は必要のようですね。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

回答No.3

【訂正】添付図のミスを訂正しました。 Replace()とCutStr()を利用して、val_1、val_2、val_3 を AAA、BBB、CCCに書き換えています。

全文を見る
すると、全ての回答が全文表示されます。
回答No.2

Q、データインポートを一気にやることは、素人レベルでは可能でしょうか? A、仕組みを作る手間暇より入力した方が速いし確実。 理由1、スタッフデータをテキストファイルにする必要がある。 理由2、データインポートプログラムをVBAで書く必要がある。 という前提で、私流の【データインポートプリグラムの仕様】を示します。 ・データテキストを配列に読み込む。 ・For-Next でデータをINSERTする。 これが仕様の全て。書くべきプログラムコードで利用する関数は、次のようです。 【FileReadArray関数】 Public Function FileRaedArray(ByVal FileName As String) As String() On Error GoTo Err_FileReadArray   Dim fso    As FileSystemObject   Dim fil    AS File   Dim txs    As TextStream   Dim strText  AS String   Dim strTexts() AS String      Set fso = New FileSystemObject   Set fil = fso.GetFile(FileName)   Set txs = fil.OpenAsTextStream(ForReading, TristateUseDefault)   strText = txs.ReadAll   strTexts = Split(strText, Chr$(13) & Chr$(10)) Exit_FileReadArray:   FileReadArray = strTexts()   Exit Function Err_FileReadArray:   MsgBox Err.Description & "(FileReadArray)", vbExclamation, " 関数エラーメッセージ"   strTexts() = Split("")   Resume Exit_FileReadArray End Function 【FileReadArray関数のテスト】 Private Sub コマンド0_Click()   Dim strTexts() As String      strTexts() = FileReadArray("Test.txt")   If UBound(strTexts()) > -1 Then     Debug.Print strTexts(0)     Debug.Print strTexts(1)   End If End Sub ________________________________________________________ [イミディエイト]                           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1: AA 2: BB FileReadArray()は、このように各行を一つのデータとして読み込みます。これに成功したら For-Next で次のSQL文を実行するだけです。 INSERT INTO tablename (field_1,field_2・・・Field_N) VALUES (val_1,val_2・・・,val_N); 【val_1,val_1,val_2・・・,val_N の置換要領】 置換要領は、添付図を参照されてください。Replace()とCutStr()で前述のINSERT文の雛形のValuesの値を登録データと置換します。 Public Function CutStr(ByVal Text As String, _             ByVal Separator As String, _             ByVal N As Integer) As String   Dim strDatas() As String      strDatas = Split("" & Separator & Text, Separator, , 0)   CutStr = strDatas(N * Abs(N <= UBound(strDatas))) End Function 後は、SQL文を実行するだけです。

spongetak
質問者

お礼

ありがとうございます。 ある程度の勉強は必要のようですね。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • JDBCでのinsertについて

    JDBCを使ってDBを扱います。 データベースはPostgresqlです。 Servlet+JSP+Beanで開発しているのですが、 以下のようなinsert処理をBeanで行っています。 String sql_insert = "INSERT INTO tal_ks(cd,kbn)" + " VALUES(" + vl1 + ",'" + vl2 + "')";System.out.println(sql_insert); System.out.println("SQL文発行"); int in = stmt.executeUpdate(sql_insert); System.out.println("(SQL文発行後"); ・ ・ ・ これを行うと、例外処理には流れず 実行したかのように見えるんですが、 実際はデータがはいっておりません。 このSQLと同じものをpsqlで直接実行すると insert できました。 これは、どういうことが原因なのでしょうか? 教えていただきたいです。

    • ベストアンサー
    • Java
  • 一気に複数のレコードをinsertする方法について

    SQLのinsert文で一気に複数のレコードを挿入する方法ってありますか? SQL*LoaderとPL/SQL以外でお願いします。

  • insertを高速化させたい

    問題:insertが遅い。20件程度の情報をテーブルにinsertするのに、30秒以上かかる。 環境:Windows XP, MYSQL(TABLE1のidにはindexつき) 仕様:textdata.csvを開き、idを取得する。取得したidをgetid変数に入れる。    取得したidがTABLE1に無いか調べる。idが無ければinsert。    あれば読み飛ばす。textdata.csvのidが無くなれば終わり。 con = CREATEOLEOBJ("ADODB.Connection") //ここでCSVファイルを開き、idを取得しループさせる getidSQL = "Select * from TABLE1 where id = '" + getid + "';" RS = con.Execute(getidSQL) If RS.EOF Then //DB登録--------------------------------------------------------------------------------------- str = "INSERT INTO TABLE1 (id) values('" + getid + "');" con.Execute(str) //DB登録終了------------------------------------------------------------------------------------ endif //CSVループ ちなみに、DBにinsertせずに、かわりにテキストファイルに書き込む方法だと一瞬で挿入が完了します。 これをDBに書き込む時に高速化を図りたいのですが、何か良い方法はないでしょうか?

  • [ADO.NET]Accessの日付型にデータをInsertするには?

    言語はVB.NETでDBはAccess2003、OleDbで接続をしています。 テーブルに日付型のフィールドがあるのですが、 SQL文でInsertしようとすると、 System.Data.OleDb.OleDbException: 更新可能なクエリであることが必要です。 という例外がスローされます。 SQL文としては、 INSERT INTO TEST_TABLE (name,updatetime) VALUES ('テスト',DateValue('2006/12/11 18:00:00')); というような構文になっています。 初歩的な不明点ですが、ご教授お願いします。

  • SQL文のダブルクォーテーションを取りたい。

    SQL2008を使用しております。 2つのDBを統合したいのですがユニークIDがかぶっているデータが あるのでIDを変更したいのですが フリーソフトでINSERT文をTab区切りで出力してIDを変更してINSERT文を 作成するといらない箇所に「"」ダブルクォーテーションが入ってしまします。 もちろんその状態ではクエリ実行できないので困っています。 順序はINSERT文をTab区切りで出力→出力されたTab区切りのcsvのIDを変更→テキストで保存(csvでも保存)→拡張子をsqlに変更するといらない箇所に「"」ダブルクォーテーションが入ってしまします。 変更保存の問題でしょうか? どうしたら「"」ダブルクォーテーションが入らない方法はありませんか? 以上、わかるかた教えてください。 よろしくお願いします。

  • DB2でのシステム日付のinsert、updateについて。

    質問です。 DB2で、システム日付のinsert、updateを行うSQLを作成したいのですが、どのようにしたら良いでしょうか? また、参考になるようなサイトなどありましたら教えてください。 どなたか宜しくお願いします。

  • insert文についてご教授ください。

    行き詰ってしまいましたので、 どなたか教えてください。 横が15件、縦が1万件程あるCSVファイルのデータを、 下記のような形で取得しました。 array(11427) { [0]=> array(16) { [0]=> string(4) "○△×…" [1]=> string(8) "○△×…" [2]=> string(0) "" [3]=> string(0) "" [4]=> string(29) "○△×…" [5]=> string(0) "" [6]=> string(0) "" [7]=> string(1747) "○△×…" [8]=> string(4) "○△×…" [9]=> string(4) "○△×…" [10]=> string(0) "○△×…" [11]=> string(55) "○△×…" [12]=> string(55) "○△×…" [13]=> string(55) "○△×…" [14]=> string(43) "○△×…" [15]=> string(63) "○△×…" }    ・    ・    ・ ところどころ1000文字を超えるデータがあり、php.iniのmemori_limitを64Mまで増やし、配列には格納する事は出来たのですが、 上記配列を下記のような形でインサートしようとしたところ、 5000件程しかデータベースに格納されません。 for($i=0; $i<count($data) $i++) { $sql = insert into sample ( seq, id, data1, data2, data3, data4, data5, data6, data7, data8, data9, data10, data11, data12, data13, data14 ) values ( ?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,? ); $stmt = $db->prepare($sql); $db->execute($stmt, $data[$i]); } 5000件までしかデータが入らない等といったmysqlの制限なのかは分かりませんが、 たまに下記のようなメモリーオーバーのエラーが、PERE上で起きているような表記がでてしまいます。 Allowed memory size of XXXX bytes exhausted xxx PERE.php 何か、インサート文でのメモリ開放の関数を使う等、良い方法はないでしょうか? どなたか、ご教授をお願いいたします。

    • ベストアンサー
    • PHP
  • プログラム内のINSERT文が実行されない。

    CGIのソース内でINSERT INTO テーブル名 SELECT文を使って行追加しているのですが、処理がエラーの場合の処理が動いてしまい実行されません。 ただ、同じSQL文をphpMyAdminのデータベースサーバーのSQLにコピペして実行すると問題なく行追加されました。 なので、問題があるとしたらそのプログラムだと思うのですが、原因がつかめません。 SQL文を変数に格納してから実行させてその結果によってエラーメッセージを出す処理は以下の通りです。 $sql = (INSERT INTO テーブル名 SELECT ****** FROM ***** WHERE ******) $ins_result = $db->prepare($sql); $num = $ins_result->execute; if ( not $num ) { &db_rollback; &db_disconnect; &msgout("エラー1","エラーメッセージ","システムエラー"); } すでに作られているプログラムを修正しています。ちなみに、そのプログラムを作った人はすでに現場にはいませんので聞けません。 msgout内に$ins_resultと$numを表示してみましたら、前者は「DBI::st=HASH(0x9f38560)」で、後者は何も入っていないつまり空でした。 【if ( not $num )】のif文も意味が分からないです。私の知識から解読すると $numの否定が真だったらカッコ内の処理を実行するという意味だと思いますが、$numは空なので空でないことが真だったらとなりますが、どういう意味なんでしょうか? プログラム内のSQL文がなぜ実行できなかったのかその原因を調べることができるツールとかあれば試すことができるのですが、データベースで実行して成功したところを考えるとあまり意味ないかもしれませんが。 過去カラム数が違ってたとか、追加データの長さが範囲外だったとかが原因だったことがありましたが今回はそのどちらでもなさそうです。

    • ベストアンサー
    • CGI
  • sql: update またはinsert を判断して1回で実行するには

    わかりやすいように単純にしていますが table1に ID と titleフィールドがあるとして、 update table1 set title = 'no1' where ID = '1' と insert into table1 (ID,title) values ('1','no1') これを一個にまとめたいのですが、 一回のSQLで 指定したIDが なければ、挿入、存在すれば、アップデート みたいな処理は可能でしょうか? CASEとかEXISTS とかの組み合わせでできますでしょうか? 最近まで、SQLを利用したデータベースほとんど 利用していなかったので 初歩的なことで申し訳わけありませんが インターネットの解説サイトをみてもわからないので SQLの本を購入しましたが届くのが来週以降なので もし できるのでしたら、 使う関数名だけでもいいので教えてください。

  • OracleとSQL ServerのSQL文上での差異について

    お世話になっております。 もしOracleやSQL Serverに関してご存知の方が いらっしゃいましたらご教授ください。 今、業務で 「Oracleに載せるシステムをSQL Serverで載せられないか?」 という話が出ており私が調査を行う事になりました。 しかし私のSQL Server経験が浅い為困っている点があります。 (以下の質問は当然ですがシステムで動く・動かない の話はヌキにしてのSQLレベルでの話です) ・Oracle特有のSQL構文をSQL Serverに見合った構文に 直すことによって(DATE→datetime/NUMBER→int等)一般的な SELECT文、INSERT、UPDATE、DELETE文はそのまま使う事が可能か? ・上の件に関する経験をお持ちの方・知識のある方にお聞きしますが 何かこの件に関する注意点などありますでしょうか? の2点になります。 どうかご存知の方がいらっしゃいましたらお願い致します。