Представления не могут динамически добавлять столбцы на основе данных в них.Ни один не может прямые запросы.Поскольку вы хотите, чтобы оно автоматически изменялось в зависимости от данных в таблице, это полностью исключает представления и запросы с использованием таких конструкций, как pivot
.
В значительной степени ваш единственный выбор, учитывая ограничения, которые вы нам дали,создать временную таблицу с достаточным количеством столбцов (динамически) и заполнить ее.Это по-прежнему проблематично, так как sproc не может создать и вернуть временную таблицу, поскольку таблица будет отброшена при выходе из sproc.
Другой вариант - написать sproc, который динамически генерирует запрос pivot
и выполняеттот.Это будет довольно грязно, хотя.Новые роли добавляются так часто, что это абсолютное требование?Это единственное, что делает его таким трудным.
Статический сводный запрос, чтобы получить желаемый результат, может выглядеть примерно так:
select
UserName,
[1] as Role1, [2] as Role2, [3] as Role3 -- UpdateMe
from (
select
u.UserName,
r.RoleID
IsUserInRole(u.UserName, r.RoleName) RoleFlag
from
aspnet_users u
cross join aspnet_roles r) source
pivot (
RoleFlag for RoleID in
([1],[2],[3]) -- UpdateMe
) PivotTable
Есть две строки, которые ваш динамический SQLгенератор должен постоянно обновляться, они помечены UpdateMe
комментариями.
У меня не установлен MSSQL, поэтому я не могу протестировать этот запрос, но он должен быть довольно близко.Может быть полезна ссылка pivot
.
Поддельные сводки в SQL Server 2000 с использованием агрегатов и case
:
select
UserName,
max(case when src.RoleID = 1 then RoleFlag else 0 end) Role1, --Repeat N times
...
from (
select
u.UserName,
r.RoleID
IsUserInRole(u.UserName, r.RoleName) RoleFlag
from
aspnet_users u
cross join aspnet_roles r) src
group by
UserName