惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

U
Unit 42
A
About on SuperTechFans
J
Java Code Geeks
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Stack Overflow Blog
Stack Overflow Blog
Recent Announcements
Recent Announcements
GbyAI
GbyAI
F
Fortinet All Blogs
Blog — PlanetScale
Blog — PlanetScale
MongoDB | Blog
MongoDB | Blog
MyScale Blog
MyScale Blog
aimingoo的专栏
aimingoo的专栏
H
Help Net Security
月光博客
月光博客
博客园 - Franky
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Apple Machine Learning Research
Apple Machine Learning Research
The Cloudflare Blog
WordPress大学
WordPress大学
S
SegmentFault 最新的问题
T
Tailwind CSS Blog
Jina AI
Jina AI
有赞技术团队
有赞技术团队
博客园_首页

博客园 - 冰戈

【解决方法】IIS 承载的服务失败 - 冰戈 - 博客园 【Silverlight】使用ChildWindow实现MessageBox 【Silverlight】利用IsolatedStorageFile实现客户端缓存 Silverlight3_Tools&SDK发布中文版 Windows Server 2008 将与 Visual Studio 2008 以及 SQL Server 2008 共同发布 基于Ajax的模糊查询输入控件(补充) 基于Ajax的编码、拼音缩写、名称模糊查询输入控件 个人站点域名改为www.oylb.net 使用PostSharp进行AOP框架设计:一个简单的原型 又一套BlogEngine主题Andreas 给博客增加了一个主题Nautica02Liquid 对BlogEngine进行了一次简单升级 微软2008系列 (Orcas + Longhorn Server+SQL2008)将于2008年2月27日发布 - 冰戈 使用CSS+SiteMap+UserControl+MasterPage实现简易的Tab 转实用文章:常用开源协议详细解析 SubSonic 命令行参数及使用示例 抢先试用ReSharper UnitRun™ 1.0 又一款免费的VS2005单元测试插件 公司求才,你们是怎样做的?你想怎样做?
SQL Server 2005公用表达式实现递归
冰戈 · 2007-07-30 · via 博客园 - 冰戈

有数据表

1.

CREATE TABLE [dbo].[aspnet_Roles]
(
[ApplicationId] [uniqueidentifier] NOT NULL,
[RoleId] [uniqueidentifier] NOT NULL,
[RoleName] [nvarchar] (256) NOT NULL,
[LoweredRoleName] [nvarchar] (256) NOT NULL,
[Description] [nvarchar] (256) NULL
) ON [PRIMARY]

2.

CREATE TABLE [dbo].[pms_RoleRelations]
(
[RoleId] [uniqueidentifier] NOT NULL,
[ParentRoleId] [uniqueidentifier] NOT NULL
) ON [PRIMARY]

GO
EXEC sp_addextendedproperty N'MS_Description', N'角色间的关系', 'SCHEMA', N'dbo', 'TABLE', N'pms_RoleRelations', NULL, NULL
GO
EXEC sp_addextendedproperty N'MS_Description', N'角色ID', 'SCHEMA', N'dbo', 'TABLE', N'pms_RoleRelations', 'COLUMN', N'RoleId'
GO
EXEC sp_addextendedproperty N'MS_Description', N'父角色ID', 'SCHEMA', N'dbo', 'TABLE', N'pms_RoleRelations', 'COLUMN', N'ParentRoleId'

有数据:

1. 

DE2051D2-E76F-4E68-BD80-2BD7A183BE35    70D40086-FCAA-4F58-A802-F6A808B9BDF0    myrole    myrole
DE2051D2-E76F-4E68-BD80-2BD7A183BE35    15F9D7AC-895C-4FE3-A21E-CFC3CCFBE117    myrole1    myrole1
DE2051D2-E76F-4E68-BD80-2BD7A183BE35    ADEA0D48-209E-4E78-8927-60C3B834F463    myrole12    myrole12
DE2051D2-E76F-4E68-BD80-2BD7A183BE35    D052D277-6413-4418-94EB-648CE067CCD1    myrole2    myrole2
DE2051D2-E76F-4E68-BD80-2BD7A183BE35    F876778D-C1E9-4F37-9BF9-530C09E6D129    myrole3    myrole3
DE2051D2-E76F-4E68-BD80-2BD7A183BE35    C9AE4104-A900-4228-96E4-B9E12D10EB77    Test    test

2.

F876778D-C1E9-4F37-9BF9-530C09E6D129    70D40086-FCAA-4F58-A802-F6A808B9BDF0
ADEA0D48-209E-4E78-8927-60C3B834F463    15F9D7AC-895C-4FE3-A21E-CFC3CCFBE117
D052D277-6413-4418-94EB-648CE067CCD1    70D40086-FCAA-4F58-A802-F6A808B9BDF0
C9AE4104-A900-4228-96E4-B9E12D10EB77    ADEA0D48-209E-4E78-8927-60C3B834F463
15F9D7AC-895C-4FE3-A21E-CFC3CCFBE117    70D40086-FCAA-4F58-A802-F6A808B9BDF0

要实现:

取得 Test 的所有祖先角色,即,得到myrole12,myrole1,myrole

实现方式:

CREATE PROCEDURE [dbo].[pms_Roles_GetAllAncestorRoles]
    @ApplicationName           nvarchar(256),
    @RoleId                        char(36)
AS
    DECLARE @ApplicationId uniqueidentifier
    SELECT  @ApplicationId = NULL
    SELECT  @ApplicationId = ApplicationId FROM aspnet_Applications WHERE LOWER(@ApplicationName) = LoweredApplicationName
   
    IF (@ApplicationId IS NULL)
        RETURN;
  
   --使用公用表达式实现递归取得角色的所有祖先
    WITH RoleRelations(RoleId,ParentRoleId,RoleName,pName,pDescription,Level)
    AS
    (
        SELECT r.RoleId,ParentRoleId,r.RoleName AS rName, p.rolename AS pName,p.Description,0 AS Level
        FROM aspnet_Roles r
        LEFT JOIN pms_RoleRelations
            ON pms_RoleRelations.RoleId = r.RoleId
        LEFT JOIN aspnet_Roles p
            ON p.RoleId = pms_RoleRelations.ParentRoleId
        WHERE r.RoleId = @RoleId
            AND r.ApplicationId = @ApplicationId

        UNION ALL
       
        SELECT r.RoleId,pid.ParentRoleId,r.RoleName AS rName, pn.rolename AS pName,pn.Description,Level + 1
        FROM aspnet_Roles r
        JOIN pms_RoleRelations pid
            ON r.roleid = pid.roleid
        JOIN aspnet_Roles pn ON pn.roleid = pid.parentroleid
        JOIN RoleRelations p ON p.ParentRoleId = r.RoleId
        WHERE r.ApplicationId = @ApplicationId
    )
    SELECT ParentRoleId AS RoleId,
            pName AS RoleName ,
            pDescription AS Description
    FROM RoleRelations