Вопросы | ms-access

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

Вопрос

Varun Mahajan | 45933 просмотров | рейтинг: 1

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



Ответы

BIBD

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


Rikalous

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

 


Jonathan

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


David-W-Fenton

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


onedaywhen

+ 1 -
@Rik Гарнер: Не уверен, что вы подразумеваете под «партия», но
 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 для вас); тот факт, что таблица остается пустой, показывает, что внутренняя транзакция была откатана. @ Дэвид У. Фентон: у вас могут быть сильные личные предпочтения в отношении DAO, но, пожалуйста, не стесняйтесь кого-то выбирать альтернативную технологию доступа к данным (в данном случае ADO), особенно для ванильного INSERT и когда они оценивают свои комментарии с помощью «Вверху моей головы», код для этого должен выглядеть примерно так… В конце концов, вы не можете использовать DAO для создания ограничения CHECK :)


BIBD

+ 1 -
MS Access не позволяет многократную вставку из одного окна SQL. Если вы хотите вставить, скажем, 10 строк в таблицу, например, фильм (mid, mname, mdirector, ....), вам необходимо откройте окна sql, введите 1-й ввод, выполните 1-й ввод, удалите 1-й ввод введите 2-й stmt, выполните 2-й stmt, удалите 2-й stmt введите 3-й stmt, выполните 3-й stmt, удалите 3-й stmt ...... Очень скучно. Вместо этого вы можете импортировать строки из Excel, выполнив: Щелкните правой кнопкой мыши на имени таблицы, которую вы уже создали Импорт из Excel (открывается диалоговое окно импорта) Найдите файл Excel, содержащий записи для импорта в таблицу. Нажмите на Добавить копию записей в таблицу: Выберите нужную таблицу (в этом примере фильма) Нажмите на ОК Выберите лист, который содержит данные в электронной таблице Нажмите на Готово Весь набор данных в Excel был загружен в таблицу MOVIE  


Rikalous

+ 3 -
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
 




Теги

ms-access