Condividi tramite


computed_column_definition (Transact-SQL)

Specifica le proprietà di una colonna calcolata aggiunta a una tabella tramite l'istruzione ALTER TABLE.

Icona di collegamento a un argomentoConvenzioni della sintassi Transact-SQL

Sintassi

column_name AS computed_column_expression
[ PERSISTED [ NOT NULL ] ]
[ 
    [ CONSTRAINT constraint_name ]
    { PRIMARY KEY | UNIQUE }
        [ CLUSTERED | NONCLUSTERED ]
        [ WITH FILLFACTOR = fillfactor ]
        [ WITH ( <index_option> [, ...n ] ) ]
        [ ON { partition_scheme_name (partition_column_name ) | filegroup 
            | "default" } ]
    | [ FOREIGN KEY ] 
        REFERENCES ref_table [ ( ref_column ) ] 
        [ ON DELETE { NO ACTION | CASCADE } ] 
        [ ON UPDATE { NO ACTION } ] 
        [ NOT FOR REPLICATION ] 
    | CHECK [ NOT FOR REPLICATION ] ( logical_expression )
]

Argomenti

  • column_name
    Nome della colonna da modificare, aggiungere o eliminare. column_name può contenere da 1 a 128 caratteri. Nel caso di nuove colonne create con il tipo di dati timestamp è possibile omettere l'argomento column_name. Se per una colonna con tipo di dati timestamp non è specificato alcun valore column_name, viene utilizzato il nome timestamp.

  • computed_column_expression
    Espressione che definisce il valore di una colonna calcolata. Una colonna calcolata è una colonna virtuale non archiviata fisicamente nella tabella, ma calcolata in base a un'espressione che utilizza altre colonne nella stessa tabella. La definizione di una colonna calcolata potrebbe ad esempio essere cost AS price * qty. L'espressione può essere un nome di colonna non calcolata, una costante, una funzione, una variabile e qualsiasi combinazione di questi elementi uniti da uno o più operatori. L'espressione non può essere una sottoquery o includere dati di tipo alias.

    È possibile utilizzare colonne calcolate in elenchi di selezione, clausole WHERE, clausole ORDER BY e nelle posizioni in cui è possibile utilizzare espressioni regolari, con le eccezioni seguenti:

    • Una colonna calcolata non può essere utilizzata come definizione di vincolo DEFAULT o FOREIGN KEY o con la definizione di vincolo NOT NULL. È tuttavia possibile utilizzare una colonna calcolata come colonna chiave di un indice o come parte di un vincolo PRIMARY KEY o UNIQUE, a condizione che il valore della colonna calcolata sia definito da un'espressione deterministica e il tipo di dati del risultato sia supportato nelle colonne dell'indice.

      Se, ad esempio, la tabella contiene le colonne di tipo integer a e b, è possibile indicizzare la colonna calcolata a + b, ma non la colonna calcolata a+DATEPART(dd, GETDATE()), in quanto durante chiamate successive il valore potrebbe cambiare.

    • Non è possibile utilizzare una colonna calcolata in un'istruzione INSERT o UPDATE.

      Nota

      Poiché valori delle colonne coinvolte in una colonna calcolata possono essere diversi in ogni riga di una tabella, è possibile che nelle varie righe il risultato della colonna calcolata sia diverso.

  • PERSISTED
    Specifica che Motore di database archivierà fisicamente i valori calcolati nella tabella e aggiornerà i valori in caso di aggiornamento di eventuali altre colonne da cui dipende la colonna calcolata. Se si contrassegna una colonna calcolata come PERSISTED, sarà possibile creare un indice in una colonna calcolata deterministica, ma non precisa. Per ulteriori informazioni, vedere Creazione di indici per le colonne calcolate. Le colonne calcolate utilizzate come colonne di partizionamento di una tabella partizionata devono essere contrassegnate in modo esplicito come PERSISTED. Se si specifica PERSISTED, è necessario che l'espressione specificata da computed_column_expression sia deterministica.

  • NULL | NOT NULL
    Specifica se i valori NULL sono supportati. L'opzione NULL non è esattamente un vincolo, ma può essere specificata allo stesso modo di NOT NULL. Per le colonne calcolate è necessario specificare NOT NULL solo se è stata specificata anche l'opzione PERSISTED.

  • CONSTRAINT
    Specifica l'inizio della definizione di un vincolo PRIMARY KEY o UNIQUE.

  • constraint_name
    Nuovo vincolo. I nomi di vincolo devono essere conformi alle regole per gli identificatori, con la sola eccezione che il nome non può iniziare con il simbolo di cancelletto (#). Se constraint_name viene omesso, al vincolo viene assegnato un nome generato dal sistema.

  • PRIMARY KEY
    Vincolo che impone l'integrità di entità per una o più colonne specificate tramite un indice univoco. È possibile creare un solo vincolo PRIMARY KEY per ogni tabella.

  • UNIQUE
    Vincolo che impone l'integrità di entità per una o più colonne specificate tramite un indice univoco.

  • CLUSTERED | NONCLUSTERED
    Imposta la creazione di un indice cluster o non cluster per il vincolo PRIMARY KEY o UNIQUE. Per impostazione predefinita per i vincoli PRIMARY KEY è impostata l'opzione CLUSTERED. Per impostazione predefinita per i vincoli UNIQUE è impostata l'opzione NONCLUSTERED.

    Se in una tabella esiste già un vincolo o un indice cluster, non è possibile specificare l'opzione CLUSTERED. In questo caso, inoltre, nei vincoli PRIMARY KEY viene attivata automaticamente l'opzione NONCLUSTERED.

  • WITH FILLFACTOR = fillfactor
    Specifica la percentuale utilizzata da Motore di database di SQL Server per riempire ogni pagina dell'indice utilizzata per archiviare dati. I valori di fillfactor specificati dall'utente possono essere compresi tra 1 e 100. Se non viene specificato alcun valore, il valore predefinito è 0.

    Nota importanteImportante

    La documentazione relativa all'opzione WITH FILLFACTOR = fillfactor come unica opzione per l'indice applicata ai vicoli PRIMARY KEY o UNIQUE viene conservata per compatibilità con le versioni precedenti, ma non verrà trattata allo stesso modo nelle versioni future. È possibile specificare altre opzioni per gli indici nella clausola index_option (Transact-SQL) dell'istruzione ALTER TABLE.

  • FOREIGN KEY REFERENCES
    Vincolo che impone l'integrità referenziale dei dati di una o più colonne. È necessario che ogni valore delle colonne sia incluso nelle colonne di riferimento corrispondenti della tabella di riferimento. È possibile fare riferimento a vincoli FOREIGN KEY solo nelle colonne che nella tabella con riferimenti corrispondono a vincoli PRIMARY KEY o UNIQUE e nelle colonne a cui viene fatto riferimento in un indice univoco nella tabella di riferimento. È necessario contrassegnare come PERSISTED anche le chiavi esterne nelle colonne calcolate.

  • ref_table
    Nome della tabella a cui fa riferimento il vincolo FOREIGN KEY.

  • ( ref_column )
    Colonna della tabella a cui fa riferimento il vincolo FOREIGN KEY.

  • ON DELETE { NO ACTION | CASCADE }
    Specifica l'azione eseguita nelle righe della tabella se tali righe includono una relazione referenziale e se la riga a cui viene fatto riferimento viene eliminata dalla tabella principale. Il valore predefinito è NO ACTION.

    • NO ACTION
      Motore di database genera un errore e viene eseguito il rollback dell'operazione di eliminazione sulla riga nella tabella padre.

    • CASCADE
      Le righe corrispondenti vengono eliminate dalla tabella di riferimento se tale riga viene eliminata dalla tabella padre.

    Nel database AdventureWorks2008R2, ad esempio, la tabella ProductVendor include una relazione referenziale con la tabella Vendor. La chiave esterna ProductVendor.BusinessEntityID fa riferimento alla chiave primaria Vendor.BusinessEntityID.

    Se viene eseguita un'istruzione DELETE in una riga della tabella Vendor e viene specificata un'azione ON DELETE CASCADE per ProductVendor.BusinessEntityID, il Motore di database verifica se esistono una o più righe dipendenti nella tabella ProductVendor. Se la verifica ha esito positivo, le righe dipendenti nella tabella ProductVendor vengono eliminate assieme alla riga a cui viene fatto riferimento nella tabella Vendor.

    Al contrario, se viene specificato NO ACTION, il Motore di database genera un errore ed esegue in rollback dell'azione di eliminazione per la riga della tabella Vendor quando esiste almeno una riga nella tabella ProductVendor che vi fa riferimento.

    Non specificare CASCADE se la tabella verrà inclusa in una pubblicazione di tipo merge che utilizza record logici. Per ulteriori informazioni sui record logici, vedere Raggruppamento di modifiche alla righe correlate con record logici.

  • ON UPDATE { NO ACTION }
    Specifica l'azione eseguita nelle righe della tabella creata se tali righe includono una relazione referenziale e la riga a cui viene fatto riferimento è stata aggiornata nella tabella padre. Se si specifica NO ACTION, il Motore di database genera un errore e viene eseguito il rollback dell'operazione di aggiornamento nella riga Vendor se esiste almeno una riga nella tabella ProductVendor che fa riferimento a essa.

  • NOT FOR REPLICATION
    Questa clausola può essere specificata per i vincoli FOREIGN KEY e CHECK. Se per un vincolo si specifica questa clausola, il vincolo non viene imposto quando gli agenti di replica eseguono le operazioni di inserimento, aggiornamento o eliminazione. Per ulteriori informazioni, vedere Controllo di vincoli, identità e trigger con l'opzione NOT FOR REPLICATION.

  • CHECK
    Vincolo che impone l'integrità di dominio tramite la limitazione dei valori che è possibile inserire in una o più colonne. È necessario contrassegnare come PERSISTED anche i vincoli CHECK nelle colonne calcolate.

  • logical_expression
    Espressione logica che restituisce TRUE o FALSE. L'espressione non può contenere riferimenti a un tipo di dati alias.

  • ON { partition_scheme_name (partition_column_name) | filegroup| "default"}
    Specifica la posizione di archiviazione dell'indice creato per il vincolo. Se si specifica partition_scheme_name, l'indice viene partizionato e le partizioni vengono mappate ai filegroup specificati da partition_scheme_name. Se si specifica filegroup, l'indice viene creato nel filegroup specificato. Se si specifica "default" o se si omette ON, l'indice viene creato nello stesso filegroup della tabella. Se invece ON viene specificato quando si aggiunge un indice cluster per un vincolo PRIMARY KEY o UNIQUE, l'intera tabella viene spostata nel filegroup specificato durante la creazione dell'indice cluster.

    Nota

    In questo contesto, default non è una parola chiave. Si tratta di un identificatore del filegroup predefinito e deve essere delimitato, ad esempio ON "default" o ON [default]. Se si specifica "default", l'opzione QUOTED_IDENTIFIER deve essere impostata su ON per la sessione corrente. Questa è l'impostazione predefinita. Per ulteriori informazioni, vedere SET QUOTED_IDENTIFIER (Transact-SQL).

Osservazioni

Ogni vincolo PRIMARY KEY e UNIQUE genera un indice. Il numero di vincoli UNIQUE e PRIMARY KEY non deve generare un numero di indici della tabella maggiore di 999 nel caso di indici non cluster e maggiore di 1 nel caso di indici cluster.