1

我有一个名为 tblmodules 的表,它有 3 列:moduleid、name、parent_id。parent_id 列采用其他模块的值。前任:

Moduleid      Name       Parentid
--------     -----       --------
1           grandparent    Null
2            parent         1
3           child           2

我想要一个存储过程,它采用父母的 ID 和孩子的姓名给出一个级别。所以我开发了以下内容。

        @moduleid bigint,
    @level int

AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    declare @parentid bigint
    declare @name nvarchar(100)
    set @parentid = (select parentid from tblModules where ModuleId = @moduleid)


    declare @counter int
    set @counter = 1

    while @counter < @level
    begin

        set @parentid = (select parentid from tblModules where ModuleId = @parentid)
        set @name = (select Name from tblModules where ModuleId = @parentid)

        set @counter = @counter + 1
    end

    select @parentid AS ID
    select @name as Name

end

该过程运行良好,并获得了正确的父级 ID,但名称与子级保持相同。例如,我正在执行它,给出值@moduleid:3 和@​​level:2。我得到的结果 ID:1 是正确的,但名称:孩子而不是祖父母。有什么帮助吗?

4

1 回答 1

2

在我的脚本中,我使用 CTE 来查找将与其 ParentLevel(@level) 连接的模块

CREATE PROCEDURE dbo.ParentLevelName
 (
  @moduleid bigint,
  @level int
  )
AS
BEGIN
  SET NOCOUNT ON;

  ;WITH ParentTree(Parentid, Moduleid, Name, ParentLevel)
  AS
   (
    SELECT Parentid, Moduleid, Name, 0 AS ParentLevel
    FROM tblmodules
    WHERE Parentid IS NULL
    UNION ALL
    SELECT t.Parentid, t.Moduleid, t.Name, p.ParentLevel + 1
    FROM tblmodules t JOIN ParentTree p ON t.Parentid = p.Moduleid 
    )
  SELECT p.Parentid, p.Moduleid, p.Name, p2.Name PerantLevelName
  FROM ParentTree p LEFT JOIN ParentTree p2 ON p.ParentLevel - @level = p2.ParentLevel
  WHERE p.Moduleid = @moduleid
END

SQL Fiddle演示

于 2012-11-03T14:15:35.677 回答