Выражения case могут быть вложенными только до уровня 10

Обновлено: 21.11.2024

Понятно, что здесь нет вложенного CASE выражения, хотя существует более 10 «ветвей».

Еще одна странность. Эта встроенная табличная функция выдает ту же ошибку:

Но похожий мульти-оператор TVF работает нормально:

Очевидно, здесь нет вложенного CASE выражения.

Нет в тексте запроса, нет. Но парсер всегда расширяет CASE выражения до вложенной формы:

Этот запрос является локальным (без связанного сервера), и Compute Scalar определяет следующее выражение:

Это хорошо, когда выполняется локально, потому что синтаксический анализатор не видит вложенный CASE оператор более чем на 10 уровней (хотя он передает его на более поздние этапы компиляции локальных запросов).

Однако на связанном сервере сгенерированный текст может быть отправлен на удаленный сервер для компиляции. Если это так, то удаленный анализатор видит вложенный CASE оператор глубиной более 10 уровней, и вы получаете ошибку 8180.

Еще одна странность. Эта встроенная табличная функция выдает ту же ошибку

Встроенная функция развернута на месте в исходный текст запроса, поэтому неудивительно, что те же самые ошибки появляются на связанном сервере.

Но аналогичный мульти-оператор TVF работает нормально

Похоже, но не то же самое. MsTVF включает в себя неявное преобразование в varchar(max) , что предотвращает CASE отправку выражения на удаленный сервер. Поскольку значение CASE оценивается локально, синтаксический анализатор никогда не видит чрезмерно вложенный тип, CASE и ошибки нет. Если вы измените определение таблицы с varchar(max) неявного типа CASE результата - varchar(2) выражение будет удалено с msTVF, и вы получите ошибку.

В конечном счете, ошибка возникает, когда CASE удаленный сервер оценивает вложенную информацию . Если в CASE итераторе удаленного запроса не выполняется оценка, ошибки не отображаются. Например, следующее включает в себя объект, CONVERT который не является удаленным, поэтому ошибка не возникает, даже если используется связанный сервер:

Я догадываюсь, что запрос переписывается где-то по пути, чтобы иметь немного другую CASE структуру, например

Одним из обходных путей (кроме изменения функции, которое вы добавили в свой вопрос) было бы создание представления или хранимой процедуры на связанном сервере и ссылка на него вместо передачи полного запроса через поставщика связанного сервера.

Другой (при условии, что ваш запрос действительно такой упрощенный, и вам просто нужен числовой коэффициент букв az) должен иметь:

Если вам абсолютно необходимо, чтобы это работало как есть, я предлагаю вам связаться со службой поддержки напрямую и открыть дело, хотя я не могу ручаться за результаты - они могут просто предоставить вам обходные пути, к которым у вас уже есть доступ на этой странице.

Читайте также: