1

moduleid、name、parent_idの3つの列を持つtblmodulesというテーブルがあります。列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フィドルのデモ

于 2012-11-03T14:15:35.677 に答える