2013-03-06 9 views
9

Diciamo che ho la seguente tabella:Come determinare se una colonna di una vista è derivata o costante?

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 
) 

e alla seguente vista:

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

TaxedPrice è una colonna derivata, e Tax è una colonna costante.

Pertanto, non posso inserire o aggiornare nessuno di essi. La prima query seguente passerebbe, mentre gli altri fallirebbero con un errore.

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) 

E qui è il messaggio di errore restituito:

Update o inserto di vista o funzione 'Voce' fallito perché contiene un campo derivato o costante.

C'è un modo, forse con le viste di sistema, di elencare le colonne della vista che non devono essere aggiornate?

+0

Non so. Mi sarei aspettato 'is_computed' in' sys.columns' per mostrare questo, ma non sembra per le viste e non vedo nulla in ['COLUMNPROPERTY'] (http://msdn.microsoft.com/it/ us/library/ms174968.aspx) entrambi. –

+0

'is_computed' è stata la mia prima ipotesi, ma [la definizione di Microsoft] (http://msdn.microsoft.com/en-us/library/ms191250 (v = SQL.105) .aspx) è: ' Una colonna calcolata è calcolato da un'espressione che può utilizzare altre colonne nella stessa tabella. Qui non è il caso, in quanto la colonna della vista utilizza una colonna dalla tabella sottostante, non dalla vista stessa. – madprog

risposta

1

Sembra che non ci sia una vista di sistema che salva le informazioni che stai cercando. Puoi trovare la colonna derivata o la colonna costante analizzando la definizione della vista o la gestione delle eccezioni ... non buono, ma non ha trovato altri modi ...

+0

Avevo paura quindi ... Hai trovato un modo rapido per estrarre l'elenco delle colonne derivate dalla definizione della vista? Questo sembra un problema complesso: per esempio, un 'union' tra due' select's contrassegna tutte le colonne derivate, ma sarà trovato al centro della query. – madprog

1
  1. Qualsiasi colonna proviene dalle seguenti funzioni di aggregazione, considerate come colonna derivata. AVG, COUNT, SUM, MIN, MAX, GROUPING, DEV.ST, STDEVP, VAR, VARP
  2. Se la definizione della vista contiene la seguente sintassi, tutte le colonne vengono considerate come colonne derivate. UNION, UNION ALL, CROSSJOIN, EXCEPT, INTERSECT
  3. Le colonne interessate da GROUP BY, HAVING, DISTINCT, sono anche considerate come colonne derivate.

Non penso che questo copra tutti gli scenari, ma un punto di partenza per scrivere il parser.

Problemi correlati