|
Где искать причину кривой работы запроса? | ☑ | ||
---|---|---|---|---|
0
IKSparrow
06.12.13
✎
13:01
|
В конфигурации есть подключение к внешним источникам данных.
Из этих источников данных происходит выборка информации. Собирается три вида документов из трех таблиц на SQL2005. Запрос к документам выглядит следующим образом: ВЫБРАТЬ ДокСчетаНаОплатуКлиентамТЧ.Номенклатура КАК НоменклатураУИ, ДокСчетаНаОплатуКлиентамТЧ.UNITID КАК ЕдиницаИзмеренияНаименование, ДокСчетаНаОплатуКлиентамТЧ.Количество, ДокСчетаНаОплатуКлиентамТЧ.СтавкаНДС, ДокСчетаНаОплатуКлиентамТЧ.СуммаНДС, ДокСчетаНаОплатуКлиентамТЧ.ЦенаСНДС КАК Цена, ДокСчетаНаОплатуКлиентамТЧ.Сумма, ДокСчетаНаОплатуКлиентамТЧ.Документ, ВЫБОР КОГДА ДокСчетаНаОплатуКлиентамТЧ.НомерГТД ЕСТЬ NULL ИЛИ СпрНомераГТД.Страна = "Россия" ТОГДА "" ИНАЧЕ ДокСчетаНаОплатуКлиентамТЧ.НомерГТД КОНЕЦ КАК НомерГТД, ВЫБОР КОГДА СпрНомераГТД.Страна ЕСТЬ NULL ИЛИ СпрНомераГТД.Страна = "Россия" ТОГДА "" ИНАЧЕ СпрНомераГТД.Страна КОНЕЦ КАК СтранаПроисхождения ИЗ ВнешнийИсточникДанных.до_Axapta.Таблица.ДокСчетаНаОплатуКлиентамТЧ КАК ДокСчетаНаОплатуКлиентамТЧ ЛЕВОЕ СОЕДИНЕНИЕ ВнешнийИсточникДанных.до_Axapta.Таблица.СпрНомераГТД КАК СпрНомераГТД ПО ДокСчетаНаОплатуКлиентамТЧ.ГТД = СпрНомераГТД.УИ И (СпрНомераГТД.Сессия = &Сессия) ГДЕ ДокСчетаНаОплатуКлиентамТЧ.Документ В(&Документ) И ДокСчетаНаОплатуКлиентамТЧ.Сессия = &Сессия ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ДокРасходныеНакладныеТЧ.Номенклатура, ДокРасходныеНакладныеТЧ.UNITID, ДокРасходныеНакладныеТЧ.Количество, ДокРасходныеНакладныеТЧ.СтавкаНДС, ДокРасходныеНакладныеТЧ.СуммаНДС, ДокРасходныеНакладныеТЧ.ЦенаСНДС, ДокРасходныеНакладныеТЧ.Сумма, ДокРасходныеНакладныеТЧ.Документ, ВЫБОР КОГДА ДокРасходныеНакладныеТЧ.НомерГТД ЕСТЬ NULL ИЛИ СпрНомераГТД.Страна = "Россия" ТОГДА "" ИНАЧЕ ДокРасходныеНакладныеТЧ.НомерГТД КОНЕЦ, ВЫБОР КОГДА СпрНомераГТД.Страна ЕСТЬ NULL ИЛИ СпрНомераГТД.Страна = "Россия" ТОГДА "" ИНАЧЕ СпрНомераГТД.Страна КОНЕЦ ИЗ ВнешнийИсточникДанных.до_Axapta.Таблица.ДокРасходныеНакладныеТЧ КАК ДокРасходныеНакладныеТЧ ЛЕВОЕ СОЕДИНЕНИЕ ВнешнийИсточникДанных.до_Axapta.Таблица.СпрНомераГТД КАК СпрНомераГТД ПО ДокРасходныеНакладныеТЧ.ГТД = СпрНомераГТД.УИ И (СпрНомераГТД.Сессия = &Сессия) ГДЕ ДокРасходныеНакладныеТЧ.Документ В(&Документ) И ДокРасходныеНакладныеТЧ.Сессия = &Сессия ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ДокПриходныеНакладныеТЧ.Номенклатура, ДокПриходныеНакладныеТЧ.UNITID, ДокПриходныеНакладныеТЧ.Количество, ДокПриходныеНакладныеТЧ.СтавкаНДС, ДокПриходныеНакладныеТЧ.СуммаНДС, ДокПриходныеНакладныеТЧ.ЦенаСНДС, ДокПриходныеНакладныеТЧ.Сумма, ДокПриходныеНакладныеТЧ.Документ, ВЫБОР КОГДА ДокПриходныеНакладныеТЧ.НомерГТД ЕСТЬ NULL ИЛИ СпрНомераГТД.Страна = "Россия" ТОГДА "" ИНАЧЕ ДокПриходныеНакладныеТЧ.НомерГТД КОНЕЦ, ВЫБОР КОГДА СпрНомераГТД.Страна ЕСТЬ NULL ИЛИ СпрНомераГТД.Страна = "Россия" ТОГДА "" ИНАЧЕ СпрНомераГТД.Страна КОНЕЦ ИЗ ВнешнийИсточникДанных.до_Axapta.Таблица.ДокПриходныеНакладныеТЧ КАК ДокПриходныеНакладныеТЧ ЛЕВОЕ СОЕДИНЕНИЕ ВнешнийИсточникДанных.до_Axapta.Таблица.СпрНомераГТД КАК СпрНомераГТД ПО ДокПриходныеНакладныеТЧ.ГТД = СпрНомераГТД.УИ И (СпрНомераГТД.Сессия = &Сессия) ГДЕ ДокПриходныеНакладныеТЧ.Документ В(&Документ) И ДокПриходныеНакладныеТЧ.Сессия = &Сессия Выполнение этого запроса в профайлере начинается следующей строкой: create temporary table TT_2 (invaluelist numeric (10,0)) На что, разумеется, SQL ругается: SQLSTATE 42000 incorrect syntax near temporary Не понимаю, как победить? Платформа 1С - 8.3.4.365 |
|||
1
Fragster
модератор
06.12.13
✎
13:05
|
попробуй 3 ВТ, а потом их объединить уже
|
|||
2
Лаврентий Берия
06.12.13
✎
13:11
|
В трейсере, разумеется!
|
|||
3
IKSparrow
06.12.13
✎
13:15
|
(1) Нельзя ВТ использовать с несколькими внешними источниками.
|
|||
4
Krendel
06.12.13
✎
13:16
|
В зеркале уже предлагали?
|
|||
5
1Сергей
06.12.13
✎
13:17
|
(3) вроде один у тебя
|
|||
6
IKSparrow
06.12.13
✎
13:19
|
(5) Вообще четыре если быть точным.
|
|||
7
IKSparrow
06.12.13
✎
13:19
|
(5) Четыре вообще-то, если быть точным.
|
|||
8
IKSparrow
06.12.13
✎
13:19
|
Четыре разных таблицы одного источника. Но ВТ уже при этих условиях нельзя использовать.
|
|||
9
1Сергей
06.12.13
✎
13:20
|
(8) покажи текст ошибки
|
|||
11
IKSparrow
06.12.13
✎
13:31
|
(10) Да. Но таблиц в нем несколько.
(9) Ошибка выполнения запроса по причине: Ошибка внешней базы данных: ошибка при выполнении запроса по причине: Ошибка ODBC. SQLSTATE: 42000 Номер ошибки: 102 Описание: [Microsoft][SQL Server Native Client 10.0][SQL Server]Incorrect syntax near 'TEMPORARY'. http://www.picshare.ru/view/3443087/ а это по поводу нескольких источников ошибка |
|||
12
1Сергей
06.12.13
✎
13:43
|
(11) видимо, не взлетит.
Много данных? Можно предварительно несколькими запросами повыгружать в ТЗ... Но, если данных много, то будет долго |
|||
13
IKSparrow
06.12.13
✎
13:52
|
(12) Много ( На ТЗ да, можно переписать, но тормозить будет адски (
|
|||
14
IKSparrow
06.12.13
✎
14:04
|
Самое интересно, что на меньшем объеме данных выборка срабатывает. И чистый запрос получается таким:
SELECT {fn CONVERT('Счет на оплату', SQL_WVARCHAR)}, T1.OFFICIALINVOICE4PAYMID, T1.INVOICEDATE, T1.ENTID, T1.CUSTACCOUNTRECID, T1.CONTRACTRECID, T1.CURRENCYCODE, T1.EXCHRATE, CASE WHEN (T1.ISRETURN <> 0) THEN 1 ELSE 0 END, T1.INVOICEAMOUNT, T1.REFRECID, 'Покупатель' FROM "dbo"."EXPCUSTINVOICE4PAYMJOUR" T1 WHERE (T1.STATUS = 0) AND (T1.SESRECID = 5637155582) UNION ALL SELECT 'Расходная накладная', T2.OFFICIALINVOICEID, T2.INVOICEDATE, T2.ENTID, T2.CUSTACCOUNTRECID, T2.CONTRACTRECID, T2.CURRENCYCODE, T2.EXCHRATE, CASE WHEN (T2.ISRETURN <> 0) THEN 1 ELSE 0 END, T2.INVOICEAMOUNT, T2.REFRECID, 'Покупатель' FROM "dbo"."EXPCUSTINVOICEJOUR" T2 WHERE (T2.STATUS = 0) AND (T2.SESRECID = 5637155582) UNION ALL SELECT 'Приходная накладная', T3.INVOICEID, T3.INVOICEDATE, T3.ENTID, T3.VENDACCOUNTRECID, T3.CONTRACTRECID, T3.CURRENCYCODE, T3.EXCHRATE, CASE WHEN (T3.ISRETURN <> 0) THEN 1 ELSE 0 END, T3.INVOICEAMOUNT, T3.REFRECID, {fn CONVERT('Поставщик', SQL_WVARCHAR)} FROM "dbo"."EXPVENDINVOICEJOUR" T3 WHERE (T3.STATUS = 0) AND (T3.SESRECID = 5637155582) ORDER BY 3 А вот при бОльшем объеме данных создается эта чертова временная таблица, которая типа таковой и не является на самом деле. |
|||
15
IKSparrow
06.12.13
✎
14:18
|
Все. Причину появления ошибки я выяснил.
Есть в запросе такой параметр: ДокСчетаНаОплатуКлиентамТЧ.Документ В(&Документ) Это массив, в котором передаются идентификаторы документов, к которым нужно собрать содержимое их табличных частей. Там где запрос срабатывает, количество передаеваемых идентификаторов обычно не более 50. Спотыкается на большом количестве документов. Например, если передать идентификаторы 600 документов. Идентификатор имеет тип INT64. Вот видать тут то 1Ску и корежит. Надо теперь подумать как выйти из положения. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |