19.10.17 — 06:46
Бухгалтерия 1.6.8.3 сконвертированная под платформой 8.3.5.1231, SQL
После доработки ОСВ по счету при формировании по счетам 62(9 субсчетов), 76(более 15 субсчетов) и еще некоторым счетам возникает следующая ошибка: «Ошибка СУБД: Внутренняя ошибка, был достигнут предел служб выражений». Полный текст ошибки — http://prntscr.com/gz7ft4 В файловой копии базы такой ошибки нет, запрос на ней выполняется около 4х секунд
Доработка следующая: в тексте основного запроса поля субконто1, субконто2 и т.д. сделаны опциональными, то есть для каждого субсчета выбирается свое субконто, подходящее по типу значения.
Тест запроса стандартный, до изменения:
«ВЫБРАТЬ РАЗРЕШЕННЫЕ
ОстаткиИОбороты.Счет КАК Счет,
СуммаНачальныйОстатокДт КАК СуммаНачальныйОстатокДт,
СуммаНачальныйОстатокКт КАК СуммаНачальныйОстатокКт,
СуммаОборотДт КАК СуммаОборотДт,
СуммаОборотКт КАК СуммаОборотКт,
СуммаКонечныйОстатокДт КАК СуммаКонечныйОстатокДт,
СуммаКонечныйОстатокКт КАК СуммаКонечныйОстатокКт,
ОстаткиИОбороты.Субконто1 КАК Субконто1,
ОстаткиИОбороты.Субконто2 КАК Субконто2
ИЗ
РегистрБухгалтерии.Хозрасчетный.ОстаткиИОбороты(&ДатаНач, &ДатаКон, , , Счет В ИЕРАРХИИ (&Счет),
, Организация = &Организация ) КАК ОстаткиИОбороты
ИТОГИ
СУММА(СуммаНачальныйОстатокДт),
СУММА(СуммаНачальныйОстатокКт),
СУММА(СуммаОборотДт),
СУММА(СуммаОборотКт),
СУММА(СуммаКонечныйОстатокДт),
СУММА(СуммаКонечныйОстатокКт)
ПО ОБЩИЕ,
Счет ИЕРАРХИЯ КАК Счет ,
Субконто1,
Субконто2
АВТОУПОРЯДОЧИВАНИЕ
»
——————————————————-
Текст запроса после доработки:
«ВЫБРАТЬ РАЗРЕШЕННЫЕ
ОстаткиИОбороты.Счет КАК Счет,
СуммаНачальныйОстатокДт КАК СуммаНачальныйОстатокДт,
СуммаНачальныйОстатокКт КАК СуммаНачальныйОстатокКт,
СуммаОборотДт КАК СуммаОборотДт,
СуммаОборотКт КАК СуммаОборотКт,
СуммаКонечныйОстатокДт КАК СуммаКонечныйОстатокДт,
СуммаКонечныйОстатокКт КАК СуммаКонечныйОстатокКт,
ВЫБОР КОГДА ТИПЗНАЧЕНИЯ(ОстаткиИОбороты.Субконто1) = &ТипИзмерения1 ТОГДА ОстаткиИОбороты.Субконто1
КОГДА ТИПЗНАЧЕНИЯ(ОстаткиИОбороты.Субконто2) = &ТипИзмерения1 ТОГДА ОстаткиИОбороты.Субконто2
КОГДА ТИПЗНАЧЕНИЯ(ОстаткиИОбороты.Субконто3) = &ТипИзмерения1 ТОГДА ОстаткиИОбороты.Субконто3
КОНЕЦ КАК Субконто1,
ВЫБОР КОГДА ТИПЗНАЧЕНИЯ(ОстаткиИОбороты.Субконто1) = &ТипИзмерения2 ТОГДА ОстаткиИОбороты.Субконто1
КОГДА ТИПЗНАЧЕНИЯ(ОстаткиИОбороты.Субконто2) = &ТипИзмерения2 ТОГДА ОстаткиИОбороты.Субконто2
КОГДА ТИПЗНАЧЕНИЯ(ОстаткиИОбороты.Субконто3) = &ТипИзмерения2 ТОГДА ОстаткиИОбороты.Субконто3
КОНЕЦ КАК Субконто2
ИЗ
РегистрБухгалтерии.Хозрасчетный.ОстаткиИОбороты(&ДатаНач, &ДатаКон, , , Счет В ИЕРАРХИИ (&Счет),
, Организация = &Организация ) КАК ОстаткиИОбороты
ИТОГИ
СУММА(СуммаНачальныйОстатокДт),
СУММА(СуммаНачальныйОстатокКт),
СУММА(СуммаОборотДт),
СУММА(СуммаОборотКт),
СУММА(СуммаКонечныйОстатокДт),
СУММА(СуммаКонечныйОстатокКт)
ПО ОБЩИЕ,
Счет ИЕРАРХИЯ КАК Счет ,
Субконто1,
Субконто2
АВТОУПОРЯДОЧИВАНИЕ
»
ТипИзмерения — тип детализации в настройке отчета
Без этой доработки осв по счету формируется с некорректной детализацией, к примеру у всех субсчетов субконто1 имеет вид «Подразделения», а у одного субсчета «подразделения» это субконто2, то при задании в настройках детализации по «подразделениям», последний субсчет детализируется в пустом поле. Исправлена эта ошибка только в бухгалтерии редакции 3.0, мне нужно доработать бухгалтерию 1.6 своими силами.
По остальным счетам ОСВ формируется корректно(счет 91.08 — 11 субсчетов). Гугл выдает информацию о том, что данная ошибка проявляется на SQL, для файловой версии и Postgre такой проблемы нет. Пожалуйста, подскажите, как можно ее устранить или хотя бы обойти?
Более подробно причины доработок указаны в предыдущей теме: ОСВ по счету ошибка детализации по субконто
4 — 19.10.17 — 08:37
(3) Да, была такая идея, но не совсем понимаю как получить тот же результат по итогам, если указан итог по «Счет ИЕРАРХИЯ», то есть оператором «выбор когда» я получаю субконто уже по тому, что получилось в результате иерархических итогов (счет = 91, у него субконто1 всегда одинаковое, а у его субсчетов может быть разное)
5 — 19.10.17 — 08:45
(2) Конкретно для осв по счету: берется выбранный счет, к примеру 10, анализируются его субконто(субконто1 — номенклатура, субконто2 — склады), на основании этого заполняется настройка детализации: «По номенклатуре, по складам», если убираем детализацию по складам, в запрос выше попадает только субконто1 — номенклатура, по умолчанию там оба субконто(поля запроса формируются циклом).
Benevalete
13 — 23.10.17 — 03:05
Примерный текст запроса:
«ВЫБРАТЬ РАЗРЕШЕННЫЕ
| ОстаткиИОбороты.Счет КАК Счет,
| ОстаткиИОбороты.СуммаНачальныйОстатокДт КАК СуммаНачальныйОстатокДт,
| ОстаткиИОбороты.СуммаНачальныйОстатокКт КАК СуммаНачальныйОстатокКт,
| ОстаткиИОбороты.СуммаОборотДт КАК СуммаОборотДт,
| ОстаткиИОбороты.СуммаОборотКт КАК СуммаОборотКт,
| ОстаткиИОбороты.СуммаКонечныйОстатокДт КАК СуммаКонечныйОстатокДт,
| ОстаткиИОбороты.СуммаКонечныйОстатокКт КАК СуммаКонечныйОстатокКт,
| ВЫБОР
| КОГДА ТИПЗНАЧЕНИЯ(ОстаткиИОбороты.Субконто1) = &ТипИзмерения1
| ТОГДА ОстаткиИОбороты.Субконто1
| КОГДА ТИПЗНАЧЕНИЯ(ОстаткиИОбороты.Субконто2) = &ТипИзмерения1
| ТОГДА ОстаткиИОбороты.Субконто2
| КОГДА ТИПЗНАЧЕНИЯ(ОстаткиИОбороты.Субконто3) = &ТипИзмерения1
| ТОГДА ОстаткиИОбороты.Субконто3
| КОНЕЦ КАК Субконто1,
| ВЫБОР
| КОГДА ТИПЗНАЧЕНИЯ(ОстаткиИОбороты.Субконто1) = &ТипИзмерения2
| ТОГДА ОстаткиИОбороты.Субконто1
| КОГДА ТИПЗНАЧЕНИЯ(ОстаткиИОбороты.Субконто2) = &ТипИзмерения2
| ТОГДА ОстаткиИОбороты.Субконто2
| КОГДА ТИПЗНАЧЕНИЯ(ОстаткиИОбороты.Субконто3) = &ТипИзмерения2
| ТОГДА ОстаткиИОбороты.Субконто3
| КОНЕЦ КАК Субконто2
|ПОМЕСТИТЬ ВТ
|ИЗ
| РегистрБухгалтерии.Хозрасчетный.ОстаткиИОбороты(&ДатаНач, &ДатаКон, , , Счет В ИЕРАРХИИ (&Счет), , Организация = &Организация) КАК ОстаткиИОбороты
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ВТ.Счет КАК Счет,
| ВТ.СуммаНачальныйОстатокДт КАК СуммаНачальныйОстатокДт,
| ВТ.СуммаНачальныйОстатокКт КАК СуммаНачальныйОстатокКт,
| ВТ.СуммаОборотДт КАК СуммаОборотДт,
| ВТ.СуммаОборотКт КАК СуммаОборотКт,
| ВТ.СуммаКонечныйОстатокДт КАК СуммаКонечныйОстатокДт,
| ВТ.СуммаКонечныйОстатокКт КАК СуммаКонечныйОстатокКт,
| ЕСТЬNULL(ВТ.Субконто1, НЕОПРЕДЕЛЕНО) КАК Субконто1,
| ЕСТЬNULL(ВТ.Субконто2, НЕОПРЕДЕЛЕНО) КАК Субконто2,
| ПРЕДСТАВЛЕНИЕ(ЕСТЬNULL(ВТ.Субконто1, НЕОПРЕДЕЛЕНО)) КАК Субконто1Представление,
| ПРЕДСТАВЛЕНИЕ(ЕСТЬNULL(ВТ.Субконто2, НЕОПРЕДЕЛЕНО)) КАК Субконто2Представление,
| ПРЕДСТАВЛЕНИЕ(ВТ.Счет)
|ИЗ
| ВТ КАК ВТ
|ИТОГИ
| СУММА(СуммаНачальныйОстатокДт),
| СУММА(СуммаНачальныйОстатокКт),
| СУММА(СуммаОборотДт),
| СУММА(СуммаОборотКт),
| СУММА(СуммаКонечныйОстатокДт),
| СУММА(СуммаКонечныйОстатокКт)
|ПО
| ОБЩИЕ,
| Счет ИЕРАРХИЯ,
| Субконто1,
| Субконто2
|АВТОУПОРЯДОЧИВАНИЕ»;
У меня есть хранимая процедура SQL Server с почти 300 переменными внутри нее.
Переменные были созданы следующим образом:
CASE WHEN Grp1 = 'SALES' AND grp_mnth = MONTH_0 THEN SUM(Col) OVER(PARTITION BY grp_loc,COMM) ELSE 0 END AS "SALES_1"
Поскольку у этого есть проблема с данными, все переменные были заменены следующим образом:
SUM(CASE WHEN Grp1 = 'SALES' AND grp_mnth = MONTH_0 THEN Col ELSE 0 END) OVER(PARTITION BY grp_loc,COMM) AS "SALES_1"
Проблема с данными была решена с помощью приведенного выше оператора, но процедура выдает следующую ошибку, когда мы добавляем все 300 переменных. Если добавлено только около 100, процедура работает нормально.
Внутренняя ошибка: достигнут предел служб выражений. Поищите в своем запросе потенциально сложные выражения и постарайтесь их упростить.
В соответствии с опубликованным ответом я попытался разбить запрос на несколько запросов выбора, и ошибка была устранена, но при объединении результата данные не были получены правильно.
BEGIN
CREATE TABLE #TEMPTAB1
(
TYPE_1 char(15),
NUMBER_1 char(7),
STATUS_1 char(1),
...
)
CREATE TABLE #TEMPTAB2
(
TYPE_2 char(15),
NUMBER_2 char(7),
STATUS_2 char(1),
...
)
CREATE TABLE #TEMPTAB3
(
TYPE_3 char(15),
NUMBER_3 char(7),
STATUS_3 char(1),
...
)
SELECT * FROM
#TEMPTAB1 T1
INNER JOIN
#TEMPTAB2 T2 ON T1.TYPE_1=T2.TYPE_2 AND T1.NUMBER_1 = T2.NUMBER_2 AND T1.STATUS_1 = T2.STATUS_2
INNER JOIN
#TEMPTAB3 T3 ON T1.TYPE_1=T3.TYPE_3 AND T1.NUMBER_1 = T3.NUMBER_3 AND T1.STATUS_1 = T3.STATUS_3
END
Может ли кто-нибудь предложить способ исправить соединения в приведенном выше коде.
2 ответа
Лучший ответ
Пожалуйста, напишите запрос еще раз!
Эта проблема возникает из-за того, что SQL Server ограничивает количество идентификаторов и констант, которые могут содержаться в одном выражении запроса. Это ограничение составляет 65 535.
Один из подходов может быть таким:
Вы можете разделить запрос на выборку на несколько запросов, сохранить результат во временных таблицах и объединить результаты в конце.
больше информации
8
Tharif
12 Авг 2015 в 06:31
Для меня это была версия SQL Server. У меня не было проблем с запуском того же запроса к SQL Server 2017 в производственной среде, но я столкнулся с проблемой с SQL Server 2018 на стадии подготовки. Я понизил свою версию SQL Server до 2017 года с 2018 года на производстве, и проблема была решена. На данный момент это может быть проблемой с SQL Server 2018.
0
Raghav
4 Дек 2019 в 10:16
Проблемы
При выполнении запроса в Microsoft SQL Server 2005 может появиться следующее сообщение об ошибке:
Сервер: сообщение 8632, уровень 17, состояние 2, строка 1 Внутренняя ошибка: достигнут предел служб выражений. Найдите в запросе потенциально сложные выражения и попробуйте их упростить.
Причина
Эта проблема возникает из-за того, что SQL Server ограничивает количество идентификаторов и констант, которые могут содержаться в одном выражении запроса. Это ограничение — 65 535. Например, в следующем запросе есть только одно выражение:
Select a, b + c, d + eЭто выражение извлекает все пять столбцов, вычисляет операторы сложения и отправляет клиенту три прогнозных результата. В SQL Server 2005 запросы внутренне нормализованы и упрощены так же, как в Microsoft SQL Server 2000. Таким образом, некоторые запросы, содержащие большое количество констант и идентификаторов, могут успешно компилироваться в SQL Server 2000. Однако одни и те же запросы не работают в SQL Server 2005. Проверка количества идентификаторов и констант производится после того, как SQL Server расширяет все указанные идентификаторы и константы. Например, могут быть развернуты следующие элементы:
-
Звездочка (*) в списке выбора
-
Представление
-
Определение вычисляемого столбца
Если число, указанное после расширения, превышает предельное значение, запрос не может быть выполнен.
Обходное решение
Чтобы устранить эту ошибку, перепишите запрос. Сослаться на меньшее число идентификаторов и констант в максимальном выражении запроса. Необходимо убедиться в том, что количество идентификаторов и констант в каждом выражении запроса не превышает предельное значение. Для этого, возможно, придется разбить запрос на более чем один запрос. Затем создайте временный промежуточный результат.