Форум: "Базы";
Текущий архив: 2008.04.20;
Скачать: [xml.tar.bz2];
ВнизКак узнать SQL запрос возвращает результат или нет? Найти похожие ветки
← →
Kolan © (2007-11-13 16:42) [0]Задравтсвуйте,
Программ генерит скрипт(SQL). Его помещаю в TADOQuery. Нужно если он возвращает результат сделать Open и отобразить результат, если нет, сделать ExecSQL и вывести результат в мемо.
Как определить что нужно делать со скриптом?
Пример скрипта:
/*
Created by KSQLServerScriptCreator.
Creation date and time „13_11_2007 16-42-34“
Used data base „bsmp“
Used table „CONFIG“
*/
--Script for table „CONFIG“ start.--
DECLARE @CONFIGTempTable TABLE (ucod1 int, firma1 varchar(200), director1 varchar(200), cod_mp1 varchar(50), neobl_mp1 float(8), cod_bl1 varchar(50), bez_kop1 int, proc_tr1 float(8), proc_trinv1 float(8), proc_soc1 float(8), proc_medf1 float(8), proc_medm1 float(8), proc_penf1 float(8), SO_52561 float(8), NO_52561 float(8), SO_661 float(8), NO_661 float(8), SO_671 float(8), NO_671 float(8), GODZP1 int, MESZP1 int, STAVP1 float(8), S_LG31 float(8), S_LG51 float(8), S_LGOT1 float(8), GOD1 int, KOL_RS1 varchar(50), cod_pod1 varchar(50), cod_priz1 varchar(50), cod_otp1 varchar(50), STRANA1 int, KOD_R1 char(10), INN1 varchar(12), KPP1 varchar(9), MES_OTP1 int, MES_BOLN1 int, S_LGOTI1 float(8), cod_prem1 varchar(3), koef_51 float(8), koef_61 float(8), okato1 varchar(20), ISESN_VS1 int, MES_BOLNS1 int, MES_OTPS1 int, cod_dek1 varchar(50), cod_pos1 varchar(50), COD_SBER1 varchar(50), COD_ALIM1 varchar(30), COD_GOSST1 varchar(30), COD_SSUD1 varchar(30), reg_nom1 varchar(30), OKOPF1 varchar(30), OKOGU1 varchar(30), IFNS1 int, podp_dir1 varchar(100), podp_glb1 varchar(100), cod_otpf1 varchar(100), bl_soc1 varchar(100));
INSERT INTO @CONFIGTempTable(ucod1, firma1, director1, cod_mp1, neobl_mp1, cod_bl1, bez_kop1, proc_tr1, proc_trinv1, proc_soc1, proc_medf1, proc_medm1, proc_penf1, SO_52561, NO_52561, SO_661, NO_661, SO_671, NO_671, GODZP1, MESZP1, STAVP1, S_LG31, S_LG51, S_LGOT1, GOD1, KOL_RS1, cod_pod1, cod_priz1, cod_otp1, STRANA1, KOD_R1, INN1, KPP1, MES_OTP1, MES_BOLN1, S_LGOTI1, cod_prem1, koef_51, koef_61, okato1, ISESN_VS1, MES_BOLNS1, MES_OTPS1, cod_dek1, cod_pos1, COD_SBER1, COD_ALIM1, COD_GOSST1, COD_SSUD1, reg_nom1, OKOPF1, OKOGU1, IFNS1, podp_dir1, podp_glb1, cod_otpf1, bl_soc1)
VALUES(1, "IOC AANII a.AOEIAI", "Ae. a?a? Aeooiaa Aaeaioeia Iao?iaia", """078""", 3000, """029""", 0, 0.2, 0.12, 3.2, 0.8, 2, 6, 14, 0, 14, 0, 10, 4, 2005, 8, 13, 500, 3000, 400, 2004, NULL, """068""", """069""", NULL, 643, "61 ", "6144000193", "614401001", 8, 14, 600, NULL, 1.4, 1.2, "60415000000", 0, 12, 3, """034""", """073"",""074"",""075""", """100""", """083""", """100""", """098""", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
SET IDENTITY_INSERT CONFIG ON;
UPDATE CONFIG
SET firma = T.firma1, director = T.director1, cod_mp = T.cod_mp1, neobl_mp = T.neobl_mp1, cod_bl = T.cod_bl1, bez_kop = T.bez_kop1, proc_tr = T.proc_tr1, proc_trinv = T.proc_trinv1, proc_soc = T.proc_soc1, proc_medf = T.proc_medf1, proc_medm = T.proc_medm1, proc_penf = T.proc_penf1, SO_5256 = T.SO_52561, NO_5256 = T.NO_52561, SO_66 = T.SO_661, NO_66 = T.NO_661, SO_67 = T.SO_671, NO_67 = T.NO_671, GODZP = T.GODZP1, MESZP = T.MESZP1, STAVP = T.STAVP1, S_LG3 = T.S_LG31, S_LG5 = T.S_LG51, S_LGOT = T.S_LGOT1, GOD = T.GOD1, KOL_RS = T.KOL_RS1, cod_pod = T.cod_pod1, cod_priz = T.cod_priz1, cod_otp = T.cod_otp1, STRANA = T.STRANA1, KOD_R = T.KOD_R1, INN = T.INN1, KPP = T.KPP1, MES_OTP = T.MES_OTP1, MES_BOLN = T.MES_BOLN1, S_LGOTI = T.S_LGOTI1, cod_prem = T.cod_prem1, koef_5 = T.koef_51, koef_6 = T.koef_61, okato = T.okato1, ISESN_VS = T.ISESN_VS1, MES_BOLNS = T.MES_BOLNS1, MES_OTPS = T.MES_OTPS1, cod_dek = T.cod_dek1, cod_pos = T.cod_pos1, COD_SBER = T.COD_SBER1, COD_ALIM = T.COD_ALIM1, COD_GOSST = T.COD_GOSST1, COD_SSUD = T.COD_SSUD1, reg_nom = T.reg_nom1, OKOPF = T.OKOPF1, OKOGU = T.OKOGU1, IFNS = T.IFNS1, podp_dir = T.podp_dir1, podp_glb = T.podp_glb1, cod_otpf = T.cod_otpf1, bl_soc = T.bl_soc1
FROM @CONFIGTempTable AS T
WHERE (ucod = T.ucod1);
INSERT INTO CONFIG(ucod, firma, director, cod_mp, neobl_mp, cod_bl, bez_kop, proc_tr, proc_trinv, proc_soc, proc_medf, proc_medm, proc_penf, SO_5256, NO_5256, SO_66, NO_66, SO_67, NO_67, GODZP, MESZP, STAVP, S_LG3, S_LG5, S_LGOT, GOD, KOL_RS, cod_pod, cod_priz, cod_otp, STRANA, KOD_R, INN, KPP, MES_OTP, MES_BOLN, S_LGOTI, cod_prem, koef_5, koef_6, okato, ISESN_VS, MES_BOLNS, MES_OTPS, cod_dek, cod_pos, COD_SBER, COD_ALIM, COD_GOSST, COD_SSUD, reg_nom, OKOPF, OKOGU, IFNS, podp_dir, podp_glb, cod_otpf, bl_soc)
SELECT ucod1, firma1, director1, cod_mp1, neobl_mp1, cod_bl1, bez_kop1, proc_tr1, proc_trinv1, proc_soc1, proc_medf1, proc_medm1, proc_penf1, SO_52561, NO_52561, SO_661, NO_661, SO_671, NO_671, GODZP1, MESZP1, STAVP1, S_LG31, S_LG51, S_LGOT1, GOD1, KOL_RS1, cod_pod1, cod_priz1, cod_otp1, STRANA1, KOD_R1, INN1, KPP1, MES_OTP1, MES_BOLN1, S_LGOTI1, cod_prem1, koef_51, koef_61, okato1, ISESN_VS1, MES_BOLNS1, MES_OTPS1, cod_dek1, cod_pos1, COD_SBER1, COD_ALIM1, COD_GOSST1, COD_SSUD1, reg_nom1, OKOPF1, OKOGU1, IFNS1, podp_dir1, podp_glb1, cod_otpf1, bl_soc1 FROM @CONFIGTempTable AS T
WHERE NOT EXISTS(SELECT * FROM CONFIG WHERE (ucod = T.ucod1))
SET IDENTITY_INSERT CONFIG OFF;
DBCC CHECKIDENT(CONFIG, RESEED);
--Script for table „CONFIG“ end.--
/*
Regards to KSoftWare®.
*/
← →
Johnmen © (2007-11-13 16:51) [1]Что значит "скрипт возвращает результат"?
← →
Desdechado © (2007-11-13 17:37) [2]Код ошибки - это результат?
Скалярное значение из функции - результат?
Набор данных - результат?
ИМХО, невозможно определить в общем случае, будет ли возвращен датасет или нет. Тем более, из скрипта, а не команды.
← →
Kolan © (2007-11-13 18:17) [3]> Набор данных — результат?
Да :).
Вот если в том же SQL Query Analyzer запуститьSELECT
, то он покажет данные, еслиINSERT
, то строчкуRows affected…
← →
Kolan © (2007-11-13 19:09) [4]Зря я скрипт привел. На самом деле может быть люьой запрос.
← →
Anatoly Podgoretsky © (2007-11-13 19:19) [5]> Kolan (13.11.2007 16:42:00) [0]
Данный запрос результата (набора данных) не возвращает.
← →
Desdechado © (2007-11-13 19:46) [6]> SQL Query Analyzer запустить SELECT, то он покажет данные,
> если INSERT, то строчку Rows affected
А если скрипт с обеими командами?
← →
ЮЮ © (2007-11-14 03:16) [7]> Вот если в том же SQL Query Analyzer запустить SELECT, то
> он покажет данные, если INSERT, то строчку Rows affected…
Даже если запустить SELECT, то на закладке Massage можешь найти строчку Rows affected…
> Нужно если он возвращает результат сделать Open и отобразить
> результат, если нет, сделать ExecSQL и вывести результат
> в мемо.
Узнать можно после, никак не до. Поэтому следует использовать не TADOQuery, имеющего разные методы а, например TADOCommad, имеющий только Execute, который, к тому же, возвращает _Recordset, из которого можно вытащить и возвращаемые наборы данных и строчки Rows affected…
← →
Kolan © (2007-11-14 12:04) [8]> TADOCommad
О, попробую.
← →
Ega23 © (2007-11-14 12:08) [9]хм.. А вообще интересная задачка-то... Ну чисто академически...
← →
sniknik © (2007-11-14 12:15) [10]ничего интересного, стандартная проверка статуса у каждого рекордсета из возвращаемого списка.
← →
Ega23 © (2007-11-14 12:36) [11]
> ничего интересного, стандартная проверка статуса у каждого
> рекордсета из возвращаемого списка.
Это если ADO.
А в целом?
← →
sniknik © (2007-11-14 12:41) [12]а в целом(в общем) ни один вопрос смысла не имеет... всегда только частности.
← →
Reindeer Moss Eater © (2007-11-14 12:43) [13]а в целом это бессмыслонно.
инсерт
селект
инсерт
селект
инсерт
апдейт
снова селект
Это пример скрипта
← →
Anatoly Podgoretsky © (2007-11-14 13:27) [14]> Ega23 (14.11.2007 12:36:11) [11]
Это фантастика.
← →
Petr V. Abramov © (2007-11-14 18:19) [15]для скрипта как целого действительно бессмысленно. А для конкретного запроса можно, надо "всего лишь" добраться до native хендла запроса и взять значение атрибута OCI_ATTR_SQLFNCODE. Для справки см книгу Oracle Call Interface, для примеров на паскале - исходники DOA или ODAC.
← →
Desdechado © (2007-11-14 18:36) [16]> Для справки см книгу Oracle Call Interface
Судя по приведенному скрипту, Ораклом там не пахнет.
← →
Petr V. Abramov © (2007-11-14 20:34) [17]> Desdechado © (14.11.07 18:36) [16]
верно...
но тут же было вроде, что галка оракла глючила и по умолчанию принимали его :)))
ну и ладно, может, кому другому поможет
← →
Kolan © (2007-11-20 15:05) [18]> же, возвращает _Recordset, из которого можно вытащить и
> возвращаемые наборы данных и строчки Rows affected…
Так… а как оттуда это все это добро достать. И где взять описание?
← →
sniknik © (2007-11-20 15:12) [19]> Так… а как оттуда это все это добро достать.
какое добро? данные? проще всего присвоив полученное одноименному обьекту в ADODataSet-е, он как раз и сделан чтобы с этими данными работать.
правда если полученный рекордсет пустой (закрыт) то ...
> И где взять описание?
_Recordset-а? ищи у себя на машине ADO210.CHM (в поставке msoffice)
← →
Kolan © (2007-11-20 15:19) [20]> какое добро?
Я так понял в этом _Recordset попадают все наборы данных и все собщиния типа «rows affected» который возврашаетт запрос. Вот их то мне и надо теперь получить.
Например пройтись по всем наборам, для каждого создать грид, и показать данные.
← →
sniknik © (2007-11-20 15:33) [21]> и все собщиния типа «rows affected» который возврашаетт запрос.
нет, сообщений "типа «rows affected»" там нет, есть рекордсет и коллекция ошибок (сообщений от PRINT в некоторых случаях, которые тоже ошибки с низким приоритетом).
а "rows affected" для закрытых(пустых) рекорсетов возвращаются в параметре функции (число, а не сообщение), для открытых это = RecordCount (причем тоже не всегда этому можно верить...).
← →
Kolan © (2007-11-20 17:44) [22]Меня больше интересует как достать данные. Там же должно быть несколько рекордсетов в зав от запроса, так?
Если запрос такой:
SELECT
INSERT
SELECT
Мне надо создать два DBGrid и вывести данные…
← →
sniknik © (2007-11-20 17:59) [23]> Мне надо создать два DBGrid и вывести данные…
и ???
обрамляешь пакет
SET NOCOUNT ON
SELECT
INSERT
SELECT
SET NOCOUNT OFF
вносиш в ADODataSet, выполняешь и получаешь два "чистых" рекордсета в связке, второй получаешь ADODataSet.NextRecordset
← →
Kolan © (2007-11-21 08:53) [24]> второй получаешь ADODataSet.NextRecordset
Буду пробовать.
← →
Kolan © (2007-11-21 09:08) [25]А как узнать сколько их там всего(что бы циклом пройтись)?
← →
sniknik © (2007-11-21 10:34) [26]проходить пока nil(/null) не вернет вместо рекордсета. там односвязный список завершающийся пустышкой.
← →
Kolan © (2007-11-21 12:21) [27]> там односвязный список завершающийся пустышкой.
Ок, буду пробовать.
← →
KSergey © (2007-11-22 18:31) [28]> Kolan © (21.11.07 12:21) [27]
> Ок, буду пробовать.
А кроме как в "академических целях" - это точно где-то надо?
← →
sniknik © (2007-11-22 20:13) [29]> это точно где-то надо?
бывает... если пишешь чтото типа sql експлорера...
вроде такого как давал в ветке "SQL выражение в ADO вызывает исключение в msvcrt.dll" (там есть гдето ссылка на скачку)
и где вытаскиваешь данные из неизвестных тебе команд...
ну типа, попробуй команду
EXEC sp_monitor
это для MSSQL (можеш прям в этой программе, сразу станет понятно зачем оно нужно)
или пример из того же MSSQL, раздел "Summarizing Data Using COMPUTE and COMPUTE BY"
USE pubs
SELECT type, price, advance
FROM titles
ORDER BY type
COMPUTE SUM(price), SUM(advance)
ну а составлять пакеты типа
INSERT INTO ххххх (...) VALUES (...)
SELECT @@Identity
INSERT INTO yyyyy (IDxxxxx...) VALUES (@@Identity...)
SELECT @@Identity
сам Гейтс велел. (вносиш запись в одну таблицу, в другую со связувающим с первой полем, и получаешь ключевые значения обеих таблиц... если они конечно нужны еще на клиенте)
???
т.е. не так трудно найти применение и не в академических целях, правда в основном ты знаеш что именно вернет команда... ну кроме программ для тестов самих запросов о которых сказано в начале.
← →
sniknik © (2007-11-22 20:19) [30]> сам Гейтс велел.
пример Гейтс подсказал неудачный... ну да в общем должно быть понятно, что зачем тут.
а по конкретному, тут проще два инсерта подряд, а в конце в одном запросе (получить в одном рекордсете ) сделать два (под каждую таблицу) IDENT_CURRENT.
← →
Kolan © (2007-11-22 20:20) [31]> А кроме как в «академических целях» — это точно где-то надо?
Да, просто написал утилиту. Так как там нет такой фичи(показывать дата сеты), то приходится переключаться в Query Analyzer
← →
Виталий Панасенко(дом) (2007-11-24 13:20) [32]А просто проверить ADODataSet.IsEmpty ?
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2008.04.20;
Скачать: [xml.tar.bz2];
Память: 0.54 MB
Время: 0.041 c