2013-03-06 5 views
9

의 나는 다음과 같은 테이블이 있다고 가정 해 봅시다 :뷰의 열이 파생되었거나 상수인지 확인하는 방법은 무엇입니까?

create table t_Item (
    ItemID int not null identity(1,1) constraint PK_Item primary key, 
    Description varchar(256) not null, 
    Price decimal(10,2) not null 
) 

다음과 같은보기 :

create view Item as 
    select ItemID 
     ,Description 
     ,Price 
     ,1.09 Tax 
     ,Price * 1.09 TaxedPrice 
    from t_Item 

TaxedPrice 파생 열이며, Tax은 일정한 열입니다.

따라서 삽입하거나 업데이트 할 수 없습니다. 첫 번째 쿼리는 성공하지만 다른 쿼리는 오류가 발생하여 실패합니다. 이 파생 필드 나 상수 필드를 포함하므로

업데이트 또는 뷰 또는 함수 '항목'의 삽입 실패 : 여기

insert into Item (Description, Price) values ('Test item', 14.00) 

insert into Item (Description, Price, TaxedPrice) values ('Test item', 14.00, 15.26) 

insert into Item (Description, Price, Tax) values ('Test item', 14.00, 1.09) 

그리고

는 반환 된 오류 메시지입니다.

시스템보기에서 업데이트하지 않아야하는보기 열을 나열하는 방법이 있습니까?

+0

잘 모름 나는'sys.columns'에서'is_computed'를 보았을 것입니다. 그러나보기에는 보이지 않으며 ['COLUMNPROPERTY']에서는 보이지 않습니다. (http://msdn.microsoft.com/en- us/library/ms174968.aspx) 중 하나를 선택합니다. –

+0

'is_computed'도 내 첫 번째 추측 이었지만 [Microsoft의 정의] (http://msdn.microsoft.com/en-us/library/ms191250 (v = SQL.105) .aspx)는 다음과 같습니다. '계산 된 열 동일한 테이블의 다른 열을 사용할 수있는 표현식에서 계산됩니다. '보기의 열은보기 자체가 아닌 기본 테이블의 열을 사용하기 때문에 여기에는 해당되지 않습니다. – madprog

답변

1

시스템보기가 없으므로 찾고있는 정보가 저장되지 않는 것 같습니다. 모든 열은 다음과 같은 집계 함수에서 온

+0

나는 두려웠다. 뷰 정의에서 파생 된 열의 목록을 신속하게 추출하는 방법을 찾았습니까? 이것은 복잡한 문제처럼 보입니다. 예를 들어, 두 개의'select' 사이의'union '은 파생 된 모든 컬럼에 플래그를 지정하지만 쿼리 중간에 발견됩니다. – madprog

1
  1. 당신은 고려, ... 뷰 정의를 분석하거나 예외 처리 ... 좋은하지 않음으로써 파생 된 열 또는 일정한 열을 찾을 수 있지만, 다른 방법을 찾을 수 없습니다 파생 된 열로.
  2. 뷰 정의에 다음 구문이 포함 된 경우 모든 열은 파생 열로 간주됩니다. UNION, UNION ALL, CROSSJOIN, EXCEPT, INTERSECT
  3. GROUP BY, HAVING, DISTINCT의 영향을받는 열은 파생 열로도 간주됩니다.

나는이 모든 시나리오를 다루지는 않지만, 파서를 작성하는 시작점이라고 생각하지 않습니다.