Хранимые запросы Access с инструкцией INSERT INTO
От: warlock Украина www.dialexpert.com
Дата: 10.05.02 06:57
Оценка:
Подскажите, возможно ли средствами ADO через Connection.Execute создать хранимый запрос с инструкцией INSERT INTO ?
Объясню причину — необходимо выполнить несколько запросов на пополнение таблиц базы данных, при этом происходит сравнение текущего содержимого базы (а именно 3-х таблиц, связанных между собой) и некой эталонной таблицы, содержащей полную информацию.
Из внешней программы сложный запрос (с использованием INNER, LEFT, RIGHT JOIN к трем таблицам, либо альтернативным описанием через SELECT ... WHERE NOT IN (SELECT...)) не выполняется, ОДНАКО остаётся возможность выполнить его в качестве хранимого запроса, где он отрабатывается великолепно. Вот в принципе и вся проблема. Буду благодарен за любую подсказку.

Re: Хранимые запросы Access с инструкцией INSERT INTO
От: Олег Жихарев Россия  
Дата: 10.05.02 11:40
Оценка:
Здравствуйте warlock, Вы писали:

Нужно попробовать ADOX.

W>Подскажите, возможно ли средствами ADO через Connection.Execute создать хранимый запрос с инструкцией INSERT INTO ?

W> Объясню причину — необходимо выполнить несколько запросов на пополнение таблиц базы данных, при этом происходит сравнение текущего содержимого базы (а именно 3-х таблиц, связанных между собой) и некой эталонной таблицы, содержащей полную информацию.
W> Из внешней программы сложный запрос (с использованием INNER, LEFT, RIGHT JOIN к трем таблицам, либо альтернативным описанием через SELECT ... WHERE NOT IN (SELECT...)) не выполняется, ОДНАКО остаётся возможность выполнить его в качестве хранимого запроса, где он отрабатывается великолепно. Вот в принципе и вся проблема. Буду благодарен за любую подсказку.

W>
Re: Хранимые запросы Access с инструкцией INSERT INTO
От: The Lex Украина  
Дата: 10.05.02 14:13
Оценка:
Здравствуйте warlock, Вы писали:

W>Объясню причину — необходимо выполнить несколько запросов на пополнение таблиц базы данных...

Если можно, напишите запросы.

W>Из внешней программы сложный запрос (с использованием INNER, LEFT, RIGHT JOIN к трем таблицам...

И этот сложный запрос тоже.

В "хранимую процедуру" MS Access позволяет вложить только одно выражение.
Голь на выдумку хитра, однако...
Re: Хранимые запросы Access с инструкцией INSERT INTO
От: Олег Жихарев Россия  
Дата: 11.05.02 01:35
Оценка:
Пример кода, может быть устроит: CString m_strConnect;


// Define ADOX object pointers.
// Initialize pointers on define.
// These are in the ADOX:: namespace.
_CatalogPtr m_pCatalog;


HRESULT hr = S_OK;

// Define ADOX object pointers.
// Initialize pointers on define.
// These are in the ADOX:: namespace.

// Define ADODB object pointers.
ADODB::_ConnectionPtr m_pCnn = NULL;
ADODB::_CommandPtr m_pCommand = NULL;

try
{
//Open the Connection
TESTHR(hr = m_pCnn.CreateInstance(__uuidof(ADODB::Connection)));
TESTHR(hr = m_pCatalog.CreateInstance(__uuidof(Catalog)));
TESTHR(hr = m_pCommand.CreateInstance(__uuidof(ADODB::Command)));
m_pCnn->Open("Provider=Microsoft.Jet.OLEDB.4.0;"
"data source=C:\\Ax970011\\MDB\\ax970011.mdb;","","",NULL);

//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
От: The Lex Украина  
Дата: 14.05.02 18:58
Оценка:
Здравствуйте Аноним, Вы писали:

А>Запросы имеют следующий вид. Все таблицы присутствуют в одной базе данных...


Мое мнение таково: сложите их в хранимые запросы — в три штуки соответственно — и выполняйте последовательно. Как создать хранимый запрос показал Олег Жихарев. Выполняться будет несколько быстрее и все будет лежать в одном месте.
Голь на выдумку хитра, однако...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.