ms-access クエリで複数の insert ステートメントを作成する方法はありますか?
-
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 番目の stmt を入力し、1 番目の stmt を実行し、1 番目の stmt を削除します。
- 2 番目の stmt を入力し、2 番目の stmt を実行し、2 番目の stmt を削除します。
- 3番目のstmtを入力、3番目のstmtを実行、3番目のstmtを削除……
非常に退屈。代わりに、次のようにして Excel から行をインポートできます。
- すでに作成したテーブル名を右クリックします
- Excelからインポート(インポートダイアログボックスが開きます)
- テーブルにインポートするレコードを含む Excel ファイルを参照します。
- 「レコードのコピーをテーブルに追加します」をクリックします。
- 必要なテーブルを選択します (このサンプルムービー内)
- 「OK」をクリックします
- スプレッドシート内のデータを含むワークシートを選択します
- 「完了」をクリックします
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