0

我正忙于编写要在安全令牌服务中使用的声明提供程序类。

用户权限从 SQL Server 2008 R2 数据库中读取:

SELECT A, B, C, ..., X FROM Permissions WHERE UserId = @UserId

会给我一行,例如:

A B C ... X
1 0 1     1

以表格形式拥有这些数据会容易得多

Permission Value
A          1
B          0
C          1
...
X          1

由于实际的表包含几十列,我希望能够“动态地”进行换位,而不必真正手动输入任何列名。

感觉就像 PIVOT/UNPIVOT 函数和 INFORMATION_SCHEMA.COLUMNS 视图是我需要的,但我不知道该怎么做。

对可以执行此操作的查询有任何想法吗?

PS。我想如果推送到了,我只需将结果集粘贴在 DataTable 中并遍历代码中的列以生成用户声明,但我想先了解上述方法是否可行 :)

4

2 回答 2

5

如果您没有UNPIVOT可用的功能(您没有指定 RDBMS),那么您可以使用UNION ALL(参见SQL Fiddle with Demo):

select 'A' as Permission, A as Value
FROM Permissions
WHERE UserId = @UserId
UNION ALL
select 'B' as Permission, B as Value
FROM Permissions
WHERE UserId = @UserId

如果您在 sql-server 中有未知数量的列,那么您可以使用动态 sql,您的代码将与此类似:

DECLARE @colsUnPivot AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX)

SET @colsUnPivot = stuff((select ','+C.name
         from sys.columns as C
         where C.object_id = object_id('Permissions')
            and C.name != 'UserId'
         for xml path('')), 1, 1, '')

set @query 
  = 'select permission, value
    from
    (
        select *
         from permissions
         where userid = '+@UserId+'
    ) x
     unpivot
     (
        value
        for permission in ('+ @colsunpivot +')
     ) u'

exec(@query)

SQL Fiddle with Demo

于 2012-09-20T14:01:45.693 回答
3

确实不转。

   select Permission, Value 
   from (Select * from Permissions where UserID = @userID) s
   unpivot (Value for Permission in ([a],[b],[c],...,[x])) u

如果您必须有动态列,则使用动态 SQL 和 构造上述查询sp_executesql,或者在您的 c# 代码中(适当注意和注意)。

但大概你知道这些列是什么?也许首先可以将权限存储在结果的标准化形式中?

于 2012-09-20T13:59:40.373 回答