结果如图:
制作方法:
一、创建JG_JS视图,活动的角色列表
CREATE VIEW [dbo].[JG_JS]
AS
SELECT ROW_NUMBER()OVER(ORDER BY djsname ASC) AS id,djsname
FROM juesdoc(NOLOCK)
WHERE beactive ='是'
二、创建JG_MENU视图,菜单及菜单对应运行号列表
--菜单级数级通过
SELECT DISTINCT LEN(ccxlh) FROM skmenu WHERE mkbh='A1'
CREATE VIEW [dbo].[JG_MENU]
AS
SELECT a.ccxlh AS '编号'
,a.gnmch AS '菜单|1级'
,ISNULL(b.gnmch,'') AS '菜单|2级'
,ISNULL(c.gnmch,'') AS '菜单|3级'
,ISNULL(d.gnmch,'') AS '菜单|4级'
,ISNULL(e.gnmch,'') AS '菜单|5级'
,ISNULL(f.gnmch,'') AS '菜单|6级'
,CASE WHEN a.gnbh<>'' THEN a.gnbh
WHEN b.gnbh<>''THEN b.gnbh
WHEN c.gnbh<>'' THEN c.gnbh
WHEN d.gnbh<>'' THEN d.gnbh
WHEN e.gnbh<>'' THEN e.gnbh
WHEN f.gnbh<>'' THEN f.gnbh
ELSE '' END AS '运行号'
FROM skmenu AS a(NOLOCK)
LEFT JOIN(
SELECT ccxlh,gnmch,gnbh
FROM skmenu(NOLOCK)
WHERE mkbh ='A1'
AND LEN(ccxlh) = 4
) AS b ON a.ccxlh = LEFT(b.ccxlh,2)
LEFT JOIN(
SELECT ccxlh,gnmch,gnbh
FROM skmenu(NOLOCK)
WHERE mkbh ='A1'
AND LEN(ccxlh) = 6
) AS c ON b.ccxlh = LEFT(c.ccxlh,4)
LEFT JOIN(
SELECT ccxlh,gnmch,gnbh
FROM skmenu(NOLOCK)
WHERE mkbh ='A1'
AND LEN(ccxlh) = 8
) AS d ON c.ccxlh = LEFT(d.ccxlh,6)
LEFT JOIN(
SELECT ccxlh,gnmch,gnbh
FROM skmenu(NOLOCK)
WHERE mkbh ='A1'
AND LEN(ccxlh) = 10
) AS e ON d.ccxlh = LEFT(e.ccxlh,8)
LEFT JOIN(
SELECT ccxlh,gnmch,gnbh
FROM skmenu(NOLOCK)
WHERE mkbh ='A1'
AND LEN(ccxlh) = 12
) AS f ON e.ccxlh = LEFT(f.ccxlh,10)
WHERE a.mkbh ='A1'
AND LEN(a.ccxlh) = 2
三、创建SQL存储过程JG_CDJSQX,查询结果;
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[JG_CDJSQX]
AS
DECLARE @i INT,@max INT
SET @i =1
SELECT @max =COUNT(*) FROM JG_JS
DECLARE @StrSQL VARCHAR(8000)
SET @StrSQL =' SELECT a.* '
WHILE @i <= @max
BEGIN
DECLARE @djsname CHAR(30)
SET @djsname =''
SELECT @djsname = LTRIM(RTRIM(djsname)) FROM JG_JS WHERE id =@i
SELECT @StrSQL = @StrSQL
+' ,['+LTRIM(RTRIM(@djsname))+'] = CASE WHEN b'+LTRIM(RTRIM(CONVERT(CHAR(10),@i)))+'.djsname IS NULL THEN '''' ELSE ''√'' END '
--+' ,['+LTRIM(RTRIM(@djsname))+'] = CASE WHEN b.djsname IS NULL THEN '''' ELSE ''√'' END '
SET @i = @i + 1
END
SELECT @StrSQL = @StrSQL
+ ' FROM JG_MENU AS a '
SET @i =1
SELECT @max =COUNT(*) FROM JG_JS
WHILE @i <= @max
BEGIN
DECLARE @djsname2 CHAR(30)
SET @djsname2 =''
SELECT @djsname2 = LTRIM(RTRIM(djsname)) FROM JG_JS WHERE id =@i
SELECT @StrSQL = @StrSQL
+' LEFT JOIN JG_JSGN AS b'+LTRIM(RTRIM(CONVERT(CHAR(10),@i)))+' ON a.运行号 = b'+LTRIM(RTRIM(CONVERT(CHAR(10),@i)))+'.gnbh AND b'+LTRIM(RTRIM(CONVERT(CHAR(10),@i)))+'.djsname='''+LTRIM(RTRIM(@djsname2))+''' '
SET @i = @i + 1
END
SELECT @StrSQL = @StrSQL
+ ' ORDER BY a.编号 ASC '
EXEC(@StrSQL)
--SELECT @StrSQL