Как я могу добавить «-» перед именем для обозначения иерархических позиций в рекурсивной хранимой процедуре - PullRequest
0 голосов
/ 06 июля 2018

Я пытаюсь создать древовидное представление в SSMS, используя рекурсивный SP.

Вот мой код ...

@p_Renumber NVARCHAR(7)
AS
DECLARE @orgChart TABLE
(
HMY NUMERIC(18,0) NOT NULL,
RENUMBER NVARCHAR(7) NOT NULL,
MANAGER_ID NVARCHAR(7) NULL,
ORGLEVEL NUMERIC(18,0) NOT NULL
);

WITH OrgChartDown (HMY, RENUMBER, MANAGER_ID, ORGLEVEL)
AS
(
-- Anchor member definition
SELECT HMY, RENUMBER, MANAGER_ID, 0 AS ORGLEVEL
FROM dbo.Employees
WHERE RENUMBER = @p_Renumber

UNION ALL

-- Recursive member definition down tree
SELECT e.HMY, e.RENUMBER, e.MANAGER_ID, o.ORGLEVEL + 1
FROM dbo.Employees e    
INNER JOIN OrgChartDown o ON e.MANAGER_ID = o.RENUMBER
WHERE e.[STATUS] = 1
)

INSERT INTO @orgChart
SELECT HMY, RENUMBER, MANAGER_ID, ORGLEVEL
FROM OrgChartDown;

WITH OrgChartUp (HMY, RENUMBER, MANAGER_ID, ORGLEVEL)
AS
(
-- Anchor member definition
SELECT HMY, RENUMBER, MANAGER_ID, 0 AS ORGLEVEL
FROM dbo.Employees
WHERE RENUMBER = @p_Renumber

UNION ALL

-- Recursive member definition up tree
SELECT e.HMY, e.RENUMBER, e.MANAGER_ID, o.ORGLEVEL - 1
FROM dbo.Employees e        
INNER JOIN OrgChartUp o ON e.RENUMBER = o.MANAGER_ID
WHERE o.RENUMBER != o.MANAGER_ID --CEO's MANAGER_ID equals own RENUMBER
  AND e.[STATUS] = 1
)

INSERT INTO @orgChart
SELECT HMY, RENUMBER, MANAGER_ID, ORGLEVEL
FROM OrgChartUp
WHERE RENUMBER != @p_Renumber;

SELECT e.HMY, e.RENUMBER, e.FIRST_NAME + ' ' + e.LAST_NAME AS "NAME", 
e.JOB_TITLE, e.MANAGER_ID, o.ORGLEVEL
FROM @orgChart o
INNER JOIN Employees e ON o.HMY = e.HMY
ORDER BY o.ORGLEVEL, e.LAST_NAME
GO

Я сейчас получаю результаты ...

JOB_TITLE                                       ORGLEVEL
President & CEO                                 -2
Chief Administrative Officer                    -1
Senior Director IT Business Applications        0
Test Tile   EMG --(test entity in database)--   1
Senior Applications Developer                   1
Senior Applications Developer                   1
Contractor                                      1
Senior Applications Developer                   1
Lead Systems Analyst                            1
Lead Systems Analyst                            1

(другие поля скрыты для обеспечения информационной безопасности / целостности)

Мой вопрос заключается в том, как добавить тире ("-") при переходе по иерархическим данным.

Логика заключается в том, чтобы взять ABS (самый верхний ORGLEVEL), поэтому в этом примере кода ответ будет: ABS (-2) = 2, а затем добавьте это ко всем ORGLEVELS, чтобы президент и ORGLEVEL генерального директора будет равен 0.
С этим недавно сохраненным ORGLEVEL я хотел бы добавить тире ("-"), чтобы соответствовать значению. То есть мои данные будут выглядеть примерно так ...

JOB_TITLE                                           ORGLEVEL
President & CEO                                     0
-Chief Administrative Officer                       1
--Senior Director IT Business Applications          2
---Test Tile   EMG --(test entity in database)--    3
---Senior Applications Developer                    3
---Senior Applications Developer                    3
---Contractor                                       3
---Senior Applications Developer                    3
---Lead Systems Analyst                             3
---Lead Systems Analyst                             3

Я знаю, что есть способ сделать это в коде HTML, который я использую для привязки к моей веб-форме, но, поскольку это динамическое решение, я хотел бы, чтобы это было сделано в хранимой процедуре, поэтому это простая привязка данных ( ) к сетке, которую я использую. Дайте мне знать, если у вас есть какие-либо решения этой проблемы.

Ответы [ 2 ]

0 голосов
/ 06 июля 2018

Вы можете попробовать это в вашем запросе

replicate('-', (ABS((select min(o.ORGLEVEL) from @orgChart)) + o.ORGLEVEL)) + e.JOB_TITLE
0 голосов
/ 06 июля 2018

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

e.JOB_TITLE, e.MANAGER_ID, o.ORGLEVEL

до

REPLICATE('-',o.ORGLEVEL+2) + e.JOB_TITLE AS JOB_TITLE,
e.MANAGER_ID,
o.ORGLEVEL + 2 AS ORGLEVEL
...