2017-02-13 93 views
0

场景:我需要准备许可矩阵的excel表单文档。在应用程序中共有15个角色和20个模块,使用用户定义的函数来传递roleid和moduleid,我可以获得单个角色的权限详细信息,并且可以复制并粘贴到Excel表单中。将多个结果集合到一个表中

但今后,我会重复同样的任务300次。为了减少工作,我打算将所有角色的权限以模块方式结合起来。所以我只能做20次这个任务。

我试过了什么:我已经创建了一个UDF函数来将逗号分隔的结果从SP拆分为列明智的。同时创建20个变量以表格格式存储每个角色的权限详细信息。

示例数据和表:考虑每个@UDF_Function存储每个角色的权限详细信息,我想以单个表格格式显示所有结果。

DECLARE @UDF_Function1 TABLE (Details VARCHAR (10)); 
INSERT INTO @UDF_Function1 (Details) 
SELECT 'hidden' UNION ALL SELECT 'edit' UNION ALL SELECT 'edit'; 

DECLARE @UDF_Function2 TABLE (Details VARCHAR (10)); 
INSERT INTO @UDF_Function2 (Details) 
SELECT 'view' UNION ALL SELECT 'edit' UNION ALL SELECT 'view'; 

-- SELECT * FROM @UDF_Function1; 
-- SELECT * FROM @UDF_Function2; 

SELECT F1.Details AS R1, F2.Details AS R2 FROM 
(SELECT * FROM @UDF_Function1) F1, 
(SELECT * FROM @UDF_Function2) F2; 

输出结果不符合我的预期格式,如何才能达到预期的格式,如下所示?

预期结果

| R1  | R2  | 
|---------------------| 
| hidden | view | 
| edit  | edit | 
| edit  | view | 

我的是SQL Server 2012的

回答

1

试试这个

DECLARE @UDF_Function1 TABLE (id int identity,Details VARCHAR (10)); 
INSERT INTO @UDF_Function1 (Details) 
SELECT 'hidden' UNION ALL SELECT 'edit' UNION ALL SELECT 'edit'; 

DECLARE @UDF_Function2 TABLE (id int identity,Details VARCHAR (10)); 
INSERT INTO @UDF_Function2 (Details) 
SELECT 'view' UNION ALL SELECT 'edit' UNION ALL SELECT 'view'; 


SELECT F1.Details AS R1, F2.Details AS R2 FROM 
(SELECT * FROM @UDF_Function1) F1, 
(SELECT * FROM @UDF_Function2) F2 WHERE F1.id=F2.id; 

在你的查询,你需要加入WHERE子句我所提供的条件使用自发生标识列id。 不存在连接条件两个表的行之间的笛卡尔乘积正在发生,给出的行数多于所需的结果数量。

+0

返回我期望的结果,谢谢。 – Arulkumar

1

添加标识列,并做了简单的加入

DECLARE @UDF_Function1 TABLE (id int identity,Details VARCHAR (10)); 
INSERT INTO @UDF_Function1 (Details) 
SELECT 'hidden' UNION ALL SELECT 'edit' UNION ALL SELECT 'edit'; 

DECLARE @UDF_Function2 TABLE (id int identity,Details VARCHAR (10)); 
INSERT INTO @UDF_Function2 (Details) 
SELECT 'view' UNION ALL SELECT 'edit' UNION ALL SELECT 'view'; 


SELECT F1.Details AS R1, F2.Details AS R2 
FROM @UDF_Function1 f1 inner join @UDF_Function2 f2 on f1.id=f2.id 
0

可以使用CTE柳,像这样:

with 
UDF_Function1 (id, Details) as (
select 1, 'hidden' 
union all 
select 2, 'edit' 
union all 
select 3, 'edit' 
), 
UDF_Function2 (id, Details) as (
select 1, 'view' 
union all 
select 2, 'edit' 
union all 
select 3, 'view' 
) 

SELECT F1.Details AS R1, F2.Details AS R2 
FROM UDF_Function1 f1 inner join UDF_Function2 f2 on f1.id=f2.id 
相关问题