2009-04-02 1 views
2

뷰의 각 열에 대해 행을 반환하는 쿼리를 원한다. 보기 자체.뷰의 각 열 (필드)에 대한 기본 테이블과 기본 열 (필드)을 반환하는 SQL Server (2005+) 쿼리

결과에 현재 행의 열에 대한 기본 테이블을 제공하는 열 기반 테이블과 열 이름이있는 열의 기본 쿼리에있는 열 이름을 제공하는 결과의 기본 열이 있어야합니다. 어떤 계산도 기본 필드 열에 포함될 수 있다면 보너스가됩니다.

나는 이것을 할 수 없다고 생각합니다. 내가 잘못?

"여기에 무엇이 있습니까"는 basetable 열에서 적절하게 table1 또는 table2로 바뀌고 basefield 열에서 적절하게 a, b 또는 c로 대체되어야합니다.

 
create table table1 (a int, b int) 
create table table2 (a int, c int) 
go 
create view view1 as select table1.a, table1.b, table2.c from table1 left join table2 on table1.a = table2.a 
go 

select * from 
(
select 'View' objecttype,O.name viewname,'' fieldname,0 column_id,'' typename,'' max_length,'' [precision], '' scale, '' is_identity, 
    'what goes here' basetable, '' basefield 
from sys.objects O where O.type='V' and O.[schema_id] = 1 

union all 

    select 'Field' objecttype,object_name(C.[object_id]) viewname,C.name fieldname,C.column_id,T.name typename,C.max_length,C.precision,C.scale,C.is_identity, 
    'what goes here' basetable, 'what goes here' basefield 
    from sys.columns C 
left join sys.types T on C.user_type_id=T.system_type_id 
where C.[object_id] in (select O.[object_id] from sys.objects O where O.type='V') 
) I 
where viewname in ('view1') 
order by viewname, column_id 

drop view view1 
drop table table1 
drop table table2 

답변

1

정보 스키마에 정보를 추론하는 데 사용할 수있는 테이블이 거의 없습니다. 당신의 데이터를 아주 조금을 제공하는 기본 쿼리는 다음과 같습니다 정보 스키마의

select * 
from INFORMATION_SCHEMA.VIEW_COLUMN_USAGE v 
    inner join INFORMATION_SCHEMA.COLUMNS v1 
     on v.VIEW_NAME=v1.TABLE_NAME and v.COLUMN_NAME=v1.COLUMN_NAME 
where v.VIEW_NAME='My_View' 

테이블은 다음과 같습니다

select * from INFORMATION_SCHEMA.VIEWS 
select * from INFORMATION_SCHEMA.VIEW_TABLE_USAGE 
select * from INFORMATION_SCHEMA.VIEW_COLUMN_USAGE 

그래서 이것들을 사용해보십시오.

그러나 공식 수식없이 기본 탭에서 직접 열을 사용하는 경우에만 작동합니다.

1

지도가 1 대 1로 매핑되지 않을 수 있습니다. 뷰의 열은 다른 테이블의 여러 열 (심지어는 없음!)의 결과 일 수 있습니다.

즉,보기의 소스를 구문 분석하여 이 가능해야합니다 (). 그러나 SQL 코드는 절차 적/필수적이며 사소한 것이 아닙니다.

+0

그래, 그게 보너스 야. 계산 된 필드에 대한 계산으로 나에게 돌아올 수 있다면. SQL Server가 이미 파싱을 기반으로하는 방법이 있는지 궁금해 할 것입니다. 쿼리를 실행할 수 있다는 사실은 이것이 가능하다는 것을 의미합니다. –

+0

그러나 뷰를 고려할 때 얻는 방법은 여러 Tabble 간의 조인이 포함 된 직선 쿼리입니까? – Kangkan