Есть ли способ создать несколько операторов вставки в запросе на ms-access?

Я использую MS Access 2003. Я хочу запустить множество вставных операторов SQL в так называемом «Запросе» в MS Access. Есть ли какой-либо простой (или даже любой способ) сделать это?

да и нет.

Вы не можете:

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, состоящую из множества союзов Selects с жестко закодированными результатами.

 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», чтобы убедиться, что вы ‘t повторять для таблицы с более чем одной строкой

Но опять же, было бы проще просто сделать три отдельных оператора вставки, особенно если вы уже строите вещи в цикле (если, конечно, стоимость выполнения вставок больше, чем стоимость вашего времени, чтобы закодировать его) ,

Лично я бы создал подпрограмму VBA, чтобы сделать это, и подключиться к базе данных, используя некоторую форму соединения sql.

В верхней части моей головы код для этого должен выглядеть примерно так:

 Sub InsertLots () Dim SqlConn as Connection SqlConn.Connect("your connection string") SqlConn.Execute("INSERT  (column1, column2) VALUES (1, 2)") SqlConn.Execute("INSERT  (column1, column2) VALUES (2, 3)") SqlConn.Close() End Sub 

Я думаю, что нецелесообразно предлагать конкретный интерфейс данных, как это делает Джонатан, когда вы не уточнили контекст, в котором код будет запущен.

Если хранилище данных является базой данных Jet, нет смысла использовать какую-либо форму ADO, если вы не используете свой код на платформе сценариев, где это предпочтительный вариант. Если вы находитесь в Access, это определенно не так, и DAO является предпочтительным интерфейсом.

Нет – запрос в Access – это один оператор SQL. В одном объекте запроса нет возможности создать партию нескольких операторов. Вы можете создать несколько объектов запроса и запустить их из макроса / модуля.

@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) 

construct, хотя и является единственным оператором SQL, фактически будет вставлять каждую строку по одному (а не сразу), но в той же транзакции: вы можете проверить это, добавив соответствующее ограничение, например

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

Предполагая, что таблица пуста, вышеуказанный INSERT INTO..SELECT.. должен работать: факт, что это не так, потому что ограничение было проверено после того, как была вставлена ​​первая строка, а не после того, как все три были вставлены (нарушение ANSI SQL -92, но это MS Access для вас); факт, что таблица остается пустой, показывает, что внутренняя транзакция была отброшена.

@David W. Fenton: у вас может быть сильное личное предпочтение DAO, но, пожалуйста, не слишком сложно кого-то выбирать для альтернативной технологии доступа к данным (в данном случае ADO), особенно для ванильного INSERT и когда они квалифицируют свои комментарии с помощью , «В верхней части моей головы, код для этого должен выглядеть примерно так …» В конце концов, вы не можете использовать DAO для создания ограничения CHECK 🙂

MS Access не допускает множественную вставку из одного windows sql. Если вы хотите вставить , скажите 10 строк в таблице , скажите фильм (mid, mname, mdirector, ….) , вам нужно будет открыть windows 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. Нажмите «ОК»
  7. Выберите рабочий лист, содержащий данные в электронной таблице.
  8. Нажмите «Готово»

Весь dataset в excel загружен в таблицу «MOVIE»

MS Access также может добавлять данные в таблицу из простого текстового файла. CSV значения (я просто использовал поле «Заменить все», чтобы удалить все, кроме запятых), а в разделе «Внешние данные» выберите «Текстовый файл».

 From this: INSERT INTO CLASS VALUES('10012','ACCT-211','1','MWF 8:00-8:50 am','BUS311','105'); INSERT INTO CLASS VALUES('10013','ACCT-211','2','MWF 9:00-9:50 am','BUS200','105'); INSERT INTO CLASS VALUES('10014','ACCT-211','3','TTh 2:30-3:45 pm','BUS252','342'); To this: 10012,ACCT-211,1,MWF 8:00-8:50 am,BUS311,105 10013,ACCT-211,2,MWF 9:00-9:50 am,BUS200,105 10014,ACCT-211,3,TTh 2:30-3:45 pm,BUS252,342 
Давайте будем гением компьютера.