2013-03-06 12 views
9

Powiedzmy mam następującą tabelę:Jak ustalić, czy kolumna widoku jest wyprowadzona czy stała?

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 
) 

i następujący widok:

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

TaxedPrice jest kolumna pochodzi i Tax jest stała kolumna.

Dlatego nie mogę wstawić ani zaktualizować żadnego z nich. Pierwsze następne zapytanie przejdzie, podczas gdy inne zakończy się niepowodzeniem z błędem.

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) 

I tu jest zwracany komunikat o błędzie:

Update lub wkładka widzenia lub funkcja „Pozycja” nie powiodło się, ponieważ zawiera pole pochodzącą lub stałą.

Czy istnieje sposób, być może z widokami systemu, aby wyświetlić kolumny widoku, które nie mogą być aktualizowane?

+0

Nie wiem. Spodziewałbym się 'is_computed' w' sys.columns', aby to pokazać, ale nie wygląda na widok i nie widzę niczego w ['COLUMNPROPERTY'] (http://msdn.microsoft.com/en- us/library/ms174968.aspx). –

+0

'is_computed' to również moje pierwsze przypuszczenie, ale [definicja Microsoftu] (http://msdn.microsoft.com/en-us/library/ms191250 (v = SQL.105) .aspx) to: ' Obliczona kolumna jest obliczane na podstawie wyrażenia, które może korzystać z innych kolumn w tej samej tabeli. "Tutaj tak nie jest, ponieważ kolumna widoku używa kolumny z tabeli podstawowej, a nie z samego widoku. – madprog

Odpowiedz

1

Wygląda na to, że nie ma widoku systemu, który zapisuje informacje, których szukasz. Możesz znaleźć kolumnę wyprowadzoną lub stałą kolumnę, parsując definicję widoku lub obsługę wyjątków ... nie jest dobra, ale nie znalazłeś innych sposobów ...

+0

Obawiałem się więc ... Czy znalazłeś szybki sposób na wyodrębnienie listy kolumn pochodnych z definicji widoku? To wygląda na skomplikowany problem: na przykład "unii" pomiędzy dwoma 'select's oznaczą wszystkie wyprowadzone kolumny, ale zostaną znalezione w środku zapytania. – madprog

1
  1. Wszystkie kolumny pochodzą z następujących funkcji agregacji, rozpatrywanych jako kolumna wyprowadzona. AVG, COUNT, SUMA, MIN, MAX, GROUPING, STDEV, STDEVP, VAR, VARP
  2. Jeśli definicja widoku zawiera następującą składnię, wszystkie kolumny są traktowane jako kolumny pochodne. UNION, UNION ALL, CROSSJOIN, EXCEPT, INTERSECT
  3. Kolumny, których dotyczą GROUP BY, HAVING, DISTINCT, są również uważane za kolumny pochodne.

Nie sądzę, że to dotyczy wszystkich scenariuszy, ale punkt początkowy do napisania analizatora składni.

Powiązane problemy