需求场景: SQL SERVER 中组织的数据结构是一个层级关系,现在需要抓出每个组织节点以上的全部组织信息,数据示例如下:
ADOrg_ID--------------ParentID-----------------ShortName
001 顶级组织名称
001.021 001 二级组织名称
001.022 001.021 三级组织名称
001.021.211 001.022 四级组织名称
001.023 001.021 三级组织名称
现在需要得到的结果为:
ADOrg_ID--------------OrgName------------------------------------------ShortName
001 顶级组织名称 顶级组织名称
001.021 顶级组织名称,二级组织名称 二级组织名称
001.022 顶级组织名称,二级组织名称,三级组织名称 三级组织名称
001.021.211 顶级组织名称,二级组织名称,三级组织名称,四级组织名称 四级组织名称
001.023 顶级组织名称,二级组织名称,三级组织名称 三级组织名称
SQL--------------------------------
DECLARE org cursor for select ADOrg_ID,ShortName from ADOrganize DECLARE @ORGID nvarchar(100) DECLARE @ORGSHORTNAME nvarchar(100) DECLARE @RESULT table ( [ID] nvarchar(50) NULL, [OrgInfo] nvarchar(MAX) NULL, [ShortName] nvarchar(50) NULL ) open org; FETCH NEXT FROM org INTO @ORGID,@ORGSHORTNAME WHILE @@FETCH_STATUS=0 BEGIN with node as ( select * from ADOrganize(nolock) where ADOrg_ID=@ORGID union all SELECT par.* FROM ADOrganize(nolock) AS par INNER JOIN node AS RC ON par.ADOrg_ID = RC.ParentID ) INSERT INTO @RESULT SELECT @ORGID,ShortName,@ORGSHORTNAME FROM ADOrganize(nolock) WHERE ADOrg_ID IN (SELECT ADOrg_ID FROM node N ) FETCH NEXT FROM ORG INTO @ORGID,@ORGSHORTNAME END ; CLOSE org; DEALLOCATE org; SELECT ID, data=stuff((SELECT ‘,‘+OrgInfo FROM @RESULT t WHERE ID=t1.ID FOR XML PATH(‘‘)), 1, 1, ‘‘) ,SHORTNAME FROM @RESULT t1 GROUP BY ID,SHORTNAME
说明:因为没有想到好的方法所以直接用游标查询后对数据进行处理,存储到临时表中,然后对临时表的数据进行分组,使用 stuff 对需要拼接的数据进行拼接,然后输出。不晓得是否还有更好的方法,欢迎讨论~~~~~~~~~