Подскажите, возможно ли средствами ADO через Connection.Execute создать хранимый запрос с инструкцией INSERT INTO ?
Объясню причину — необходимо выполнить несколько запросов на пополнение таблиц базы данных, при этом происходит сравнение текущего содержимого базы (а именно 3-х таблиц, связанных между собой) и некой эталонной таблицы, содержащей полную информацию.
Из внешней программы сложный запрос (с использованием INNER, LEFT, RIGHT JOIN к трем таблицам, либо альтернативным описанием через SELECT ... WHERE NOT IN (SELECT...)) не выполняется, ОДНАКО остаётся возможность выполнить его в качестве хранимого запроса, где он отрабатывается великолепно. Вот в принципе и вся проблема. Буду благодарен за любую подсказку.
Re: Хранимые запросы Access с инструкцией INSERT INTO
Нужно попробовать ADOX.
W>Подскажите, возможно ли средствами ADO через Connection.Execute создать хранимый запрос с инструкцией INSERT INTO ? W> Объясню причину — необходимо выполнить несколько запросов на пополнение таблиц базы данных, при этом происходит сравнение текущего содержимого базы (а именно 3-х таблиц, связанных между собой) и некой эталонной таблицы, содержащей полную информацию. W> Из внешней программы сложный запрос (с использованием INNER, LEFT, RIGHT JOIN к трем таблицам, либо альтернативным описанием через SELECT ... WHERE NOT IN (SELECT...)) не выполняется, ОДНАКО остаётся возможность выполнить его в качестве хранимого запроса, где он отрабатывается великолепно. Вот в принципе и вся проблема. Буду благодарен за любую подсказку.
W>
Re: Хранимые запросы Access с инструкцией INSERT INTO
Здравствуйте warlock, Вы писали:
W>Объясню причину — необходимо выполнить несколько запросов на пополнение таблиц базы данных...
Если можно, напишите запросы.
W>Из внешней программы сложный запрос (с использованием INNER, LEFT, RIGHT JOIN к трем таблицам...
И этот сложный запрос тоже.
В "хранимую процедуру" MS Access позволяет вложить только одно выражение.
Голь на выдумку хитра, однако...
Re: Хранимые запросы Access с инструкцией INSERT INTO
//Open the catalog
m_pCatalog->PutActiveConnection(_variant_t((IDispatch *)m_pCnn));
//Get the Command
m_pCommand = m_pCatalog->Procedures->GetItem("Запрос2")->GetCommand();
//Update the CommandText
m_pCommand->PutCommandText("INSERT INTO j_tbl_surplus"
"( Max_dmm_01, nml_StockId, nml_CommodityId, nml_ColorId,"
"nml_SizeId, Quantity, XavrCommodity, OneDayOborot, Period, KOborot, OborotForPeriod, TempRest, Rest, Surplus )"
"SELECT j_tbl_МинОстаткиНаДату.Max_dmm_01, j_tbl_МинОстаткиНаДату.nml_StockId, j_tbl_МинОстаткиНаДату.nml_CommodityId, j_tbl_МинОстаткиНаДату.nml_ColorId, j_tbl_МинОстаткиНаДату.nml_SizeId, j_tbl_МинОстаткиНаДату.Quantity, j_tbl_МинОстаткиНаДату.XavrCommodity, j_tbl_МинОстаткиНаДату.OneDayOborot, j_tbl_МинОстаткиНаДату.Period, j_tbl_МинОстаткиНаДату.KOborot, j_tbl_МинОстаткиНаДату.OborotForPeriod, j_tbl_МинОстаткиНаДату.TempRest, j_tbl_МинОстаткиНаДату.Rest, [Difference]*(-1) AS Surplus FROM j_tbl_МинОстаткиНаДату WHERE ((([Difference]*(-1))>0)) ORDER BY j_tbl_МинОстаткиНаДату.KOborot DESC");
//Update the Procedure
m_pCatalog->Procedures->GetItem("Запрос2")->PutCommand(
_variant_t((IDispatch *)m_pCommand));
}
catch(_com_error &e)
{
// Notify the user of errors if any.
_bstr_t bstrSource(e.Source());
_bstr_t bstrDescription(e.Description());
}
catch(...)
{
AfxMessageBox("Error occured in include files....");
}
У меня все работает.
Re[2]: Хранимые запросы Access с инструкцией INSERT INTO
От:
Аноним
Дата:
13.05.02 05:46
Оценка:
Здравствуйте The Lex, Вы писали:
TL>Здравствуйте warlock, Вы писали:
W>>Объясню причину — необходимо выполнить несколько запросов на пополнение таблиц базы данных... TL>Если можно, напишите запросы.
W>>Из внешней программы сложный запрос (с использованием INNER, LEFT, RIGHT JOIN к трем таблицам... TL>И этот сложный запрос тоже.
TL>В "хранимую процедуру" MS Access позволяет вложить только одно выражение.
Запросы имеют следующий вид. Все таблицы присутствуют в одной базе данных.
SQL(1) = "INSERT INTO [Table1] ( k1 ) " & _
"SELECT DISTINCT Table2.p2 FROM Table1 RIGHT JOIN " & _
"(Table2 LEFT JOIN [Table3] ON (Table2.p1 = [Table3].[h2]) " & _
"AND (Table2.p5 = [Table3].[h1])) ON Table1.k1 = Table2.p2 " & _
"Where [Table3].[h3] Is Null And Table1.k2 Is Null"
SQL(2) = "INSERT INTO [Table3] ( h2, [h3], h1, h4 ) " & _
"SELECT DISTINCT Table2.p1, Table2.p2, Table2.p5, Table1.k2 " & _
"FROM (Table2 LEFT JOIN [Table3] ON (Table2.p5 = [Table3].[h1]) AND " & _
"(Table2.p1 = [Table3].[h2])) INNER JOIN Table1 ON Table2.p2 = Table1.k1 " & _
"Where [Table3].[h3] Is Null"
SQL(3) = "INSERT INTO Table4 ( f1, f2, f3, f4 ) " & _
"SELECT DISTINCT Table2.p5, Table2.p1, Table2.p3, Table2.p4 " & _
"FROM Table2 LEFT JOIN Table4 ON (Table2.p1 = Table4.f2) AND " & _
"(Table2.p3 = Table4.f3) AND (Table2.p5 = Table4.f1) " & _
"WHERE Table4.f4 Is Null"
Re[3]: Хранимые запросы Access с инструкцией INSERT INTO
Здравствуйте Аноним, Вы писали:
А>Запросы имеют следующий вид. Все таблицы присутствуют в одной базе данных...
Мое мнение таково: сложите их в хранимые запросы — в три штуки соответственно — и выполняйте последовательно. Как создать хранимый запрос показал Олег Жихарев. Выполняться будет несколько быстрее и все будет лежать в одном месте.