MS Access2003を使用しています。MSAccessの「クエリ」と呼ばれるもので多くの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)
注:ユニオンを許可するためにアクセスを騙すために、何らかの形式のダミーテーブル(たとえば、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
コードが実行されるコンテキストを明確にしていない場合は、Jonathanのように、特定のデータインターフェイスを提案することはお勧めできません。
データストアがJetデータベースの場合、推奨される選択であるスクリプトプラットフォームからコードを実行している場合を除き、任意の形式のADOを使用することはほとんど意味がありません。アクセス、これは間違いなく当てはまりません。DAOが推奨されるインターフェイスです。
MS Accessでは、同じSQLウィンドウからの複数の挿入は許可されていません。 insert、たとえばテーブルの10行、たとえばmovie (mid、mname、mdirector、....)、SQLウィンドウを開く必要があります。
非常に退屈。代わりに、次の方法でExcelから行をインポートできます。
Excelのデータセット全体がテーブル「MOVIE」に読み込まれました
@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です)。テーブルが空のままであるという事実は、内部トランザクションがロールバックされたことを示しています。
@David W. Fenton:DAOを個人的に強く好むかもしれませんが、特にVanilla INSERT
の場合、代替のデータアクセステクノロジー(この場合はADO)を選択するのは難しいことではありません。彼らはコメントを「頭から離れて、それを行うためのコードは次のようになるはずです…」で修飾します。結局のところ、DAOを使用してCHECK
制約を作成することはできません:)
いいえ-Accessのクエリは単一のSQLステートメントです。 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