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 に答える