Следующий запрос работал до тех пор, пока я не добавил предложение WHERE.
SELECT
PersonTable.FullName,
View_PersonToHead.DirectorId
FROM PersonTable
LEFT JOIN View_PersonToDirector ON PersonTable.PersonId = View_PersonToDirector.PersonId
WHERE View_PersonToDirector.DirectorId = 12345 --No error if this line is removed
Сообщение об ошибке:
Недопустимый параметр длины, переданный в функцию RIGHT.
Это наводит меня на мысль, что произошла ошибка в том, как я написал View_PersonToDirector
представление. Что-то в добавлении предложения WHERE приводит к тому, что запрос оценивается / оптимизируется по-другому, в результате чего возникает некоторая проблема.
Внутренние компоненты View_PersonToDirector
:
WITH items AS (
SELECT
PersonId,
0 AS [Level],
CAST(PersonId AS VARCHAR(255)) AS [Path]
FROM PersonTable
UNION ALL
SELECT
e.PersonId,
[Level] + 1,
CAST([Path] + ' < ' + CAST(e.PersonId AS VARCHAR(255)) AS VARCHAR(255))
FROM PersonTable e
INNER JOIN items itms ON itms.PersonId = e.ManagerId
)
SELECT
A.PersonId,
CASE
WHEN A.[Level] = 1
THEN A.PersonId
ELSE CAST(LEFT(A.PathToDirector, CHARINDEX(' ', A.PathToDirector)) AS INT)
END AS DirectorId
FROM (
SELECT
items.PersonId,
items.[Level],
RIGHT(items.[Path], LEN(items.[Path])-7) AS PathToDirector
FROM items
WHERE Path LIKE '1111 < %' --Id of director
) A
Я подозреваю, что наличие оператора WITHВ представлении cte оптимизатор запросов работает по-разному, применяя фильтрацию WHERE в другом порядке. Это плохая практика?