Una limitazione ampiamente nota delle colonne calcolate in SQL Server è che non possono accedere ai dati da altre tabelle. Cioè, la tua espressione può utilizzare colonne nella stessa tabella, ma non da altre tabelle.
Ma questo è vero solo a metà. Anche se non puoi fare riferimento alla colonna di un'altra tabella direttamente all'interno della tua espressione, puoi richiamare una funzione definita dall'utente. Pertanto, potresti creare una funzione definita dall'utente che esegua il calcolo di cui hai bisogno, quindi chiamare semplicemente quella funzione come espressione della colonna calcolata.
Ecco un esempio da dimostrare.
Tabelle di esempio
Ho un database con le seguenti tabelle:
SELECT TOP(5) * FROM Artists; +------------+------------------+--------------+-------------+ | ArtistId | ArtistName | ActiveFrom | CountryId | |------------+------------------+--------------+-------------| | 1 | Iron Maiden | 1975-12-25 | 3 | | 2 | AC/DC | 1973-01-11 | 2 | | 3 | Allan Holdsworth | 1969-01-01 | 3 | | 4 | Buddy Rich | 1919-01-01 | 6 | | 5 | Devin Townsend | 1993-01-01 | 8 | +------------+------------------+--------------+-------------+ SELECT TOP(5) * FROM Albums; +-----------+------------------------+---------------+------------+-----------+ | AlbumId | AlbumName | ReleaseDate | ArtistId | GenreId | |-----------+------------------------+---------------+------------+-----------| | 1 | Powerslave | 1984-09-03 | 1 | 1 | | 2 | Powerage | 1978-05-05 | 2 | 1 | | 3 | Singing Down the Lane | 1956-01-01 | 6 | 3 | | 4 | Ziltoid the Omniscient | 2007-05-21 | 5 | 1 | | 5 | Casualties of Cool | 2014-05-14 | 5 | 1 | +-----------+------------------------+---------------+------------+-----------+
Queste tabelle contengono effettivamente più di 5 righe. Ho selezionato le prime 5 righe in modo da ottenere l'immagine dei dati e della struttura della tabella.
Ora, immagina di voler aggiungere una colonna calcolata alla prima tabella.
Voglio che la colonna calcolata fornisca il numero di album di ciascun artista. In altre parole, mi serve per contare gli album nell'altra tabella:gli Albums
tabella.
Visto che i dati si trovano in un'altra tabella, non posso farvi riferimento direttamente da una colonna calcolata. Ma posso invece creare una funzione definita dall'utente e fare riferimento a quella funzione dall'interno della mia colonna calcolata.
Crea la funzione
Ecco una semplice funzione che conta il numero di album di un determinato artista:
CREATE FUNCTION [dbo].[ufn_AlbumCount] (@ArtistId int) RETURNS smallint AS BEGIN DECLARE @AlbumCount int; SELECT @AlbumCount = COUNT(AlbumId) FROM Albums WHERE ArtistId = @ArtistId; RETURN @AlbumCount; END; GO
Crea la colonna calcolata
Ora che ho creato la funzione, posso aggiungere una colonna calcolata che fa riferimento ad essa.
ALTER TABLE Artists ADD AlbumCount AS dbo.ufn_AlbumCount(ArtistId);
Testare la colonna calcolata
Ora posso eseguire una query sugli Artists
tabella per vedere il risultato della mia colonna calcolata:
SELECT TOP(10) * FROM Artists;
Risultato:
+------------+------------------+--------------+-------------+--------------+ | ArtistId | ArtistName | ActiveFrom | CountryId | AlbumCount | |------------+------------------+--------------+-------------+--------------| | 1 | Iron Maiden | 1975-12-25 | 3 | 5 | | 2 | AC/DC | 1973-01-11 | 2 | 3 | | 3 | Allan Holdsworth | 1969-01-01 | 3 | 2 | | 4 | Buddy Rich | 1919-01-01 | 6 | 1 | | 5 | Devin Townsend | 1993-01-01 | 8 | 3 | | 6 | Jim Reeves | 1948-01-01 | 6 | 1 | | 7 | Tom Jones | 1963-01-01 | 4 | 3 | | 8 | Maroon 5 | 1994-01-01 | 6 | 0 | | 9 | The Script | 2001-01-01 | 5 | 1 | | 10 | Lit | 1988-06-26 | 6 | 0 | +------------+------------------+--------------+-------------+--------------+
Indicizzazione
Puoi utilizzare la colonna calcolata in un indice solo se la funzione definita dall'utente che richiama ha i seguenti valori di proprietà:
- È deterministico =vero
- Sistema verificato =true (a meno che la colonna calcolata non sia persistente)
- Accesso ai dati utente =falso
- Accesso ai dati di sistema =falso