16

MS Access 2003 を使用しています。MS Access で「クエリ」と呼ばれるもので多数の挿入 SQL ステートメントを実行したいと考えています。それを行うための簡単な(または実際には任意の方法)はありますか?

4

8 に答える 8

38

はいといいえ。

あなたはできません:

insert into foo (c1, c2, c3)
values ("v1a", "v2a", "v3a"),
       ("v1b", "v2b", "v3b"),
       ("v1c", "v2c", "v3c")

しかし、あなたはすることができます

insert into foo (c1, c2, c3)
    select (v1, v2, v3) from bar

テーブルにまだデータがない場合、何が得られるでしょうか? そうですね、ハード コードされた結果を持つ Select の多数の和集合で構成される Select ステートメントを作成することもできます。

INSERT INTO foo (f1, f2, f3)
    SELECT *
    FROM (select top 1 "b1a" AS f1, "b2a" AS f2, "b3a" AS f3 from onerow
    union all
    select top 1 "b1b" AS f1, "b2b" AS f2, "b3b" AS f3 from onerow
    union all 
    select top 1 "b1c" AS f1, "b2c" AS f2, "b3c" AS f3 from onerow)

注: また、何らかの形式のダミー テーブル (onerow など) を含めて、アクセスをだましてユニオンを許可する必要があります (少なくとも 1 つの行が含まれている必要があります)。 '複数の行を持つテーブルの繰り返しを取得しない

しかし、繰り返しますが、特にループ内で既に何かを構築している場合は、おそらく 3 つの個別の挿入ステートメントを実行する方が簡単でしょう (もちろん、挿入を実行するコストがそれをコーディングする時間のコストよりも大きい場合を除きます)。 .

于 2008-09-15T17:43:12.003 に答える
4

個人的には、それを行うための VBA サブルーチンを作成し、何らかの形式の SQL 接続を使用してデータベースに接続します。

私の頭の上から、それを行うコードは次のようになります。

Sub InsertLots ()
    Dim SqlConn as Connection
    SqlConn.Connect("your connection string")
    SqlConn.Execute("INSERT <tablename> (column1, column2) VALUES (1, 2)")
    SqlConn.Execute("INSERT <tablename> (column1, column2) VALUES (2, 3)")
    SqlConn.Close()
End Sub
于 2008-09-15T12:58:45.587 に答える
2

MS Accessでは、同じSQLウィンドウからの複数の挿入は許可されていません。たとえば、テーブルに10行、たとえばmovie (mid、mname、mdirector、....)を挿入する場合は、SQLウィンドウを開く必要があります。

  1. 1番目のstmtを入力し、1番目のstmtを実行し、1番目のstmtを削除します
  2. 2番目のstmtを入力し、2番目のstmtを実行し、2番目のstmtを削除します
  3. 3番目のstmtを入力し、3番目のstmtを実行し、3番目のstmtを削除します.....。

非常に退屈。代わりに、次のようにしてExcelから行をインポートできます。

  1. 作成済みのテーブル名を右クリックします
  2. Excelからインポート([インポート]ダイアログボックスが開きます)
  3. テーブルにインポートするレコードを含むExcelファイルを参照します
  4. 「レコードのコピーをテーブルに追加する」をクリックします。
  5. 必要なテーブルを選択します(この例のムービー)
  6. 「OK」をクリックします
  7. スプレッドシートのデータを含むワークシートを選択します
  8. [完了]をクリックします

Excelのデータセット全体がテーブル「MOVIE」に読み込まれました

于 2013-03-03T16:22:24.970 に答える
2

コードが実行されるコンテキストを明確にしていない場合、Jonathan のように特定のデータ インターフェイスを提案することはお勧めできません。

データ ストアが Jet データベースである場合、推奨される選択肢であるスクリプト プラットフォームからコードを実行する場合を除き、ADO の形式を使用してもほとんど意味がありません。Access を使用している場合、これは絶対に当てはまりません。DAO が推奨されるインターフェイスです。

于 2008-09-15T20:50:27.590 に答える
1

いいえ - Access のクエリは単一の SQL ステートメントです。1 つのクエリ オブジェクト内で複数のステートメントのバッチを作成する方法はありません。複数のクエリ オブジェクトを作成し、それらをマクロ/モジュールから実行できます。

于 2008-09-15T12:57:21.690 に答える
1

MS Access では、単純なテキスト ファイルからテーブルにデータを追加することもできます。値を CSV に変換し ([すべて置換] ボックスを使用してカンマ以外をすべて削除しました)、[外部データ] で [テキスト ファイル] を選択します。

From this:
INSERT INTO CLASS VALUES('10012','ACCT-211','1','MWF 8:00-8:50 a.m.','BUS311','105');
INSERT INTO CLASS VALUES('10013','ACCT-211','2','MWF 9:00-9:50 a.m.','BUS200','105');
INSERT INTO CLASS VALUES('10014','ACCT-211','3','TTh 2:30-3:45 p.m.','BUS252','342');
To this:
10012,ACCT-211,1,MWF 8:00-8:50 a.m.,BUS311,105
10013,ACCT-211,2,MWF 9:00-9:50 a.m.,BUS200,105
10014,ACCT-211,3,TTh 2:30-3:45 p.m.,BUS252,342
于 2013-05-07T21:33:53.310 に答える
1

@Rik Garner: 「バッチ」の意味がわかりませんが、

INSERT INTO foo (f1, f2, f3)
    SELECT *
    FROM (select top 1 "b1a" AS f1, "b2a" AS f2, "b3a" AS f3 from onerow
    union all
    select top 1 "b1b" AS f1, "b2b" AS f2, "b3b" AS f3 from onerow
    union all 
    select top 1 "b1c" AS f1, "b2c" AS f2, "b3c" AS f3 from onerow)

構造は、単一の SQLステートメントですが、実際には各行を (一度にではなく) 1 つずつ挿入しますが、同じトランザクション内に挿入します。たとえば、関連する制約を追加することでこれをテストできます。

ALTER TABLE foo ADD
   CONSTRAINT max_two_foo_rows
      CHECK (2 >= (SELECT COUNT(*) FROM foo AS T2));

テーブルが空であると仮定すると、上記INSERT INTO..SELECT..は機能するはずです: 実際には、3 つすべてが挿入された後ではなく、最初の行が挿入された後に制約がチェックされたためです (ANSI SQL-92 の違反ですが、それは MS Access forあなた ); テーブルが空のままであるという事実は、内部トランザクションがロールバックされたことを示しています。

@David W. Fenton: あなたは個人的に DAO を強く好むかもしれませんが、代替データ アクセス テクノロジ (この場合は ADO) を選択することについて誰かに厳しくしすぎないようにしてくださいINSERT。 「私の頭の中で、それを行うコードは次のようになるはずです...」結局のところ、DAOを使用してCHECK制約を作成することはできません:)

于 2008-09-29T13:11:28.523 に答える