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

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
15
0
52 778
8
Перейти к ответу Данный вопрос помечен как решенный

Ответы 8

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

Лично я бы создал для этого подпрограмму 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

Хорошее решение. Я всегда забываю, что в Access встроен целый язык программирования, который можно использовать для автоматизации управления базой данных.

Matthew Lock 13.06.2014 05:07
Ответ принят как подходящий

и да и нет.

Вы не можете:

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

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

Очень интересный и содержательный ответ. Это определенно поможет мне в том, что я делал

Varun Mahajan 16.09.2008 17:03

Это способ! Только один совет: если у вас более 50 вложенных операторов SELECT, вы должны выполнять их группами по 50 или меньше. Мне нужно было вставить 1080 строк, и я разделил их на группы по 48. В противном случае Access (я использовал версию 2010) предупредит вас об ошибке «Слишком сложный запрос».

Cheshire Cat 04.04.2014 13:51

У кого-нибудь получилось, что это работает со вставкой в ​​файлы dbf с помощью oledb?

reggaeguitar 30.10.2014 02:18

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

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

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

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 намеренно оставила определенные функции вне DAO, когда MS продвигала ADO вместо DAO. Я надеюсь, что, поскольку Access теперь имеет свою собственную частную версию Jet, DAO будет обновлен для поддержки всего, что поддерживает сам Jet.

David-W-Fenton 12.10.2008 00:38

Я тоже надеюсь, что вы правы. Но до тех пор, пока они этого не сделают, ADO по-прежнему требуется, чтобы закрыть дыры в DAO: ограничения CHECK, WITH COMPRESSION, блокировка на уровне строк и т. д. просто выбор образа жизни, не так ли? :)

onedaywhen 13.10.2008 12:29

Как работает DAO при обновлении до SQL Server?

JeffO 16.02.2009 00:14

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

Весь набор данных в 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

На основе обходного пути VBA от @Jonathan и для выполнения в текущей базе данных Access:

Public Sub InsertMinimalData()
  CurrentDb.Execute "INSERT INTO FinancialYear (FinancialYearID) VALUES ('FY2019/2020');"
  CurrentDb.Execute "INSERT INTO FinancialYear (FinancialYearID) VALUES ('FY2020/2021');"
End Sub

Другие вопросы по теме