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





Нет - запрос в 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
и да и нет.
Вы не можете:
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», чтобы убедиться, что вы не используете нет повторов для таблицы с более чем одной строкой
Но опять же, вероятно, было бы проще сделать три отдельных оператора вставки, особенно если вы уже создаете что-то в цикле (если, конечно, затраты на выполнение вставок не превышают затраты вашего времени на его кодирование).
Очень интересный и содержательный ответ. Это определенно поможет мне в том, что я делал
Это способ! Только один совет: если у вас более 50 вложенных операторов SELECT, вы должны выполнять их группами по 50 или меньше. Мне нужно было вставить 1080 строк, и я разделил их на группы по 48. В противном случае Access (я использовал версию 2010) предупредит вас об ошибке «Слишком сложный запрос».
У кого-нибудь получилось, что это работает со вставкой в файлы dbf с помощью oledb?
Я думаю, что нецелесообразно предлагать конкретный интерфейс данных, как это делает Джонатан, если вы не прояснили контекст, в котором будет выполняться код.
Если хранилище данных представляет собой базу данных 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.
Я тоже надеюсь, что вы правы. Но до тех пор, пока они этого не сделают, ADO по-прежнему требуется, чтобы закрыть дыры в DAO: ограничения CHECK, WITH COMPRESSION, блокировка на уровне строк и т. д. просто выбор образа жизни, не так ли? :)
Как работает DAO при обновлении до SQL Server?
MS Access не допускает множественную вставку из одного окна sql. Если вы хотите вставлять, скажем 10 строк в таблице, скажем фильм (mid, mname, mdirector, ....), вам нужно будет откройте окна sql,
Очень скучно. Вместо этого вы можете импортировать строки из Excel, выполнив:
Весь набор данных в 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
Хорошее решение. Я всегда забываю, что в Access встроен целый язык программирования, который можно использовать для автоматизации управления базой данных.