2012-09-20 2 views
0

보안 토큰 서비스에 사용할 클레임 공급자 클래스를 작성하는 중입니다. 예를 들어,SQL : 행을 열로 바꿉니다 (새 열에 열 이름 포함)

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

나에게 하나의 행을 줄 것입니다 :

사용자 권한은 SQL 서버에서 2008 R2 데이터베이스를 읽기

A B C ... X 
1 0 1  1 

는이 데이터를 가지고하는 것이 훨씬 쉬울 것 양식

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

실제 테이블에는 수십 개의 열이 있기 때문에 가능한 것이 좋습니다. 실제로 열 이름을 직접 입력 할 필요없이 "동적으로"조 변경을 수행 할 수 있습니다.

필자는 PIVOT/UNPIVOT 기능과 INFORMATION_SCHEMA.COLUMNS보기가 필요한 것처럼 느껴지지만 어떻게 해야할지 알 수 없습니다.

이렇게하는 쿼리에 대한 아이디어가 있습니까?

추신. 만약 push가 밀려 온다면 DataTable에 결과 세트를 저장하고 사용자의 클레임을 생성하기 위해 코드의 컬럼을 반복 할 것입니다. 그러나 먼저 위의 접근이 가능한지 알아 내고 싶습니다.

+0

참조

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 = '[email protected]+' ) x unpivot ( value for permission in ('+ @colsunpivot +') ) u' exec(@query) 

: 당신은 동적 SQL을 사용하여 코드는 다음과 유사 할 것 한판 승부'join' 아마도? – Joe

+2

어떤 데이터베이스를 사용하고 있습니까? – RedFilter

+1

얼마나 많은 변수를 가지고 있느냐에 따라 단순히 UNION ALL을 사용할 수 있습니다. – Kermit

답변

5

(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 서버의 열 알 수없는 번호가있는 경우, 당신이를 생각하고 SQL Fiddle with Demo

+1

참으로'PIVOT'을 좋아합니다 – Yaroslav

+0

피벗이 아름답게 작동합니다. 불행히도 나는 데이터베이스의 호환성 수준 (내 통제 범위를 벗어남) 때문에 사용할 수 없다는 것을 발견했다. 그래서 나는 모두 함께 할 것이다. 건배. –

3

실제로 피벗 해제. 동적 열이해야하는 경우

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

후 (적절한 인해 관심과주의로), 또는 C# 코드에서 동적 SQL 및 sp_executesql를 사용하여 위의 쿼리를 생성.

아마도 열이 무엇인지 알 수 있습니까? 아마도 정규화 된 형식의 결과를 먼저 사용하여 사용 권한을 저장할 수 있습니까? 당신이 (당신이 RDBMS를 지정하지 않은) 다음 UNION ALL을 사용할 수 있습니다 사용할 수있는 UNPIVOT 기능이없는 경우