Предположим, у меня есть таблица, как:Как пройти путь в таблице с id & parentId?
id | parentId | name
1 NULL A
2 1 B
3 2 C
4 1 E
5 3 E
Я пытаюсь написать скалярную функцию можно назвать, как:
SELECT dbo.GetId('A/B/C/E')
, который будет производить «5», если мы используем вышеупомянутую справочную таблицу. Функция будет выполнить следующие шаги:
- Найти идентификатор 'A', который является 1
- Найти идентификатор 'B', чей родитель 'А' (ID: 1), который будет id: 2
- Найти идентификатор 'C', родительский элемент которого является 'B' (id: 2), который будет идентификатором: 3
- Найти идентификатор 'E', родитель которого является 'C' (id: 3), который будет равен: 5
Я пытался сделать это с помощью цикла WHILE, но он очень быстро становился очень сложным ... Просто думая, что должен быть простой способ сделать это.
Вы должны стараться избегать использования скалярной функции как можно больше. Они ужасно неэффективны. Еще хуже, когда вы начинаете бросать в них петли. Это звучит для меня как очень типичный рекурсивный cte. Не совсем уверен, но почему вы передадите этот список имен с разделителями. –
@SeanLange - спасибо, я знаю о неэффективности скалярной функции - это просто требование, которое у меня есть. – Denis
Странные требования, но что угодно. Если вам действительно нужна помощь, вы можете опубликовать некоторые подробности? Является ли это рекурсивным запросом или вы просто пытаетесь разобрать список с разделителями и выполнять запрос для каждого значения? –