web-dev-qa-db-ja.com

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

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

13
Varun Mahajan

はいといいえ。

あなたはできません:

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つの別々の挿入ステートメントを実行する方がおそらく簡単です(もちろん、挿入を実行するコストがコーディングにかかる​​時間よりも大きい場合を除きます)。 。

34
BIBD

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

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

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

2
David-W-Fenton

MS Accessでは、同じSQLウィンドウからの複数の挿入は許可されていません。 insert、たとえばテーブルの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」に読み込まれました

2
user2129206

@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制約を作成することはできません:)

1
onedaywhen

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

1
Rikalous

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
1
Mark