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 una 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 è consentito l'utilizzo di una colonna calcolata come destinazione di 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. È possibile specificare NOT NULL per le colonne calcolate solo se si specifica anche 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 i vincoli PRIMARY KEY sono impostati su 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

    WITH FILLFACTOR = fillfactor è documentata come unica opzione di indice per i vincoli PRIMARY KEY o UNIQUE solo per motivi di compatibilità con le versioni precedenti. Non sarà più documentata in questo senso nelle versioni future. È possibile specificare altre opzioni di indice nella clausola index_option (Transact-SQL) di ALTER TABLE.

  • FOREIGN KEY REFERENCES
    Vincolo che assicura l'integrità referenziale dei dati di una o più colonne. Per i vincoli FOREIGN KEY è necessario che ogni valore della colonna sia presente nella colonna o nelle colonne con riferimenti corrispondenti della tabella a cui si fa riferimento. È possibile fare riferimento a vincoli FOREIGN KEY solo nelle colonne che nella tabella con riferimenti corrispondono a vincoli PRIMARY KEY o UNIQUE o nelle colonne a cui viene fatto riferimento in un indice univoco nella tabella di riferimento. Le chiavi esterne in colonne calcolate devono inoltre essere contrassegnate come PERSISTED.

  • 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
      Il Motore di database genera un errore e viene eseguito il rollback dell'azione di eliminazione sulla riga nella tabella padre.

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

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

    Se in una riga della tabella Vendor viene eseguita un'istruzione DELETE e per ProductVendor.VendorID si specifica un'azione ON DELETE CASCADE, Motore di database verifica l'esistenza di 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.

    Se invece si specifica NO ACTION, Motore di database genera un errore ed esegue il rollback dell'azione di eliminazione della riga nella tabella Vendor quando almeno una riga della tabella ProductVendor 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, Motore di database genera un errore e viene eseguito il rollback dell'azione di aggiornamento nella riga Vendor se esiste almeno una riga nella tabella ProductVendor che vi fa riferimento.

  • 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. I vincoli CHECK in colonne calcolate devono inoltre essere contrassegnati come PERSISTED.

  • 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, ma un identificatore per il filegroup predefinito e pertanto deve essere delimitato, ad esempio ON "default" oppure 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.