Имя: Пароль:
1C
 
Ошибка выполнения запроса (спецам по MS SQL)
0 Гений самоучка
 
20.02.06
14:54
При формировании отчета у клиента вываливается вот такая ошибка (см. ниже)
У клиента 13 платформа на SQL, у меня 12 - файловая.
У меня отчет работает на УРА.
Да и у клиента работал пока не добавил условие

И ВзаиморасчетыСКонтрагентамиОбороты.Регистратор ССЫЛКА Документ.РеализацияТоваровУслуг)

Сам запрос большой, смысла выкладывать нет.
Но запрос не сложный - несколько объединений.
Как вылечить? Подозреваю что что-то нужно подправить в установках MS SQL.


Ошибка СУБД:

Microsoft OLE DB Provider for SQL Server: Internal Query Processor Error: The query processor ran out of stack space during query optimization.

HRESULT=80040E14, SQLSTATE=42000, native=8621

по причине :

Microsoft OLE DB Provider for SQL Server: Internal Query Processor Error: The query processor ran out of stack space during query optimization.

HRESULT=80040E14, SQLSTATE=42000, native=8621
1 Волшебник
 
модератор
20.02.06
14:57
сколько свободного места на диске?
2 Парижская фанера
 
20.02.06
14:58
(1) Бинго.
3 Гений самоучка
 
20.02.06
15:02
Щас узнаю, с клиентом общаюсь только по почте и телефону.
У них есть администратор нормальный, ему только подсказать куда рыть.
Т.е. проблема в свободном простарнсве? Каком? Просто на SQL сервере или в каком-то определенном пространстве самоу СУБД?
4 Волшебник
 
модератор
20.02.06
15:04
(3) stack space
5 Парижская фанера
 
20.02.06
15:05
(3) Это он над младшими всегда издевается, как в (4).
6 Волшебник
 
модератор
20.02.06
15:09
(5) Не всегда. Не надо грязи.
7 Гений самоучка
 
20.02.06
15:11
2(4), (5) :), хотя мне до шуток.
Админ грит - место дох..
Про stack space он не знает, я вообще про MS SQL ничего не знаю
8 Волшебник
 
модератор
20.02.06
15:12
(7) Слепой глухого ведет через дорогу.
9 Salvador Limones
 
20.02.06
15:13
(7) Сервис-пак SQL какой? Похоже SP2.
10 Гений самоучка
 
20.02.06
15:13
2(8):), что поделаешь - отчет мой - мои и проблемы
11 Гений самоучка
 
20.02.06
15:14
2(9) - хм... и к чему это приводит?
12 Волшебник
 
модератор
20.02.06
15:15
13 Ослина
 
20.02.06
15:15
14 Парижская фанера
 
20.02.06
15:17
(7) Варианты.

Попробовать пошевелить настройки "Memory" в SQL сервере.

Сходить на www.sql.ru почитать форум там.

Переделать запрос.
15 Гений самоучка
 
20.02.06
15:19
Ну почему же не знают :), я уже тоже приблизительно это нашел
16 Гений самоучка
 
20.02.06
15:23
Эх, придется запрос переписывать :(, не удалось на админа спихнуть... ;)
17 ШтушаКутуша
 
20.02.06
15:38
(16) а текст запроса было бы неплохо глянуть
18 Гений самоучка
 
20.02.06
15:49
Заметьте, не я это предложил (Покровкие ворота) :)

