Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

да и нет.

Вы не можете:

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

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

Ответ 2

Лично я создаю подпрограмму 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

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

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

Ответ 4

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

Ответ 5

@Rik Garner: Не уверен, что вы подразумеваете под "batch", но

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, фактически будет вставлять каждую строку по одному (а не все одновременно), но в той же транзакции: вы можете проверить это, добавив соответствующее ограничение, например.

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), особенно для vanilla INSERT и когда они квалифицируют свои комментарии тем, что: "В верхней части моей головы код, чтобы сделать это, должен выглядеть примерно так..." В конце концов, вы не можете использовать DAO для создания ограничения CHECK:)

Ответ 6

MS Access не допускает множественную вставку из одного окна sql. Если вы хотите вставить, скажите 10 строк в таблице, скажем фильм (mid, mname, mdirector,....), вы бы нужно откройте окна sql,

  • введите 1-й stmt, выполните 1-й stmt, delete 1st stmt
  • введите 2-й stmt, выполните 2-й stmt, удалите 2-й stmt
  • введите 3-й stmt, выполните 3-й stmt, удалите 3-й stmt......

Очень скучно. Вместо этого вы можете импортировать строки из excel, выполнив следующие действия:

  • Щелкните правой кнопкой мыши на названии таблицы, которое вы уже создали.
  • Импорт из Excel (открывается диалоговое окно импорта)
  • Перейдите к файлу excel, содержащему записи, которые будут импортированы в таблицу
  • Нажмите "Добавить копию записей в таблицу":
  • Выберите нужную таблицу (в этом примере)
  • Нажмите "ОК"
  • Выберите рабочий лист, содержащий данные в электронной таблице
  • Нажмите "Готово"

Весь набор данных в excel загружен в таблицу "MOVIE"

Ответ 7

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