Это ошибка с встраиванием скалярных пользовательских функций в SQL Сервер 2019.
План выполнения выглядит следующим образом
Значение, переданное функции, выводится из константы сканирования в правом верхнем углу и имеет псевдоним Expr1000
. Это передается до тех пор, пока, в конце концов, оно не попадет в вычисляемый скаляр, содержащий следующее выражение
[Expr1007]=CASE
WHEN CHARINDEX('.', [Expr1000]) > ( 0 )
THEN CONVERT(BIGINT, PARSENAME(CONVERT_IMPLICIT(nvarchar(18), [Expr1000], 0), ( 2 )), 0)
ELSE CONVERT(BIGINT, [Expr1000], 0)
END
В случае, если вход не является удаленным числом c, это взорвется независимо от того, по какому пути CASE
выражение в конечном итоге принимает.
Проблема выглядит как здесь . Постоянное сканирование, выделенное зеленым цветом, находится во внутреннем соединении с предикатом сквозного прохождения, поэтому будет оцениваться только в том случае, если тест ISNUMERIC
был истинным. Список вывода для этого постоянного сканирования пуст, поэтому я предполагаю, что, скорее всего, выражение было перемещено оттуда с теми же ошибочными логами c, что и для связанного ответа.
Вы можете использовать WITH INLINE = OFF
, чтобы отключить встраивание для эту функцию, но, скорее всего, вам следует просто полностью удалить ее и заменить на TRY_CONVERT
(или хотя бы заменить тело функции на это, если невозможно удалить ее полностью в это время)