ВЫБРАТЬ
Зап5.Дт КАК Дт,
Зап5.СтатьяДвижения КАК СтатьяДвижения,
Зап5.Приход КАК Приход,
СУММА(Зап5.Оборот) КАК Оборот,
СУММА(Зап5.План) КАК План
ИЗ
(ВЫБРАТЬ
НАЧАЛОПЕРИОДА(ДДСОбороты.Период, ДЕНЬ) КАК Дт,
ДДСОбороты.СтатьяДвиженияДенежныхСредств.Наименование КАК СтатьяДвижения,
ВЫБОР
КОГДА ДДСОбороты.ПриходРасход = &Приход
ТОГДА "Приход"
ИНАЧЕ "Расход"
КОНЕЦ КАК Приход,
ДДСОбороты.СуммаОборот КАК Оборот,
0 КАК План
ИЗ
РегистрНакопления.ДвиженияДенежныхСредств.Обороты(&ДатаНач, &ДатаКон, День, ) КАК ДДСОбороты
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
НАЧАЛОПЕРИОДА(Заявка.Период, ДЕНЬ),
Заявка.Регистратор.ВидОперации,
"Расход",
0,
Заявка.СуммаОборот
ИЗ
РегистрНакопления.ЗаявкиНаРасходованиеСредств.Обороты(&ДатаНач, &ДатаКон, Регистратор, ) КАК Заявка
ГДЕ
Заявка.СуммаОборот > 0
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
НАЧАЛОПЕРИОДА(Зап4.Дт, ДЕНЬ),
"Оплата покупателями",
"Приход",
0,
Зап4.План
ИЗ
(ВЫБРАТЬ
ВлЗап3.Контрагент КАК Контрагент,
ВЫБОР
КОГДА ЕСТЬNULL(ВлЗап3.ДниДолга, 0) = 0
ТОГДА ВлЗап3.ДатаОплаты
ИНАЧЕ ВЫБОР
КОГДА ВлЗап3.ДниДолгаЦел >= 1
ТОГДА ВЫБОР
КОГДА ДЕНЬНЕДЕЛИ(ДОБАВИТЬКДАТЕ(ВлЗап3.ДатаОплаты, ДЕНЬ, ВлЗап3.ДниДолга + ВлЗап3.ДниДолгаЦел * 2)) < ДЕНЬНЕДЕЛИ(ВлЗап3.ДатаОплаты)
ТОГДА ВЫБОР
КОГДА ДЕНЬНЕДЕЛИ(ДОБАВИТЬКДАТЕ(ВлЗап3.ДатаОплаты, ДЕНЬ, ВлЗап3.ДниДолга + 2 + ВлЗап3.ДниДолгаЦел * 2)) = 6
ТОГДА ДОБАВИТЬКДАТЕ(ВлЗап3.ДатаОплаты, ДЕНЬ, ВлЗап3.ДниДолга + 2 + 2 + ВлЗап3.ДниДолгаЦел * 2)
КОГДА ДЕНЬНЕДЕЛИ(ДОБАВИТЬКДАТЕ(ВлЗап3.ДатаОплаты, ДЕНЬ, ВлЗап3.ДниДолга + 2 + ВлЗап3.ДниДолгаЦел * 2)) = 7
ТОГДА ДОБАВИТЬКДАТЕ(ВлЗап3.ДатаОплаты, ДЕНЬ, ВлЗап3.ДниДолга + 2 + 1 + ВлЗап3.ДниДолгаЦел * 2)
ИНАЧЕ ДОБАВИТЬКДАТЕ(ВлЗап3.ДатаОплаты, ДЕНЬ, ВлЗап3.ДниДолга + 2 + ВлЗап3.ДниДолгаЦел * 2)
КОНЕЦ
КОГДА ДЕНЬНЕДЕЛИ(ДОБАВИТЬКДАТЕ(ВлЗап3.ДатаОплаты, ДЕНЬ, ВлЗап3.ДниДолга + ВлЗап3.ДниДолгаЦел * 2)) = 6
ТОГДА ДОБАВИТЬКДАТЕ(ВлЗап3.ДатаОплаты, ДЕНЬ, ВлЗап3.ДниДолга + ВлЗап3.ДниДолгаЦел * 2 + 2)
КОГДА ДЕНЬНЕДЕЛИ(ДОБАВИТЬКДАТЕ(ВлЗап3.ДатаОплаты, ДЕНЬ, ВлЗап3.ДниДолга + ВлЗап3.ДниДолгаЦел * 2)) = 7
ТОГДА ДОБАВИТЬКДАТЕ(ВлЗап3.ДатаОплаты, ДЕНЬ, ВлЗап3.ДниДолга + ВлЗап3.ДниДолгаЦел * 2 + 1)
ИНАЧЕ ДОБАВИТЬКДАТЕ(ВлЗап3.ДатаОплаты, ДЕНЬ, ВлЗап3.ДниДолга + ВлЗап3.ДниДолгаЦел * 2)
КОНЕЦ
ИНАЧЕ ВЫБОР
КОГДА ДЕНЬНЕДЕЛИ(ДОБАВИТЬКДАТЕ(ВлЗап3.ДатаОплаты, ДЕНЬ, ВлЗап3.ДниДолга)) < ДЕНЬНЕДЕЛИ(ВлЗап3.ДатаОплаты)
ТОГДА ВЫБОР
КОГДА ДЕНЬНЕДЕЛИ(ДОБАВИТЬКДАТЕ(ВлЗап3.ДатаОплаты, ДЕНЬ, ВлЗап3.ДниДолга + 2)) = 6
ТОГДА ДОБАВИТЬКДАТЕ(ВлЗап3.ДатаОплаты, ДЕНЬ, ВлЗап3.ДниДолга + 2 + 2)
КОГДА ДЕНЬНЕДЕЛИ(ДОБАВИТЬКДАТЕ(ВлЗап3.ДатаОплаты, ДЕНЬ, ВлЗап3.ДниДолга + 2)) = 7
ТОГДА ДОБАВИТЬКДАТЕ(ВлЗап3.ДатаОплаты, ДЕНЬ, ВлЗап3.ДниДолга + 2 + 1)
ИНАЧЕ ДОБАВИТЬКДАТЕ(ВлЗап3.ДатаОплаты, ДЕНЬ, ВлЗап3.ДниДолга + 2)
КОНЕЦ
КОГДА ДЕНЬНЕДЕЛИ(ДОБАВИТЬКДАТЕ(ВлЗап3.ДатаОплаты, ДЕНЬ, ВлЗап3.ДниДолга)) = 6
ТОГДА ДОБАВИТЬКДАТЕ(ВлЗап3.ДатаОплаты, ДЕНЬ, ВлЗап3.ДниДолга + 2)
КОГДА ДЕНЬНЕДЕЛИ(ДОБАВИТЬКДАТЕ(ВлЗап3.ДатаОплаты, ДЕНЬ, ВлЗап3.ДниДолга)) = 7
ТОГДА ДОБАВИТЬКДАТЕ(ВлЗап3.ДатаОплаты, ДЕНЬ, ВлЗап3.ДниДолга + 1)
ИНАЧЕ ДОБАВИТЬКДАТЕ(ВлЗап3.ДатаОплаты, ДЕНЬ, ВлЗап3.ДниДолга)
КОНЕЦ
КОНЕЦ
КОНЕЦ КАК Дт,
ВлЗап3.Приход КАК План
ИЗ
(ВЫБРАТЬ
ВзаиморасчетыСКонтрагентамиОбороты.ДоговорКонтрагента.Владелец КАК Контрагент,
НАЧАЛОПЕРИОДА(ВзаиморасчетыСКонтрагентамиОбороты.Период, ДЕНЬ) КАК ДатаДок,
НАЧАЛОПЕРИОДА(ВЫБОР
КОГДА ВзаиморасчетыСКонтрагентамиОбороты.Регистратор.ДатаОплаты ЕСТЬ NULL
ИЛИ ВзаиморасчетыСКонтрагентамиОбороты.Регистратор.ДатаОплаты = ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0)
ТОГДА ВЫБОР
КОГДА ВзаиморасчетыСКонтрагентамиОбороты.Регистратор.ДатаОтгрузки ЕСТЬ NULL
ИЛИ ВзаиморасчетыСКонтрагентамиОбороты.Регистратор.ДатаОтгрузки = ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0)
ТОГДА ВзаиморасчетыСКонтрагентамиОбороты.Период
ИНАЧЕ ВзаиморасчетыСКонтрагентамиОбороты.Регистратор.ДатаОтгрузки
КОНЕЦ
ИНАЧЕ ВзаиморасчетыСКонтрагентамиОбороты.Регистратор.ДатаОплаты
КОНЕЦ, ДЕНЬ) КАК ДатаОплаты,
ВЫБОР
КОГДА ВзаиморасчетыСКонтрагентамиОбороты.Регистратор.ДатаОплаты ЕСТЬ NULL
ИЛИ ВзаиморасчетыСКонтрагентамиОбороты.Регистратор.ДатаОплаты = ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0)
ТОГДА ЕСТЬNULL(ВзаиморасчетыСКонтрагентамиОбороты.ДоговорКонтрагента.ДопустимоеЧислоДнейЗадолженности, 0)
ИНАЧЕ 0
КОНЕЦ КАК ДниДолга,
ВЫБОР
КОГДА ВзаиморасчетыСКонтрагентамиОбороты.Регистратор.ДатаОплаты ЕСТЬ NULL
ИЛИ ВзаиморасчетыСКонтрагентамиОбороты.Регистратор.ДатаОплаты = ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0)
ТОГДА ВЫРАЗИТЬ(ЕСТЬNULL(ВзаиморасчетыСКонтрагентамиОбороты.ДоговорКонтрагента.ДопустимоеЧислоДнейЗадолженности / 7, 0) - 0.5 КАК ЧИСЛО(3, 0))
ИНАЧЕ 0
КОНЕЦ КАК ДниДолгаЦел,
ВзаиморасчетыСКонтрагентамиОбороты.СуммаВзаиморасчетовПриход КАК Приход
ИЗ
РегистрНакопления.ВзаиморасчетыСКонтрагентами.Обороты(&ДатаНач2, &ДатаКон, Регистратор, ) КАК ВзаиморасчетыСКонтрагентамиОбороты
ГДЕ
ВзаиморасчетыСКонтрагентамиОбороты.ДоговорКонтрагента.Владелец ЕСТЬ НЕ NULL
И ВзаиморасчетыСКонтрагентамиОбороты.СуммаВзаиморасчетовПриход > 0

//Вот это условие все портит, постараюсь его наверх вытащить
И ВзаиморасчетыСКонтрагентамиОбороты.Регистратор ССЫЛКА Документ.РеализацияТоваровУслуг) КАК ВлЗап3

) КАК Зап4
ГДЕ
Зап4.Дт МЕЖДУ &ДатаНач И &ДатаКон) КАК Зап5
СГРУППИРОВАТЬ ПО
Зап5.Приход,
Зап5.СтатьяДвижения,
Зап5.Дт
УПОРЯДОЧИТЬ ПО
Приход,
СтатьяДвижения,
Дт
ИТОГИ ПО
Приход,
СтатьяДвижения,
Дт ПЕРИОДАМИ(ДЕНЬ, &ДатаНач, &ДатаКон)