Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 在递归存储过程中,如何在名称之前添加“-”来表示层次结构的排名_Sql_Sql Server_Recursion_Stored Procedures_Recursive Query - Fatal编程技术网

Sql 在递归存储过程中,如何在名称之前添加“-”来表示层次结构的排名

Sql 在递归存储过程中,如何在名称之前添加“-”来表示层次结构的排名,sql,sql-server,recursion,stored-procedures,recursive-query,Sql,Sql Server,Recursion,Stored Procedures,Recursive Query,我正在尝试使用递归SP在SSMS中创建树视图 这是我的密码 @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_I

我正在尝试使用递归SP在SSMS中创建树视图

这是我的密码

@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,然后将其添加到所有ORGLEVEL,这样总裁和首席执行官的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

我知道在我用来绑定到webform的HTML代码中有一种方法可以做到这一点,但由于这是一种动态解决方案,我希望在存储过程中完成这一点,因此它是我使用的gridview的简单数据绑定。如果您对此问题有任何解决方案,请告诉我。

这是一个猜测,但在没有样本数据的情况下,我想更改以下内容:

e.JOB_TITLE, e.MANAGER_ID, o.ORGLEVEL


您可以在查询中尝试此操作

replicate('-', (ABS((select min(o.ORGLEVEL) from @orgChart)) + o.ORGLEVEL)) + e.JOB_TITLE

OP的查询是专门为不假设固定深度而编写的,因此对深度进行硬编码并不是一个真正合适的答案。我想您会发现,在SQL中进行查询比定制数据绑定要复杂得多。另外,如果希望根据视图以不同的方式显示数据,则需要将其合并到查询中。让SQL做它检索数据的工作,HTML做它显示数据的工作。你有正确的方法,但是ABS看起来很奇怪。它可能只是o.ORGLEVEL-select…,否?您会将其放在最终的select语句中,还是放在每个递归上下树select语句的select语句中?虽然我尝试了这一点,它的工作奇迹,我没有把它放在我的SP,因为害怕把它放在错误的位置。编辑:由于性能优化而请求放置。最终选择查询
replicate('-', (ABS((select min(o.ORGLEVEL) from @orgChart)) + o.ORGLEVEL)) + e.JOB_TITLE