Запрос на добавление нескольких записей в Access
|
От: |
_Anastasia |
|
Дата: | 15.08.07 12:39 | ||
Оценка: |
Здравствуйте!
Мне нужно добавить несколько записей в таблицу Access. Использую следующий запрос:
INSERT INTO ARHIVCHECK( [CHECKNUM], [DATECHECK], [WAREHOUSE], [CODEGOOD], [OKEY], [QUANTITY], [SUMMA], [SUMDISC], [KINDPAY], [KINDCHECK] ) VALUES
('47', '15.08.2007 15:32:36', 'Торговый зал', '00032', 'пара', '1.000000', '2109.000000', '0.000000', 'Наличная оплата', 'продажа'),
('47', '15.08.2007 15:32:36', 'Торговый зал', '00018', 'пара', '1.000000', '1687.000000', '0.000000', 'Наличная оплата', 'продажа');
Но возникает исключение «Пропущен символ ( в конце инструкции SQL.».
Как это исправить? Какой должен быть запрос, чтобы добавить несколько записей?
Re: Запрос на добавление нескольких записей в Access
|
От: |
MasterZiv |
|
Дата: | 15.08.07 14:10 | ||
Оценка: |
> Мне нужно добавить несколько записей в таблицу Access. Использую
Напиши два запроса и выполни их подряд поочереди.
Разницы никакой нет.
Posted via RSDN NNTP Server 2.1 beta
Re: Запрос на добавление нескольких записей в Access
|
От: |
. |
|
Дата: | 15.08.07 17:01 | ||
Оценка: |
_Anastasia wrote:
> ‘продажа’),
Если я правильно помню, то запятая не нужна.
Posted via RSDN NNTP Server 2.1 beta
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re: Запрос на добавление нескольких записей в Access
|
От: |
ZAMUNDA |
для жалоб и предложений |
Дата: | 15.08.07 21:12 | ||
Оценка: |
2 (1) |
Здравствуйте, _Anastasia, Вы писали:
_A>Здравствуйте!
_A>Мне нужно добавить несколько записей в таблицу Access. Использую следующий запрос:
*Тег [sql], а не [code].
INSERT INTO ARHIVCHECK( [CHECKNUM], [DATECHECK], [WAREHOUSE], [CODEGOOD], [OKEY], [QUANTITY], [SUMMA], [SUMDISC], [KINDPAY], [KINDCHECK] ) VALUES
('47', '15.08.2007 15:32:36', 'Торговый зал', '00032', 'пара', '1.000000', '2109.000000', '0.000000', 'Наличная оплата', 'продажа')
, -- << Вот тут должна быть точка с запятой.
-- А того, что внизу, быть не должно!
('47', '15.08.2007 15:32:36', 'Торговый зал', '00018', 'пара', '1.000000', '1687.000000', '0.000000', 'Наличная оплата', 'продажа');
Это ж «Single-record append query» там только одну запись добавить можно.
_A>Как это исправить? Какой должен быть запрос, чтобы добавить несколько записей?
1. Надо сделать таблицу с одним полем, я её называю обычно «blanc».
CREATE TABLE blanc (ValueMy Integer NOT NULL);
и добавить в неё одну запись (с любым значением)
INSERT INTO blanc (ValueMy) VALUES (0);
2. Используй UNION в подзапросе для вставки данных запросом типа «INSERT ZZZ(…) SELECT … FROM XXX».
INSERT INTO ARHIVCHECK( [CHECKNUM], [DATECHECK], [WAREHOUSE])
SELECT [CHECKNUM], [DATECHECK], [WAREHOUSE] -- млин, я не писатель вам тут. Непомню можно-ли тут * поставить.
FROM (
SELECT '47' AS [CHECKNUM], DateSerial(2007, 15 ,08) + TimeSerial(15, 32, 36) AS [DATECHECK], 'Торговый зал' AS [WAREHOUSE] FROM blanc
UNION
SELECT '47' AS [CHECKNUM], DateSerial(2007, 15 ,08) + TimeSerial(15, 32, 36), 'Торговый зал' AS [WAREHOUSE] FROM blanc
) AS InsertedTbl;
Наука изощряет ум; ученье вострит память.
(c) Козьма Прутков
Re: Запрос на добавление нескольких записей в Access
|
От: |
_d_m_ |
|
Дата: | 15.08.07 23:18 | ||
Оценка: |
Здравствуйте, _Anastasia, Вы писали:
_A>Здравствуйте!
_A>Мне нужно добавить несколько записей в таблицу Access. Использую следующий запрос:
_A>
_A>INSERT INTO ARHIVCHECK( [CHECKNUM], [DATECHECK], [WAREHOUSE], [CODEGOOD], [OKEY], [QUANTITY], [SUMMA], [SUMDISC], [KINDPAY], [KINDCHECK] ) VALUES
_A>('47', '15.08.2007 15:32:36', 'Торговый зал', '00032', 'пара', '1.000000', '2109.000000', '0.000000', 'Наличная оплата', 'продажа'),
_A>('47', '15.08.2007 15:32:36', 'Торговый зал', '00018', 'пара', '1.000000', '1687.000000', '0.000000', 'Наличная оплата', 'продажа');
_A>
_A>Но возникает исключение «Пропущен символ ( в конце инструкции SQL.».
_A>Как это исправить? Какой должен быть запрос, чтобы добавить несколько записей?
Значит Акцес не поддерживает такой синтаксис. Можно попробовать (а Акцесе не спец) воспользоваться таким пакетом:
begin tran;
insert
ARHIVCHECK(...)
values
('47' AS [CHECKNUM], DateSerial(2007, 15 ,08) ...)
;
insert
ARHIVCHECK(...)
values
('47' AS [CHECKNUM], DateSerial(2007, 15 ,08) ...)
;
...
commit;
Операторы insert выполняются в контексте одной транзакции — это важно. Иначе, каждый оператор insert выполняется в своей отдельной транзакции, что сильно замедляет выполнение пакета.
Re[2]: Запрос на добавление нескольких записей в Access
|
От: |
_d_m_ |
|
Дата: | 15.08.07 23:19 | ||
Оценка: |
Здравствуйте, ZAMUNDA, Вы писали:
ZAM>2. Используй UNION в подзапросе для вставки данных запросом типа «INSERT ZZZ(…) SELECT … FROM XXX».
ZAM>
ZAM>INSERT INTO ARHIVCHECK( [CHECKNUM], [DATECHECK], [WAREHOUSE])
ZAM>SELECT [CHECKNUM], [DATECHECK], [WAREHOUSE] -- млин, я не писатель вам тут. Непомню можно-ли тут * поставить.
ZAM>FROM (
ZAM>SELECT '47' AS [CHECKNUM], DateSerial(2007, 15 ,08) + TimeSerial(15, 32, 36) AS [DATECHECK], 'Торговый зал' AS [WAREHOUSE] FROM blanc
ZAM>UNION
ZAM>SELECT '47' AS [CHECKNUM], DateSerial(2007, 15 ,08) + TimeSerial(15, 32, 36), 'Торговый зал' AS [WAREHOUSE] FROM blanc
ZAM>) AS InsertedTbl;
ZAM>
Я не знаю как в Акцесе, но в MS SQL предложение FROM необязательно, соответсвенно нет необходимости в таблице [blanc]:
insert
ARHIVCHECK(...)
select
'47' AS [CHECKNUM], DateSerial(2007, 15 ,08) ...
union all
select
'47' AS [CHECKNUM], DateSerial(2007, 15 ,08) ...
;
Re[3]: Запрос на добавление нескольких записей в Access
|
От: |
ZAMUNDA |
для жалоб и предложений |
Дата: | 16.08.07 07:02 | ||
Оценка: |
Здравствуйте, _d_m_, Вы писали:
___>Я не знаю как в Акцесе, но в MS SQL предложение FROM необязательно, соответсвенно нет необходимости в таблице [blanc]:
МАМАЙ КЛИНУС, ДАРАГОЙ, в MSSQL ЙА БЭЗ Blanс ВИСЁ ДЭЛАЙУ!
Ну мож ещё MSFOX вспомним? Так там ащще мона в массив записать всё и APPEND сделать.
А в Access обязательно указание таблицы, и если в таблице нет записей, то в «SELECT {const} AS Somth FROM blank» набор будет пустым — вот такая ботва.
PS: Транзакций Access’овском SQL тож нет (да вроде и ADO.Connection.BeginTransaction и т.д тож не сработают если к Access подключено).
PPS: Кстати правильно «Blank», опечатался я…
Наука изощряет ум; ученье вострит память.
(c) Козьма Прутков
Re[4]: Запрос на добавление нескольких записей в Access
|
От: |
_d_m_ |
|
Дата: | 16.08.07 09:35 | ||
Оценка: |
Здравствуйте, ZAMUNDA, Вы писали:
ZAM>Здравствуйте, _d_m_, Вы писали:
___>>Я не знаю как в Акцесе, но в MS SQL предложение FROM необязательно, соответсвенно нет необходимости в таблице [blanc]:
ZAM>МАМАЙ КЛИНУС, ДАРАГОЙ, в MSSQL ЙА БЭЗ Blanс ВИСЁ ДЭЛАЙУ!
А что у Мамая был КЛИНУС??? На ум приходит только… гхм-гхм
… клитор и анус
Re[2]: Запрос на добавление нескольких записей в Access
|
От: |
_Anastasia |
|
Дата: | 16.08.07 12:10 | ||
Оценка: |
Здравствуйте, ZAMUNDA, Вы писали:
ZAM>1. Надо сделать таблицу с одним полем, я её называю обычно «blanc».
ZAM>
ZAM>CREATE TABLE blanc (ValueMy Integer NOT NULL);
ZAM>
и добавить в неё одну запись (с любым значением)
ZAM>INSERT INTO blanc (ValueMy) VALUES (0);
ZAM>
ZAM>2. Используй UNION в подзапросе для вставки данных запросом типа «INSERT ZZZ(…) SELECT … FROM XXX».
ZAM>
ZAM>INSERT INTO ARHIVCHECK( [CHECKNUM], [DATECHECK], [WAREHOUSE])
ZAM>SELECT [CHECKNUM], [DATECHECK], [WAREHOUSE] -- млин, я не писатель вам тут. Непомню можно-ли тут * поставить.
ZAM>FROM (
ZAM>SELECT '47' AS [CHECKNUM], DateSerial(2007, 15 ,08) + TimeSerial(15, 32, 36) AS [DATECHECK], 'Торговый зал' AS [WAREHOUSE] FROM blanc
ZAM>UNION
ZAM>SELECT '47' AS [CHECKNUM], DateSerial(2007, 15 ,08) + TimeSerial(15, 32, 36), 'Торговый зал' AS [WAREHOUSE] FROM blanc
ZAM>) AS InsertedTbl;
ZAM>
Спасибо большое…Все заработало…
Только неудобно немного получается: надо создавать лишнюю таблицу, делать к ней пустое обращение. Но, наверное, сама база так сделана.
А транзакций в Аксесе действительно нет.
Re[5]: Запрос на добавление нескольких записей в Access
|
От: |
ZAMUNDA |
для жалоб и предложений |
Дата: | 16.08.07 12:13 | ||
Оценка: |
|
Здравствуйте, _d_m_, Вы писали:
ZAM>>МАМАЙ КЛИНУС, ДАРАГОЙ, в MSSQL ЙА БЭЗ Blanс ВИСЁ ДЭЛАЙУ!
___>А что у Мамая был КЛИНУС??? На ум приходит только… гхм-гхм
… клитор и анус
Клинус — это ж знаменитый советник Мамая по хозяйственным делам.
Клинус
Знаменитый звездочёт и бухгалтер Клинус, был другом детства Мамая, но судьба разделила их в юношестве — Мамай поехал учиться военному делу в южные районы Крыма, а Клинус пешком пошёл по берегу моря на запад в Магрибские земли, изучать науки и чародейство. Однако, дружба с воинственным Мамаем оставила свой след, наряду с талантом к наукам, юный Клинус проявлял недюжую ловкость и силу. Некоторые источники сообщают, что именно он стал прототипом Гендальфа из Толкиенистского «Властелина колец».
Окончив обучение в 1360 году, Клинус придумал трусцу и ею отправился обратно в крымское ханство, чтоб найти себе женщину и старого друга Мамика (так он звал Мамая). Через пять лет судьба послала Клинусу окончание пути, а Мамаю власть, чтобы напрячь людей на поиски старого друга Клиныша (он так называл Клинуса). Ещё через год судьба и арабский скакун, чьё имя история умалчивает, обеспечили встречу старых друзей.
Просохнув через месяц и узнав что Клинус неплохо знает математику, Мамай определил старого друга на работу. Клинус быстро втянулся в загадочный мир подсчёта съеденного, лошадьми из канюшен Мамая , овса и наложенного ими же навоза. Однако настоящую революцию он совершил в деле подсчёта необходимого количества людей и лошадей перед первым походом Мамая на русские земли. Это он заложил основы реляционных баз данных, придумав связывать одного солдата и одной или нескольими лошадьми, клинок с одним живым или мёртвым воином и Мамая со множеством сундуков золота.
Умер Клинус в безвестии от удара шальной подковой по темечку, во время куликовской битвы в 1380 г. К сожалению, стан Клинуса был разорён русскими богатырями, которые и использовали по нужде весь папирус с трудами Клинуса.
Вот так-то!!! Историю учить надо, а не всякую фигню писать.
Наука изощряет ум; ученье вострит память.
(c) Козьма Прутков
Re[3]: Запрос на добавление нескольких записей в Access
|
От: |
ZAMUNDA |
для жалоб и предложений |
Дата: | 16.08.07 13:01 | ||
Оценка: |
Здравствуйте, _Anastasia, Вы писали:
__A>Спасибо большое…Все заработало…:)
Пожалуйста. Канешно заработало, я такой финт ушами давно использую.
_A>Только неудобно немного получается: надо создавать лишнюю таблицу, делать к ней пустое обращение.
Неудобно ёжиков рожать! Удобным должно быть сопровождение, тестирование и (в идеале) рефакторинг — а не написание программы.
Хотите «удобно» — переходите на MS SQL Server Express.
_A>А транзакций в Аксесе действительно нет.
Ну значит и правда нет. Значит память у меня ещё есть…
Наука изощряет ум; ученье вострит память.
(c) Козьма Прутков
Re[4]: Запрос на добавление нескольких записей в Access
|
От: |
Igor.K |
|
Дата: | 16.08.07 16:09 | ||
Оценка: |
_A>>А транзакций в Аксесе действительно нет.
ZAM>Ну значит и правда нет. Значит память у меня ещё есть…
Транзакции в MS Access действительно есть, только в языке Jet SQL они никак не представлены.
А используются они, примерно, так:
On Error GoTo errorTransaction
Dim myWrk As DAO.Workspace, myDbs As DAO.DATABASE
Set myWrk = DBEngine.Workspaces(0)
Set myDbs = CurrentDb
myWrk.BeginTrans
myDbs.Execute "UPDATE ...", dbFailOnError
myDbs.Execute "INSERT ...", dbFailOnError
myDbs.Execute "DELETE ...", dbFailOnError
myWrk.CommitTrans
exitTransaction:
myDbs.Close
myWrk.Close
Exit Sub
errorTransaction:
myWrk.Rollback
MsgBox "Transaction was not completed successfully", vbCritical, "Problem with batch run"
goto exitTransaction
end sub
«СССР — четыре слова и все лживые» — Вагрич Бахчанян
Re[5]: Запрос на добавление нескольких записей в Access
|
От: |
Бенедикт |
|
Дата: | 17.08.07 07:21 | ||
Оценка: |
_A>>>А транзакций в Аксесе действительно нет.
ZAM>>Ну значит и правда нет. Значит память у меня ещё есть…
IK>Транзакции в MS Access действительно есть, только в языке Jet SQL они никак не представлены.
Справка по языку Microsoft Jet SQL
Инструкция TRANSACTION
Используется для запуска и завершения явных транзакций.Синтаксис
Запускает новую транзакцию.BEGIN TRANSACTION
Заканчивает транзакцию путем завершения всей работы, выполненной в ходе транзакции.
COMMIT [TRANSACTION | WORK]
Заканчивает транзакцию путем свертывания всей работы, выполненной в ходе транзакции.
ROLLBACK [TRANSACTION | WORK]
Дополнительные сведения
Автоматический запуск транзакции невозможен. Чтобы начать транзакцию, ее необходимо явно запустить с помощью инструкции BEGIN TRANSACTION.Допускается пять уровней вложения транзакций. Чтобы запустить вложенную транзакцию, воспользуйтесь инструкцией BEGIN TRANSACTION в контексте существующей транзакции.
Для присоединенных или связанных таблиц транзакции не поддерживаются.
Re[6]: Запрос на добавление нескольких записей в Access
|
От: |
Igor.K |
|
Дата: | 19.08.07 05:36 | ||
Оценка: |
Здравствуйте, Бенедикт, Вы писали:
_A>>>>А транзакций в Аксесе действительно нет.
ZAM>>>Ну значит и правда нет. Значит память у меня ещё есть…
IK>>Транзакции в MS Access действительно есть, только в языке Jet SQL они никак не представлены.
Б>Справка по языку Microsoft Jet SQL[q]Инструкция TRANSACTION
Б>Используется для запуска и завершения явных транзакций.
Ты смотри, действительно появились. Просто по MS Office 97 я их действительно не помню.
… << RSDN@Home 1.2.0 alpha rev. 653>>
«СССР — четыре слова и все лживые» — Вагрич Бахчанян
- Переместить
- Удалить
- Выделить ветку
Пока на собственное сообщение не было ответов, его можно удалить.
Code with amendments per above comments to make it Access friendly & remove typos:
INSERT INTO test ( ProcessID, Name, Address, RandomData)
VALUES (123 , 'TestName', 'TestAdd', 'qwrj3ri');
INSERT INTO test ( ProcessID, Name, Address, RandomData)
VALUES (456 , 'TestName2', 'TestAdd', 'qwerty');
INSERT INTO test ( ProcessID, Name, Address, RandomData)
VALUES (789 , 'TestName', 'TestAdd', 'qwrj3ri');
INSERT INTO test ( ProcessID, Name, Address, RandomData)
VALUES (1234, 'Testing123', 'tester', 'asdfghjk');
Useful reference: https://msdn.microsoft.com/en-us/library/bb243852(v=office.12).aspx
Specific comments:
@Damien_The_Unbeliever:
I don’t think access supports multiple rows in the values.
Amended to include an insert into
per row instead of a value set per row (values (...), (...)
).
@Thomas Tschernich:
our missing single quote next to the end of your insert
Changed 'tester', sdfg')
to 'tester', 'sdfg');
@JohnLBevan:
superfluous character on end of first set of values
Changed 'qwrj3ri'), T
to 'qwrj3ri'),
← →
ed
(2002-01-21 08:39)
[0]
Есть проблема:
В Дельфи при использовании компонента TADODataSet:
1) Два и более запроса не выполняются.
2) Создаю временную таблицу и после ее создания, она тут же удаляется
В BDE — наоборот (проблем нет)
Скажите пожалуйста, как выйти из ситуации?
← →
KSergey
(2002-01-21 09:37)
[1]
Ничего не понятно
Что значит не выполняется два запроса? Код.
Какую именно временную таблицу? К стати, какая БД используется? Кокой вы вообще хотели получить ответ без этого уточнения?!
← →
Steel Ice
(2002-01-21 10:19)
[2]
Вообще ADOшные компоненты — глюкота.
Например попробуй сделать в ADOQuery выборку из базы, в которой нету записей — орет как укушенная. Еще какая-то у них мутная процедура Close у этих компонент. Если при закрытии курсор стоит на последней строчке таблицы, при выполнении Close частенько выдает EOF ошибку.
А удалить или изменить строчку в ADOTable? Кошмар.
Единственная возможноть нормально работать с АДО, делаешь ADOConnection, и через него ADOCommandom выполняешь любые запросы. Результаты возвращаются в Excute:_Recordset.
И таблицы, когда я их через АДОКомманд создавал — не пропадали.
И работает шустренько.
← →
Fay-1
(2002-01-22 01:19)
[3]
to Steel Ice :
Поставь апдейты для делфей
у меня всё живёт
← →
ed
(2002-01-24 07:07)
[4]
База — MS SQL Server 7 (и выше)
Два запроса = две инструкции
например, код:
delete table1
insert …
выполняет только первую инструкцию
или
в ADOCommand создаю временную таблицу (select…into #tmptable)
а после делаю апдейт, например, из другого ADOCommand или этого же компонента, поменяв CommandText. Он мне говорит, что нет такой, проверяю — действительно нет. А в ADOConnection один и тот же (вообще один) и в документашке по MS SQL говорится что докальная временная таблица сохраняется пока сессия не закроется.
Можно запрос через сам ADOConnection послать на создание, тогда все работает, но вот беда : он не поддерживает параметры…, а нужны!
← →
Delirium
(2002-01-24 12:44)
[5]
Просто надо пользовать полноценные компоненты — TADOQuery, например, тогда и глюков не будет, и какие угодно команды проходить будут.
← →
ed
(2002-01-25 07:04)
[6]
А вот и нифига подобного. Во-первых, в хелпе написано, что никакой разницы нет между TADOQuery и TADODataSet. Во-вторых,
я на всякий случай попробовал использовать query, но результат оказался тем же самым. В этот раз я пробовал на базе mdb (acceess). Вот код
SQL:
INSERT INTO table1 (id, Name) Values (0, «Name0»)
DELETE FROM table1 where id = 0
после ExecSQL ошибка: «Пропущен символ (;) в конце инструкции SQL»
Тогда ставлю в конце инструкции точку с запятой:
INSERT INTO table1 (id, Name) Values (0, «Name0»);
DELETE FROM table1 where id = 0
В этом случае другая ошибка: «Обнаружены символы за пределами инструкции SQL»
БЛИН!
← →
Delirium
(2002-01-25 12:21)
[7]
Мы-же по MSSQL вроде говорили, а кто тебе сказал что ACCESS позволяет несколько инструкций подряд исполнять? Ты бы в самом ACCESS сначала попробывал бы, а потом уже на ADO наезжал
← →
Delirium
(2002-01-25 15:08)
[8]
И вообще для команд, не возвращающих информацию, существует TADOCommand, а TADOQuery естественно ругаться будет «CommandText does not return a result set»
Код с поправками на приведенные выше комментарии, чтобы сделать его доступным и удаленным опечатками:
INSERT INTO test ( ProcessID, Name, Address, RandomData)
VALUES (123 , 'TestName', 'TestAdd', 'qwrj3ri');INSERT INTO test ( ProcessID, Name, Address, RandomData)
VALUES (456 , 'TestName2', 'TestAdd', 'qwerty');INSERT INTO test ( ProcessID, Name, Address, RandomData)
VALUES (789 , 'TestName', 'TestAdd', 'qwrj3ri');
INSERT INTO test ( ProcessID, Name, Address, RandomData)
VALUES (1234, 'Testing123', 'tester', 'asdfghjk');
Полезная ссылка: https://msdn.microsoft.com/en-us/library/bb243852(v=office.12).aspx
Конкретные комментарии:
@Damien_The_Unbeliever:
Я не думаю, что доступ поддерживает несколько строк в значениях.
Изменено, чтобы включить insert into
каждую строку вместо значения, заданного для строки (values (...), (...)
).
@Томас Чернич:
наша пропущенная одиночная цитата рядом с концом вашей вставки
Изменен 'tester', sdfg')
на 'tester', 'sdfg');
@JohnLBevan:
избыточный символ в конце первого набора значений
Изменено 'qwrj3ri'), T
to 'qwrj3ri'),