Возникла такая задача - сделать запрос к многоуровневому справочнику с поиском по наименованию. Т.е. типа найти элемент на третьем уровне по строке
Наименование1\Наименование2\Наименование3До сих пор это делалось рекурсией и Спр.НайтиПоНаименованию(). Мне показалось это несколько медленным .... особенно при частых вызовах. Попробовал написать через SQL - вышло в 2-3 раза медленнее
Основное время занимала подготовка запроса - т.е. метод Открыть(). Ну, думаю, построю один раз параметризированный универсальный запрос и уже буду вызывать его, уже готовый. Но оказалось не так просто сделать универсальный запрос для любого количества уровней. Вот что примерно получилось для пяти уровней
select Константы1.ID as [ТекущийОбъект1 $Справочник.КонстантыПользователей],Константы2.ID as [ТекущийОбъект2 $Справочник.КонстантыПользователей],Константы3.ID as [ТекущийОбъект3 $Справочник.КонстантыПользователей],Константы4.ID as [ТекущийОбъект4 $Справочник.КонстантыПользователей],Константы5.ID as [ТекущийОбъект5 $Справочник.КонстантыПользователей]
from $Справочник.КонстантыПользователей as Константы1, $Справочник.КонстантыПользователей as Константы2, $Справочник.КонстантыПользователей as Константы3, $Справочник.КонстантыПользователей as Константы4, $Справочник.КонстантыПользователей as Константы5
where Константы1.Descr LIKE ?
and (( Константы2.Descr LIKE ? and Константы2.ParentID = Константы1.ID and Константы2.IsMark = 0) or 2 > ? )
and (( Константы3.Descr LIKE ? and Константы3.ParentID = Константы2.ID and Константы3.IsMark = 0) or 3 > ? )
and (( Константы4.Descr LIKE ? and Константы4.ParentID = Константы3.ID and Константы4.IsMark = 0) or 4 > ? )
and (( Константы5.Descr LIKE ? and Константы5.ParentID = Константы4.ID and Константы5.IsMark = 0) or 5 > ? )
В конце каждого условия 2 > ?, 3 > ? и т.д. - это попытка отключить условия неиспользуемых в данный момент уровней (т.е. на месте параметра макс. номер уровня). Для пяти уровней это естественно работает. Но если делаем запрос к примеру по трем уровням справочника, последние две строки как-бы "отключаются", т.е. всегда TRUE: (4 > 3 и 5 > 3) ....... и блин в выборку попадает куча "повторов" от 4, 5 уровней. Ну т.е. практически весь справочник да еще два раза....
Может отсеять это как-то distinct или еще как - но знаний TSQL не хватает
Или-же это вообще невозможно, типа как рекурсивный разбор с помощью RegExp?!
Единственная мысль как это обойти - подготовить 5 запросов, каждый для своего уровня, постоянно их хнаить и вызывать нужный .... но боюсь что мысль "не совсем умная"