ms-access クエリで複数の insert ステートメントを作成する方法はありますか?

StackOverflow https://stackoverflow.com/questions/62504

  •  09-06-2019
  •  | 
  •  

質問

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

役に立ちましたか?

解決

はいといいえ。

できないこと:

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)

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

しかし、繰り返しになりますが、特にループで物事を既に構築している場合は、3つの個別の挿入ステートメントを実行する方が簡単です(もちろん、インサートを実行するコストがコードのコストよりも大きい場合を除きます) 。

他のヒント

個人的には、これを行うための 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

コードが実行されるコンテキストを明確にしていないときに、ジョナサンのように特定のデータ インターフェイスを提案するのは賢明ではないと思います。

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

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

@リック・ガーナー:「バッチ」が何を意味するのか分かりませんが、

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 です)。テーブルが空のままであるという事実は、内部トランザクションがロールバックされたことを示しています。

@デビッド・W.フェントン:あなたは DAO に強い個人的な好みを持っているかもしれませんが、特にバニラの場合、代替のデータ アクセス テクノロジ (この場合は ADO) を選択する人に対してあまり厳しくしないでください。 INSERT そして、彼らが自分のコメントを「思いついたのですが、それを実行するコードは次のようになると思います...」と修飾すると、結局のところ、DAO を使用して CHECK 制約:)

MS Access では、同じ SQL ウィンドウからの複数の挿入は許可されません。あなたがしたい場合は 入れる, 、 言う テーブルに 10 行, 、 言う 映画 (ミッド、名前、ディレクター、....), 、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」にロードされました

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
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top