2017-02-13 4 views
0

Сценарий: Мне нужно подготовить документацию на лист Excel для матрицы разрешений. Всего 15 ролей и 20 модулей в приложении, используя определенную пользователем функцию для передачи ролей и модуля, я получаю данные о разрешении отдельной роли, и я могу скопировать и вставить в лист excel.Объединение нескольких наборов результатов в одну таблицу

Но в дальнейшем я повторяю ту же задачу в 300 раз. Чтобы уменьшить работу, я планирую объединить все полномочия роли в модуле. Поэтому я могу выполнить эту задачу только 20 раз.

Что я пробовал: Я создал функцию UDF для разделения результатов, разделенных запятыми, из SP в столбце wise. Также создайте 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 Yoo, как это:

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