Calcolato colonna basata su un'altra colonna calcolata?
-
12-09-2019 - |
Domanda
Ho una colonna calcolata chiamato Cost
che restituisce il denaro.
Voglio avere un'altra colonna che restituisce (Cost * 2
), ma non mi consente.
Soluzione
colonne calcolate non possono fare riferimento altre colonne calcolate. Anche se si dovrebbe essere in grado di ripetere solo l'espressione che si desidera fare riferimento. Da MSDN :
Una colonna calcolata è calcolata da un'espressione che può utilizzare altre colonne nella stessa tabella. L'espressione può essere un noncomputed nome della colonna, costante, funzione, e qualsiasi combinazione di questi collegati da uno o più operatori. L'espressione non può essere una sottoquery.
Vorrei anche aggiungere che se questo dovesse funzionare come si spera, avrebbe presentato tutti i tipi di nuovi problemi che avrebbe dovuto affrontare. Attualmente, aggiornamenti in molte colonne / righe verificano in parallelo e atomicamente.
Pertanto, non avrebbe senso utilizzare una colonna calcolata nel calcolo perché non sarebbe esattamente un valore ... ancora. Se non altro, si sarebbe utilizzando un vecchio, il valore non-aggiornato.
Se si voleva davvero per evitare la duplicazione l'espressione, è potrebbero fare questo in un trigger, anche se si consiglia fortemente non farlo. I trigger non sono divertenti e devono essere utilizzati solo da persone molto esperte in rari casi.
Altri suggerimenti
È necessario definire lo contro le colonne di base della tabella .
È un computed_column_expression espressione che definisce il valore di un colonna calcolata. Una colonna calcolata è una colonna virtuale che non è fisicamente memorizzato nella tabella, a meno che la colonna è contrassegnata PERSISTED. Il colonna viene calcolata da un'espressione che utilizza altre colonne della stessa tavolo. Ad esempio, una colonna calcolata può avere la definizione: costo AS prezzo * Qty. L'espressione può essere un nome di colonna noncomputed, costante, funzione, variabile e ogni combinazione di questi collegati da una o più operatori. L'espressione non può essere una sottoquery o contenere alias i tipi di dati.
Anche se si potrebbe refactoring entrambi di utilizzare lo stesso scalare UDF (passare in tutte le stesse colonne) per facilitarne la manutenzione e garantire la coerenza della logica, il calo di prestazioni sarebbe enorme, e io uso solo UDF scalari come ultima risorsa.