Condividi tramite


CREATE TABLE (Transact-SQL)

Si applica a: SQL Server Database SQL di Azure Istanza gestita di SQL di Azure

Crea una nuova tabella in SQL Server e in Database SQL di Azure.

Nota

Per la sintassi di Azure Synapse Analytics, vedere CREATE TABLE (Azure Synapse Analytics).

Convenzioni relative alla sintassi Transact-SQL

Opzioni di sintassi

Sintassi comune

Sintassi CREATE TABLE semplice (comune se non si usano opzioni):

CREATE TABLE
    { database_name.schema_name.table_name | schema_name.table_name | table_name }
    ( { <column_definition> } [ ,... n ] )
[ ; ]

Sintassi completa

Sintassi CREATE TABLE basata su disco:

CREATE TABLE
    { database_name.schema_name.table_name | schema_name.table_name | table_name }
    [ AS FileTable ]
    ( { <column_definition>
        | <computed_column_definition>
        | <column_set_definition>
        | [ <table_constraint> ] [ ,... n ]
        | [ <table_index> ] }
          [ ,... n ]
          [ PERIOD FOR SYSTEM_TIME ( system_start_time_column_name
             , system_end_time_column_name ) ]
      )
    [ ON { partition_scheme_name ( partition_column_name )
           | filegroup
           | "default" } ]
    [ TEXTIMAGE_ON { filegroup | "default" } ]
    [ FILESTREAM_ON { partition_scheme_name
           | filegroup
           | "default" } ]
    [ WITH ( <table_option> [ ,... n ] ) ]
[ ; ]

<column_definition> ::=
column_name <data_type>
    [ FILESTREAM ]
    [ COLLATE collation_name ]
    [ SPARSE ]
    [ MASKED WITH ( FUNCTION = 'mask_function' ) ]
    [ [ CONSTRAINT constraint_name ] DEFAULT constant_expression ]
    [ IDENTITY [ ( seed , increment ) ]
    [ NOT FOR REPLICATION ]
    [ GENERATED ALWAYS AS { ROW | TRANSACTION_ID | SEQUENCE_NUMBER } { START | END } [ HIDDEN ] ]
    [ [ CONSTRAINT constraint_name ] {NULL | NOT NULL} ]
    [ ROWGUIDCOL ]
    [ ENCRYPTED WITH
        ( COLUMN_ENCRYPTION_KEY = key_name ,
          ENCRYPTION_TYPE = { DETERMINISTIC | RANDOMIZED } ,
          ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256'
        ) ]
    [ <column_constraint> [ ,... n ] ]
    [ <column_index> ]

<data_type> ::=
[ type_schema_name. ] type_name
    [ ( precision [ , scale ] | max |
        [ { CONTENT | DOCUMENT } ] xml_schema_collection ) ]

<column_constraint> ::=
[ CONSTRAINT constraint_name ]
{
   { PRIMARY KEY | UNIQUE }
        [ CLUSTERED | NONCLUSTERED ]
        [ ( <column_name> [ ,... n ] ) ]
        [
            WITH FILLFACTOR = fillfactor
          | WITH ( <index_option> [ ,... n ] )
        ]
        [ ON { partition_scheme_name ( partition_column_name )
            | filegroup | "default" } ]

  | [ FOREIGN KEY ]
        REFERENCES [ schema_name. ] referenced_table_name [ ( ref_column ) ]
        [ ON DELETE { NO ACTION | CASCADE | SET NULL | SET DEFAULT } ]
        [ ON UPDATE { NO ACTION | CASCADE | SET NULL | SET DEFAULT } ]
        [ NOT FOR REPLICATION ]

  | CHECK [ NOT FOR REPLICATION ] ( logical_expression )
}

<column_index> ::=
 INDEX index_name [ CLUSTERED | NONCLUSTERED ]
    [ WITH ( <index_option> [ ,... n ] ) ]
    [ ON { partition_scheme_name ( column_name )
         | filegroup_name
         | default
         }
    ]
    [ FILESTREAM_ON { filestream_filegroup_name | partition_scheme_name | "NULL" } ]

<computed_column_definition> ::=
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 referenced_table_name [ ( ref_column ) ]
        [ ON DELETE { NO ACTION | CASCADE } ]
        [ ON UPDATE { NO ACTION } ]
        [ NOT FOR REPLICATION ]

    | CHECK [ NOT FOR REPLICATION ] ( logical_expression )
]

<column_set_definition> ::=
column_set_name XML COLUMN_SET FOR ALL_SPARSE_COLUMNS

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

<table_index> ::=
{
    {
      INDEX index_name [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ]
         ( column_name [ ASC | DESC ] [ ,... n ] )
    | INDEX index_name CLUSTERED COLUMNSTORE [ ORDER (column_name [ , ...n ] ) ]
    | INDEX index_name [ NONCLUSTERED ] COLUMNSTORE ( column_name [ ,... n ] )
    }
    [ INCLUDE ( column_name [ ,... n ] ) ]
    [ WHERE <filter_predicate> ]
    [ WITH ( <index_option> [ ,... n ] ) ]
    [ ON { partition_scheme_name ( column_name )
         | filegroup_name
         | default
         }
    ]
    [ FILESTREAM_ON { filestream_filegroup_name | partition_scheme_name | "NULL" } ]
}

<table_option> ::=
{
    [ DATA_COMPRESSION = { NONE | ROW | PAGE }
      [ ON PARTITIONS ( { <partition_number_expression> | <range> }
      [ ,... n ] ) ] ]
    [ XML_COMPRESSION = { ON | OFF }
      [ ON PARTITIONS ( { <partition_number_expression> | <range> }
      [ ,... n ] ) ] ]
    [ FILETABLE_DIRECTORY = <directory_name> ]
    [ FILETABLE_COLLATE_FILENAME = { <collation_name> | database_default } ]
    [ FILETABLE_PRIMARY_KEY_CONSTRAINT_NAME = <constraint_name> ]
    [ FILETABLE_STREAMID_UNIQUE_CONSTRAINT_NAME = <constraint_name> ]
    [ FILETABLE_FULLPATH_UNIQUE_CONSTRAINT_NAME = <constraint_name> ]
    [ SYSTEM_VERSIONING = ON
        [ ( HISTORY_TABLE = schema_name.history_table_name
          [ , DATA_CONSISTENCY_CHECK = { ON | OFF } ]
    ) ]
    ]
    [ REMOTE_DATA_ARCHIVE =
      {
        ON [ ( <table_stretch_options> [ ,... n] ) ]
        | OFF ( MIGRATION_STATE = PAUSED )
      }
    ]
    [ DATA_DELETION = ON
          { (
             FILTER_COLUMN = column_name,
             RETENTION_PERIOD = { INFINITE | number { DAY | DAYS | WEEK | WEEKS
                              | MONTH | MONTHS | YEAR | YEARS }
        ) }
    ]
    [ LEDGER = ON [ ( <ledger_option> [ ,... n ] ) ]
    | OFF
    ]
}

<ledger_option>::=
{
    [ LEDGER_VIEW = schema_name.ledger_view_name [ ( <ledger_view_option> [ ,... n ] ) ] ]
    [ APPEND_ONLY = ON | OFF ]
}

<ledger_view_option>::=
{
    [ TRANSACTION_ID_COLUMN_NAME = transaction_id_column_name ]
    [ SEQUENCE_NUMBER_COLUMN_NAME = sequence_number_column_name ]
    [ OPERATION_TYPE_COLUMN_NAME = operation_type_id column_name ]
    [ OPERATION_TYPE_DESC_COLUMN_NAME = operation_type_desc_column_name ]
}

<table_stretch_options> ::=
{
    [ FILTER_PREDICATE = { NULL | table_predicate_function } , ]
      MIGRATION_STATE = { OUTBOUND | INBOUND | PAUSED }
 }

<index_option> ::=
{
    PAD_INDEX = { ON | OFF }
  | FILLFACTOR = fillfactor
  | IGNORE_DUP_KEY = { ON | OFF }
  | STATISTICS_NORECOMPUTE = { ON | OFF }
  | STATISTICS_INCREMENTAL = { ON | OFF }
  | ALLOW_ROW_LOCKS = { ON | OFF }
  | ALLOW_PAGE_LOCKS = { ON | OFF }
  | OPTIMIZE_FOR_SEQUENTIAL_KEY = { ON | OFF }
  | COMPRESSION_DELAY = { 0 | delay [ Minutes ] }
  | DATA_COMPRESSION = { NONE | ROW | PAGE | COLUMNSTORE | COLUMNSTORE_ARCHIVE }
       [ ON PARTITIONS ( { partition_number_expression | <range> }
       [ ,... n ] ) ]
  | XML_COMPRESSION = { ON | OFF }
      [ ON PARTITIONS ( { <partition_number_expression> | <range> }
      [ ,... n ] ) ]
}

<range> ::=
<partition_number_expression> TO <partition_number_expression>

Sintassi per le tabelle ottimizzate per la memoria

Sintassi CREATE TABLE ottimizzata per la memoria:

CREATE TABLE
    { database_name.schema_name.table_name | schema_name.table_name | table_name }
    ( { <column_definition>
    | [ <table_constraint> ] [ ,... n ]
    | [ <table_index> ]
      [ ,... n ] }
      [ PERIOD FOR SYSTEM_TIME ( system_start_time_column_name
        , system_end_time_column_name ) ]
)
    [ WITH ( <table_option> [ ,... n ] ) ]
 [ ; ]

<column_definition> ::=
column_name <data_type>
    [ COLLATE collation_name ]
    [ GENERATED ALWAYS AS ROW { START | END } [ HIDDEN ] ]
    [ NULL | NOT NULL ]
    [ [ CONSTRAINT constraint_name ] DEFAULT memory_optimized_constant_expression ]
    | [ IDENTITY [ ( 1, 1 ) ] ]
    [ <column_constraint> ]
    [ <column_index> ]

<data_type> ::=
 [type_schema_name. ] type_name [ (precision [ , scale ]) ]

<column_constraint> ::=
 [ CONSTRAINT constraint_name ]
{
  { PRIMARY KEY | UNIQUE }
      { NONCLUSTERED
        | NONCLUSTERED HASH WITH ( BUCKET_COUNT = bucket_count )
      }
  [ ( <column_name> [ ,... n ] ) ]
  | [ FOREIGN KEY ]
        REFERENCES [ schema_name. ] referenced_table_name [ ( ref_column ) ]
  | CHECK ( logical_expression )
}

<table_constraint> ::=
 [ CONSTRAINT constraint_name ]
{
   { PRIMARY KEY | UNIQUE }
     {
       NONCLUSTERED ( column_name [ ASC | DESC ] [ ,... n ])
       | NONCLUSTERED HASH ( column_name [ ,... n ] ) WITH ( BUCKET_COUNT = bucket_count )
                    }
    | FOREIGN KEY
        ( column_name [ ,... n ] )
        REFERENCES referenced_table_name [ ( ref_column [ ,... n ] ) ]
    | CHECK ( logical_expression )
}

<column_index> ::=
  INDEX index_name
{ [ NONCLUSTERED ] | [ NONCLUSTERED ] HASH WITH ( BUCKET_COUNT = bucket_count ) }

<table_index> ::=
  INDEX index_name
{   [ NONCLUSTERED ] HASH ( column_name [ ,... n ] ) WITH ( BUCKET_COUNT = bucket_count )
  | [ NONCLUSTERED ] ( column_name [ ASC | DESC ] [ ,... n ] )
      [ ON filegroup_name | default ]
  | CLUSTERED COLUMNSTORE [ WITH ( COMPRESSION_DELAY = { 0 | delay [ Minutes ] } ) ]
      [ ON filegroup_name | default ]

}

<table_option> ::=
{
    MEMORY_OPTIMIZED = ON
  | DURABILITY = { SCHEMA_ONLY | SCHEMA_AND_DATA }
  | SYSTEM_VERSIONING = ON [ ( HISTORY_TABLE = schema_name.history_table_name
        [, DATA_CONSISTENCY_CHECK = { ON | OFF } ] ) ]

}

Argomenti

database_name

Nome del database in cui viene creata la tabella. database_name deve specificare il nome di un database esistente. Se l'argomento database_name non viene specificato, il valore predefinito è il database corrente. L'account di accesso per la connessione corrente deve essere associato a un ID utente esistente nel database specificato da database_name. Questo ID utente deve avere le autorizzazioni CREATE TABLE.

schema_name

Nome dello schema a cui appartiene la nuova tabella.

table_name

Nome della nuova tabella. I nomi delle tabelle devono essere conformi alle regole per gli identificatori. table_name può essere un massimo di 128 caratteri, ad eccezione dei nomi delle tabelle temporanee locali (nomi preceduti da un segno di numero singolo (#)) che non possono superare i 116 caratteri.

AS FileTable

Si applica a: SQL Server 2012 (11.x) e versioni successive.

Consente di creare la nuova tabella come tabella FileTable. Non si specificano colonne perché una tabella FileTable ha uno schema fisso. Per altre informazioni, vedere FileTable.

column_name AS computed_column_expression

Espressione che definisce il valore di una colonna calcolata. Una colonna calcolata è una colonna virtuale che non viene archiviata fisicamente nella tabella, a meno che non sia contrassegnata come PERSISTED. Questo tipo di colonna viene calcolata in base a un'espressione che utilizza altre colonne nella stessa tabella. Ad esempio, una colonna calcolata può avere la definizione : 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 contenere tipi di dati alias.

È possibile usare le colonne calcolate in elenchi di selezione, clausole WHERE e ORDER BY o in qualsiasi altra posizione in cui è consentito l'utilizzo di espressioni regolari, con le eccezioni seguenti:

  • Le colonne calcolate devono essere contrassegnate come PERSISTED per partecipare a un vincolo CHECK o FOREIGN KEY.

  • È possibile usare 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 sia definito da un'espressione deterministica e il tipo di dati del risultato sia supportato nelle colonne dell'indice.

    Ad esempio, se la tabella contiene colonne a integer e b, la colonna a + b calcolata può essere indicizzata, ma la colonna a + DATEPART(dd, GETDATE()) calcolata non può essere indicizzata perché il valore può cambiare nelle chiamate successive.

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

Nota

Ogni riga di una tabella può includere valori diversi per le colonne correlate a una colonna calcolata. È pertanto possibile che non sia disponibile lo stesso valore per ciascuna riga della colonna calcolata.

In base alle espressioni utilizzate, il supporto dei valori Null per le colonne calcolate viene determinato automaticamente dal motore di database. Si presuppone che il risultato della maggior parte delle espressioni ammetta valori Null anche se sono presenti solo colonne in cui tali valori non sono ammessi, perché anche i possibili underflow oppure overflow generano risultati NULL. Per stabilire se una colonna calcolata in una tabella ammette o meno i valori Null, usare la funzione COLUMNPROPERTYcon la proprietà AllowsNull. Un'espressione che ammette i valori Null può essere convertita in un'espressione in cui tali valori non sono ammessi specificando ISNULL con la costante check_expression, dove la costante è un valore non Null che sostituisce qualsiasi risultato NULL. Per le colonne calcolate basate su espressioni di tipo CLR (Common Language Runtime) definito dall'utente è richiesta l'autorizzazione REFERENCES per il tipo.

PERSISTED

Specifica che il motore di database di SQL Server archivierà fisicamente i valori calcolati nella tabella e li aggiornerà se vengono aggiornate altre colonne da cui dipende la colonna calcolata. Quando si contrassegna una colonna calcolata come PERSISTED, è possibile creare un indice deterministico, ma non preciso, in una colonna calcolata. Per altre informazioni, vedere Indici per le colonne calcolate. Le colonne calcolate usate come colonne di partizionamento di una tabella partizionata devono essere contrassegnate come PERSISTED in modo esplicito. Se è specificato PERSISTED, il valore di computed_column_expression deve essere deterministico.

ON { partition_scheme | filegroup | "default" }

Specifica lo schema di partizione o il filegroup in cui la tabella viene archiviata. Se si specifica partition_scheme, la tabella deve essere partizionata e le relative partizioni devono essere archiviate in un set di uno o più filegroup specificati in partition_scheme. Se si specifica filegroup, la tabella viene archiviata nel filegroup indicato. Il filegroup deve essere presente nel database. Se "default" viene specificato o se ON non è specificato affatto, la tabella viene archiviata nel filegroup predefinito. Il meccanismo di archiviazione di una tabella come specificato in CREATE TABLE non può essere modificato successivamente.

ON { partition_scheme | filegroup | "default" } può essere specificato anche in un vincolo PRIMARY KEY o UNIQUE. Questi vincoli comportano la creazione di indici. Se si specifica filegroup, l'indice viene archiviato nel filegroup indicato. Se "default" viene specificato o se ON non è specificato affatto, l'indice viene archiviato nello stesso filegroup della tabella. Se il vincolo PRIMARY KEY o UNIQUE crea un indice cluster, le pagine di dati della tabella vengono archiviate nello stesso filegroup dell'indice. Se si specifica CLUSTERED o se il vincolo crea in altro modo un indice cluster e si specifica un valore partition_scheme diverso dal valore partition_scheme o filegroup della definizione della tabella, o viceversa, verrà rispettata solo la definizione del vincolo e gli altri valori verranno ignorati.

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 "default" è specificato, l'opzione QUOTED_IDENTIFIER deve essere IMPOSTATA per la sessione corrente. Si tratta dell'impostazione predefinita. Per altre informazioni, vedere SET QUOTED_IDENTIFIER.

Dopo avere creato una tabella partizionata, impostare l'opzione LOCK_ESCALATION per la tabella su AUTO. In questo modo è possibile migliorare la concorrenza consentendo ai blocchi di eseguire l'escalation a livello di partizione (HoBT) anziché di tabella. Per altre informazioni, vedere ALTER TABLE.

TEXTIMAGE_ON { filegroup | "default" }

Indica che le colonne di tipo text, ntext, image, xml, varchar(max), nvarchar(max), varbinary(max) e CLR definito dall'utente (inclusi geometry e geography) vengono archiviate nel filegroup specificato.

TEXTIMAGE_ON non è consentito se nella tabella non sono presenti colonne di valori di grandi dimensioni. TEXTIMAGE_ON non può essere specificato se viene specificato partition_scheme . Se "default" viene specificato o se TEXTIMAGE_ON non viene specificato affatto, le colonne di valori di grandi dimensioni vengono archiviate nel filegroup predefinito. Non è possibile modificare l'archiviazione di tutti i dati delle colonne di valori di grandi dimensioni specificati in CREATE TABLE .

Nota

i valori varchar(max), nvarchar(max), varbinary(max), xml e large UDT vengono archiviati direttamente nella riga di dati, fino a un limite di 8.000 byte e purché il valore possa adattarsi al record. Se le dimensioni del record non sono sufficienti per il valore, all'interno della riga viene archiviato un puntatore e i dati restanti vengono archiviati all'esterno della riga nello spazio di archiviazione LOB. 0 è il valore predefinito e indica che tutti i valori vengono archiviati direttamente nella riga di dati.

TEXTIMAGE_ON modifica solo la posizione dello "spazio di archiviazione LOB", non influisce quando i dati sono archiviati nella riga. Utilizzare tipi valore di grandi dimensioni all'esterno dell'opzione riga di sp_tableoption per archiviare l'intero valore LOB dalla riga.

In questo contesto, default non è una parola chiave. Si tratta di un identificatore del filegroup predefinito e deve essere delimitato, ad esempio TEXTIMAGE_ON "default" o TEXTIMAGE_ON [default]. Se "default" è specificato, l'opzione QUOTED_IDENTIFIER deve essere IMPOSTATA per la sessione corrente. Si tratta dell'impostazione predefinita. Per altre informazioni, vedere SET QUOTED_IDENTIFIER.

FILESTREAM_ON { partition_scheme_name | filegroup | "default" }

Si applica a: SQL Server 2008 R2 (10.50.x) e versioni successive. database SQL di Azure e Istanza gestita di SQL di Azure non supportano FILESTREAM.

Specifica il filegroup per i dati FILESTREAM.

Se la tabella contiene dati FILESTREAM e la tabella è partizionata, è necessario includere la clausola FILESTREAM_ON e specificare uno schema di partizione di filegroup FILESTREAM. che utilizzi la stessa funzione e le stesse colonne di partizione dello schema di partizione per la tabella. In caso contrario, verrà generato un errore.

Se la tabella non è partizionata, la colonna FILESTREAM non può essere partizionata. I dati FILESTREAM per la tabella devono essere archiviati in un singolo filegroup, specificato nella clausola FILESTREAM_ON.

Se la tabella non è partizionata e la FILESTREAM_ON clausola non viene specificata, viene usato il filegroup FILESTREAM con il DEFAULT set di proprietà. Se non è presente alcun filegroup FILESTREAM, viene generato un errore.

Come per ON e TEXTIMAGE_ON, il valore impostato usando CREATE TABLE per FILESTREAM_ON non può essere modificato, tranne nei casi seguenti:

  • Un'istruzione CREATE INDEX converte un heap in un indice cluster. In questo caso è possibile specificare un filegroup FILESTREAM diverso, uno schema di partizione o NULL.
  • Un'istruzione DROP INDEX converte un indice cluster in un heap. In questo caso, è possibile specificare un filegroup FILESTREAM diverso, uno schema di partizione o "default" uno schema di partizione diverso.

Per il filegroup nella clausola FILESTREAM_ON <filegroup> o per ogni filegroup FILESTREAM denominato nello schema di partizione deve essere presente un file definito per il filegroup. Il file deve essere definito usando un'istruzione CREATE DATABASE o ALTER DATABASE. In caso contrario, viene generato un errore.

Per gli articoli relativi a FILESTREAM, vedere Binary Large Object - Blob Data.For related FILESTREAM articles, see Binary Large Object - Blob Data.

[ type_schema_name. ] type_name

Specifica il tipo di dati della colonna e lo schema a cui appartiene. Per le tabelle basate su disco, usare uno dei tipi di dati seguenti:

  • Un tipo di dati di sistema
  • Un tipo di dati alias basato su un tipo di dati di sistema di SQL Server. Per consentirne l'uso in una definizione di tabella, i tipi di dati alias vengono creati con l'istruzione CREATE TYPE. L'assegnazione NULL o NOT NULL per un tipo di dati alias può essere ignorata durante l'esecuzione dell'istruzione CREATE TABLE. Tuttavia, la specifica della lunghezza non può essere modificata; La lunghezza di un tipo di dati alias non può essere specificata in un'istruzione CREATE TABLE .
  • Tipo CLR definito dall'utente. I tipi CLR definiti dall'utente devono essere creati con l'istruzione CREATE TYPE perché possano essere usati in una definizione di tabella. Per creare una colonna con un tipo CLR definito dall'utente, è richiesta l'autorizzazione REFERENCES per il tipo.

Se type_schema_name non viene specificato, sql Server motore di database fa riferimento type_name nell'ordine seguente:

  • Tipo di dati di sistema di SQL Server.
  • Schema predefinito dell'utente corrente nel database corrente.
  • Schema dbo nel database corrente.

Per le tabelle ottimizzate per la memoria, vedere Tipi di dati supportati per OLTP in memoria per un elenco dei tipi di sistema supportati.

  • precision

    Precisione del tipo di dati specificato. Per altre informazioni sui valori di precisione validi, vedere Precisione, scala e lunghezza.

  • scale

    Scala per il tipo di dati specificato. Per altre informazioni sui valori di scala validi, vedere Precisione, scala e lunghezza.

  • max

    Viene applicato solo ai tipi di dati varchar, nvarchar e varbinary per l'archiviazione di 2^31 byte di dati di tipo carattere e binario e 2^30 byte di dati di tipo Unicode.

CONTENUTO

Specifica che ogni istanza del tipo di dati xml in column_name può contenere più elementi di livello superiore. CONTENT si applica solo al tipo di dati xml e può essere specificato solo se viene specificato anche xml_schema_collection. Se non specificato, CONTENT rappresenta il comportamento predefinito.

DOCUMENT

Specifica che ogni istanza del tipo di dati xml in column_name può contenere solo un elemento di livello superiore. DOCUMENT si applica solo al tipo di dati xml e può essere specificato solo se viene specificato anche xml_schema_collection.

xml_schema_collection

Si applica solo al tipo di dati xml per associare una raccolta di XML Schema al tipo. Per poter digitare una colonna xml in uno schema, è necessario creare lo schema nel database usando CREATE XML SCHEMA COLLECTION.

DEFAULT

Specifica il valore assegnato alla colonna quando non viene specificato un valore in modo esplicito durante un inserimento. È possibile applicare le definizioni DEFAULT a qualsiasi colonna, ad eccezione di quelle definite come timestamp o con la proprietà IDENTITY. Se si specifica un valore predefinito per una colonna di tipo definito dall'utente, il tipo deve supportare la conversione implicita da constant_expression nel tipo definito dall'utente. Le definizioni DEFAULT vengono rimosse quando la tabella viene eliminata. È possibile usare come predefinito solo un valore costante, ad esempio una stringa di caratteri, una funzione scalare (una funzione di sistema, definita dall'utente o CLR) oppure un valore NULL. Per garantire la compatibilità con le versioni precedenti di SQL Server, è possibile assegnare un nome di vincolo a una definizione DEFAULT.

  • constant_expression

    Costante, NULL o funzione di sistema utilizzata come valore predefinito per la colonna.

  • memory_optimized_constant_expression

    Costante, NULL o funzione di sistema supportata in utilizzata come valore predefinito per la colonna. Deve essere supportata nelle stored procedure compilate in modo nativo. Per altre informazioni sulle funzioni predefinite nelle store procedure compilate in modo nativo, vedere Funzionalità supportate per i moduli T-SQL compilati in modo nativo.

IDENTITY

Indica che la nuova colonna è una colonna Identity. Quando si aggiunge una nuova riga alla tabella, il motore di database assegna un valore univoco e incrementale alla colonna. Le colonne Identity vengono in genere utilizzate in combinazione con vincoli PRIMARY KEY come identificatori di riga univoci per la tabella. La IDENTITY proprietà può essere assegnata a colonne tinyint, smallint, int, bigint, decimal(p, 0)o numeric(p, 0). Ogni tabella può includere una sola colonna Identity. Non è consentito associare valori predefiniti e vincoli DEFAULT alle colonne Identity. È necessario specificare sia il valore di inizializzazione, sia l'incremento oppure nessuno dei due. In questo secondo caso, il valore predefinito è (1,1).

  • seed

    Valore usato per la prima riga caricata nella tabella.

  • increment

    Valore incrementale aggiunto al valore Identity della riga precedente caricata.

NOT FOR REPLICATION

Nell'istruzione CREATE TABLE è possibile specificare la clausola NOT FOR REPLICATION per la proprietà IDENTITY, i vincoli FOREIGN KEY e i vincoli CHECK. Se questa clausola viene specificata per la IDENTITY proprietà , i valori non vengono incrementati nelle colonne Identity quando gli agenti di replica eseguono inserimenti. Se questa clausola viene specificata per un vincolo, il vincolo non viene applicato quando gli agenti di replica eseguono operazioni di inserimento, aggiornamento o eliminazione.

GENERATED ALWAYS AS { ROW | TRANSACTION_ID | SEQUENCE_NUMBER } { START | END } [ HIDDEN ] [ NOT NULL ]

Si applica a: SQL Server 2016 (13.x) e versioni successive, database SQL di Azure e Istanza gestita di SQL di Azure.

Specifica una colonna usata dal sistema per registrare automaticamente le informazioni sulle versioni di riga della tabella e sulla relativa tabella di cronologia (se la tabella è con controllo delle versioni del sistema e include una tabella di cronologia). Usare questo argomento con il parametro WITH SYSTEM_VERSIONING = ON per creare tabelle con controllo delle versioni di sistema: tabelle temporali o di contabilità generale. Per altre informazioni, vedere Tabelle di contabilità generale aggiornabili e Tabelle temporali.

Parametro Tipo di dati richiesto Supporto dei valori Null richiesto Descrizione
ROW datetime2 START: NOT NULL
END: NOT NULL
L'ora di inizio (START) o di fine (END) per cui una versione di riga è valida. Usare questo argomento con l'argomento PERIOD FOR SYSTEM_TIME per creare una tabella temporale.
TRANSACTION_ID bigint START: NOT NULL
END: NULL
Si applica a: SQL Server 2022 (16.x) e versioni successive e database SQL di Azure.

L'ID della transazione che crea (START) o invalida (END) una versione di riga. Se la tabella è una tabella libro mastro, l'ID fa riferimento a una riga nella vista sys.database_ledger_transactions
SEQUENCE_NUMBER bigint START: NOT NULL
END: NULL
Si applica a: SQL Server 2022 (16.x) e versioni successive e database SQL di Azure.

Il numero di sequenza di un'operazione che crea (START) o elimina (END) una versione di riga. Questo valore è univoco all'interno della transazione.

Se si tenta di specificare una colonna che non soddisfa i requisiti di tipo di dati o nullbility precedenti, il sistema genererà un errore. Se non si specifica in modo esplicito valori Nullbility, il sistema definirà la colonna come NULL o NOT NULL in base ai requisiti precedenti.

È possibile contrassegnare una o entrambe le colonne period con HIDDEN flag per nascondere in modo implicito queste colonne in modo che SELECT * FROM <table> non restituiscano un valore per tali colonne. Per impostazione predefinita, le colonne periodo non vengono nascoste. Per poter essere usate, le colonne nascoste devono essere incluse in modo esplicito in tutte le query che fanno direttamente riferimento alla tabella temporale. Per modificare l'attributo HIDDEN per una colonna punto esistente, PERIOD è necessario eliminare e ricreare con un flag nascosto diverso.

INDEX index_name [ CLUSTERED | NONCLUSTERED ] ( column_name [ ASC | DESC ] [ ,... n ] )

Si applica a: SQL Server 2014 (12.x) e versioni successive e database SQL di Azure.

Specifica che deve essere creato un indice per la tabella. Può trattarsi di un indice cluster o un indice non cluster. L'indice conterrà le colonne indicate e i dati in ordine crescente o decrescente.

INDEX index_name CLUSTERED COLUMNSTORE

Si applica a: SQL Server 2014 (12.x) e versioni successive e database SQL di Azure.

Specifica di archiviare l'intera tabella nel formato a colonne con un indice columnstore cluster. Questo include sempre tutte le colonne nella tabella. I dati non vengono ordinati in ordine alfabetico o numerico perché le righe sono organizzate per ottenere vantaggi della compressione columnstore.

In Azure Synapse Analytics, platform system (PDW) e SQL Server 2022 (16.x) e versioni successive è possibile determinare l'ordine delle colonne per un indice columnstore cluster. Per altre informazioni, vedere Usare un indice columnstore cluster ordinato per tabelle di data warehouse di grandi dimensioni.

INDEX index_name [ NONCLUSTERED ] COLUMNSTORE ( column_name [ ,... n ] )

Si applica a: SQL Server 2014 (12.x) e versioni successive e database SQL di Azure.

Specifica che deve essere creato un indice columnstore non cluster per la tabella. La tabella sottostante può essere un heap rowstore o un indice cluster oppure può essere un indice columnstore cluster. In tutti i casi, la creazione di un indice columnstore non cluster in una tabella consente di archiviare una seconda copia dei dati per le colonne dell'indice.

L'indice columnstore non cluster viene archiviato e gestito come indice columnstore cluster. Viene definito indice columnstore non cluster perché le colonne possono essere limitate e l'indice esiste come indice secondario di una tabella.

ON partition_scheme_name ( column_name )

Specifica lo schema di partizione che definisce i filegroup a cui verrà eseguito il mapping delle partizioni di un indice partizionato. È necessario che lo schema di partizione sia presente nel database e sia stato creato eseguendo CREATE PARTITION SCHEME o ALTER PARTITION SCHEME. column_name specifica la colonna in base alla quale verrà eseguita la partizione di un indice partizionato. La colonna deve corrispondere all'argomento della funzione di partizione usata da partition_scheme_name per tipo di dati, lunghezza e precisione. column_name non è limitato alle colonne nella definizione dell'indice. È possibile specificare qualsiasi colonna della tabella di base tranne quando si esegue la partizione di un indice UNIQUE. In questo caso il valore column_name deve essere scelto tra quelli usati come chiave univoca. Questa restrizione consente al motore di database di verificare l'univocità dei valori di chiave solo all'interno di una singola partizione.

Nota

Quando si partiziona un indice cluster non univoco, per impostazione predefinita il motore di database aggiunge la colonna di partizionamento all'elenco delle chiavi di indice cluster, se non è già presente. Quando si partiziona un indice non cluster non univoco, il motore di database aggiunge la colonna di partizionamento come colonna non chiave (inclusa) dell'indice, se non è già presente.

Se non si specifica partition_scheme_name o filegroup e la tabella è partizionata, l'indice viene posizionato nello stesso schema di partizione, usando la stessa colonna di partizionamento della tabella sottostante.

Nota

Non è possibile specificare uno schema di partizione per un indice XML. Se la tabella di base è partizionata, l'indice XML utilizzerà lo stesso schema di partizione della tabella.

Per altre informazioni sul partizionamento degli indici, vedere Tabelle e indici partizionati.

ON filegroup_name

Crea l'indice specificato nel filegroup specificato. Se non viene specificata una posizione e la tabella o la vista non è partizionata, l'indice userà lo stesso filegroup della tabella o della vista sottostante. Il filegroup deve essere già esistente.

ON "default"

Crea l'indice specificato nel filegroup predefinito.

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 "default" è specificato, l'opzione QUOTED_IDENTIFIER deve essere IMPOSTATA per la sessione corrente. Si tratta dell'impostazione predefinita. Per altre informazioni, vedere SET QUOTED_IDENTIFIER.

[ FILESTREAM_ON { filestream_filegroup_name | partition_scheme_name | "NULL" } ]

Si applica a: SQL Server 2008 R2 (10.50.x) e versioni successive.

Specifica la posizione dei dati FILESTREAM per la tabella quando viene creato un indice cluster. La clausola FILESTREAM_ON consente di spostare i dati FILESTREAM in uno schema di partizione o in un filegroup FILESTREAM diverso.

filestream_filegroup_name è il nome di un filegroup FILESTREAM. Nel filegroup deve essere disponibile un file definito usando un'istruzione CREATE DATABASE o ALTER DATABASE. In caso contrario, viene generato un errore.

Se la tabella è partizionata, la FILESTREAM_ON clausola deve essere inclusa e deve specificare uno schema di partizione di filegroup FILESTREAM che utilizza la stessa funzione di partizione e le colonne di partizione dello schema di partizione per la tabella. In caso contrario, viene generato un errore.

Se la tabella non è partizionata, la colonna FILESTREAM non può essere partizionata. I dati FILESTREAM per la tabella devono essere archiviati in un singolo filegroup specificato nella clausola FILESTREAM_ON.

È possibile specificare FILESTREAM_ON NULL in un'istruzione CREATE INDEX se si sta creando un indice cluster e se nella tabella non è contenuta alcuna colonna FILESTREAM.

Per altre informazioni, vedere FILESTREAM.

ROWGUIDCOL

Indica che la nuova colonna è una colonna GUID di riga. È possibile designare come colonna ROWGUIDCOL una sola colonna di tipo uniqueidentifier per ogni tabella. L'applicazione della proprietà ROWGUIDCOL consente di fare riferimento alla colonna usando $ROWGUID. La proprietà ROWGUIDCOL può essere assegnata solo a una colonna uniqueidentifier. Le colonne del tipo di dati definite dall'utente non possono essere designate con ROWGUIDCOL.

La proprietà ROWGUIDCOL non impone l'univocità dei valori archiviati nella colonna. ROWGUIDCOL non genera automaticamente anche valori per le nuove righe inserite nella tabella. Per generare valori univoci per ogni colonna, usare la funzione NEWID o NEWSEQUENTIALID in istruzioni INSERT oppure usare tali funzioni come valore predefinito per la colonna.

ENCRYPTED WITH

Specifica la crittografia di colonne usando la funzionalità Always Encrypted.

  • COLUMN_ENCRYPTION_KEY = key_name

    Specifica la chiave di crittografia della colonna. Per altre informazioni, vedere CREATE COLUMN ENCRYPTION KEY.

  • ENCRYPTION_TYPE = { DETERMINISTIC | RANDOMIZED }

    La crittografia deterministica usa un metodo che genera sempre lo stesso valore crittografato per qualsiasi valore di testo normale specificato. L'uso della crittografia deterministica consente di eseguire operazioni di ricerca usando il confronto di uguaglianza, il raggruppamento e il join di tabelle con join di uguaglianza basati su valori crittografati, ma può anche consentire a utenti non autorizzati di ipotizzare informazioni sui valori crittografati esaminando i criteri nella colonna crittografata. È possibile creare un join di due tabelle nelle colonne crittografate in modo deterministico solo se entrambe le colonne vengono crittografate usando la stessa chiave di crittografia della colonna. La crittografia deterministica deve usare regole di confronto a livello di colonna con un ordinamento binario2 per colonne di tipo carattere.

    La crittografia casuale usa un metodo di crittografia dei dati meno prevedibile. La crittografia casuale è più sicura, ma impedisce i calcoli e l'indicizzazione delle colonne crittografate, a meno che l'istanza di SQL Server non supporti Always Encrypted con enclave sicuri. Per informazioni dettagliate, vedere Always Encrypted con enclave sicuri.

    Se si usa Always Encrypted (senza enclave sicuri), usare la crittografia deterministica per le colonne in cui verrà eseguita la ricerca con parametri o parametri di raggruppamento, ad esempio un numero ID per gli enti pubblici. Usare la crittografia casuale, per dati come un numero di carta di credito, che non è raggruppato con altri record o usati per unire tabelle e che non viene eseguita la ricerca perché si usano altre colonne (ad esempio un numero di transazione) per trovare la riga contenente la colonna crittografata di interesse.

    Se si usa Always Encrypted con enclave sicuri, la crittografia casuale è il tipo di crittografia consigliato.

    Le colonne devono essere di un tipo di dati idoneo.

  • ALGORITHM

    Si applica a: SQL Server 2016 (13.x) e versioni successive.

    Deve essere 'AEAD_AES_256_CBC_HMAC_SHA_256'.

    Per altre informazioni sui vincoli della funzionalità, vedere Always Encrypted.

SPARSE

Indica che la colonna è di tipo sparse. L'archiviazione delle colonne di tipo sparse è ottimizzata per valori Null. Le colonne di tipo sparse non possono essere designate come NOT NULL. Per altre restrizioni e informazioni relative alle colonne di tipo sparse, vedere Usare le colonne di tipo sparse.

MASKED WITH ( FUNCTION = 'mask_function')

Si applica a: SQL Server 2016 (13.x) e versioni successive.

Specifica una maschera dati dinamica. mask_function è il nome della funzione di maschera con i parametri appropriati. Sono disponibili quattro funzioni:

  • default()
  • email()
  • partial()
  • random()

È richiesta l'autorizzazione ALTER ANY MASK.

Per i parametri di funzione, vedere Mascheramento dati dinamici.

FILESTREAM

Si applica a: SQL Server 2008 R2 (10.50.x) e versioni successive.

Valido solo per le colonne varbinary (max). Specifica l'archiviazione FILESTREAM per i dati BLOB varbinary(max).

Nella tabella deve inoltre essere presente una colonna con tipo di dati uniqueidentifier con l'attributo ROWGUIDCOL. Questa colonna non deve consentire valori Null e deve avere un vincolo a colonna singola UNIQUE o PRIMARY KEY. Il valore GUID per la colonna deve essere specificato da un'applicazione al momento dell'inserimento dei dati o da un vincolo DEFAULT che utilizza la funzione NEWID ().

La colonna ROWGUIDCOL non può essere eliminata e i vincoli correlati non possono essere modificati mentre è presente una colonna FILESTREAM definita per la tabella. La colonna ROWGUIDCOL può essere eliminata solo dopo l'eliminazione dell'ultima colonna FILESTREAM.

Quando l'attributo di archiviazione FILESTREAM viene specificato per una colonna, tutti i valori per quella colonna vengono archiviati in un contenitore di dati FILESTREAM nel file system.

COLLATE collation_name

Specifica le regole di confronto per la colonna. È possibile usare nomi di regole di confronto di Windows o SQL. collation_name è applicabile solo alle colonne con tipo di dati char, varchar, text, nchar, nvarchar e ntext. Se non specificato, alla colonna vengono assegnate le regole di confronto del tipo di dati definito dall'utente, se la colonna presenta questo tipo di dati, oppure le regole di confronto predefinite del database.

Per altre informazioni sui nomi delle regole di confronto di Windows e SQL, vedere gli argomenti relativi al nome delle regole di confronto di Windows e al nome delle regole di confronto SQL.

Per altre informazioni, vedere COLLATE.

CONSTRAINT

Parola chiave facoltativa che indica l'inizio della definizione di un vincolo PRIMARY KEY, NOT NULL, UNIQUE, FOREIGN KEY o CHECK.

  • constraint_name

    Nome di un vincolo. I nomi di vincolo devono essere univoci nell'ambito dello schema a cui appartiene la tabella.

  • NULL | NOT NULL

    Indica se i valori NULL sono consentiti nella colonna. NULL non è strettamente un vincolo, ma può essere specificato esattamente come NOT NULL. È possibile specificare NOT NULL per le colonne calcolate solo se è specificato PERSISTED.

  • PRIMARY KEY

    Vincolo che applica l'integrità dell'entità per una colonna o una colonna specificata tramite un indice univoco. È possibile creare un solo vincolo PRIMARY KEY per ogni tabella.

  • UNIQUE

    Vincolo che fornisce l'integrità dell'entità per una colonna o una colonna specificata tramite un indice univoco. Una tabella può includere più vincoli UNIQUE.

  • CLUSTERED | NONCLUSTERED

    Indica che viene creato un indice cluster o non cluster per il vincolo PRIMARY KEY o UNIQUE. Il valore predefinito per i vincoli PRIMARY KEY è CLUSTERED, mentre per i vincoli UNIQUE è NONCLUSTERED.

    In un'istruzione CREATE TABLE è possibile specificare CLUSTERED per un solo vincolo. Se si specifica CLUSTERED per un vincolo UNIQUE e si specifica anche un vincolo PRIMARY KEY, il valore predefinito di quest'ultimo è NONCLUSTERED.

  • FOREIGN KEY REFERENCES

    Vincolo che fornisce l'integrità referenziale per i dati nella colonna o nelle 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.

  • [ [ schema_name. ] referenced_table_name ]

    Nome della tabella a cui fa riferimento il vincolo FOREIGN KEY e lo schema a cui appartiene.

  • ( ref_column [ ,... n ] )

    Colonna o elenco di colonne dalla tabella a cui fa riferimento il vincolo FOREIGN KEY.

  • ON DELETE { NO ACTION | CASCADE | SET NULL | SET DEFAULT }

    Specifica quale azione eseguire sulle righe nella tabella creata, se tali righe includono una relazione referenziale e se la riga a cui viene fatto riferimento viene eliminata dalla tabella padre. Il valore predefinito è NO ACTION.

  • NO ACTION

    Il motore di database genera un errore e viene eseguito il rollback dell'azione di eliminazione della riga nella tabella padre.

  • CASCADE

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

  • SET NULL

    Tutti i valori che compongono la chiave esterna vengono impostati su NULL se viene eliminata la riga corrispondente nella tabella padre. Per l'esecuzione di questo vincolo, è necessario che le colonne chiave esterna ammettano valori Null.

  • SET DEFAULT

    Tutti i valori che costituiscono la chiave esterna vengono impostati sui valori predefiniti quando viene eliminata la riga corrispondente nella tabella padre. Per l'esecuzione di questo vincolo, è necessario che per tutte le colonne chiave esterna siano definiti valori predefiniti. Se una colonna ammette valori Null e non viene impostato un valore predefinito esplicito, NULL diventa il valore predefinito implicito della colonna.

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

    ON DELETE CASCADE non può essere definito se nella tabella esiste già un INSTEAD OF trigger ON DELETE .

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

    Se un'istruzione DELETE viene eseguita su una riga della Vendor tabella e viene specificata un'azione ON DELETE CASCADE per ProductVendor.BusinessEntityID, il motore di database verifica la presenza di una o più righe dipendenti nella ProductVendor tabella. Se presente, le righe dipendenti nella ProductVendor tabella vengono eliminate e anche la riga a cui si fa riferimento nella Vendor tabella.

    Viceversa, se NO ACTION viene specificato, il motore di database genera un errore ed esegue il rollback dell'azione di eliminazione nella Vendor riga se nella tabella è presente almeno una riga ProductVendor che vi fa riferimento.

  • ON UPDATE { NO ACTION | CASCADE | SET NULL | SET DEFAULT }

    Specifica l'azione eseguita nelle righe della tabella modificata se tali righe includono una relazione referenziale e la riga a cui viene fatto riferimento è stata aggiornata nella tabella padre. Il valore predefinito è NO ACTION.

  • NO ACTION

    Il motore di database genera un errore e viene eseguito il rollback dell'azione di aggiornamento della riga nella tabella padre.

  • CASCADE

    Le righe corrispondenti vengono aggiornate nella tabella di riferimento quando la riga viene aggiornata nella tabella padre.

  • SET NULL

    Tutti i valori che costituiscono la chiave esterna vengono impostati su NULL quando viene aggiornata la riga corrispondente nella tabella padre. Per l'esecuzione di questo vincolo, è necessario che le colonne chiave esterna ammettano valori Null.

  • SET DEFAULT

    Tutti i valori che costituiscono la chiave esterna vengono impostati sui rispettivi valori predefiniti quando viene aggiornata la riga corrispondente nella tabella padre. Per l'esecuzione di questo vincolo, è necessario che per tutte le colonne chiave esterna siano definiti valori predefiniti. Se una colonna ammette valori Null e non viene impostato un valore predefinito esplicito, NULL diventa il valore predefinito implicito della colonna.

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

    ON UPDATE CASCADE, SET NULLo SET DEFAULT non può essere definito se esiste già un INSTEAD OF trigger ON UPDATE nella tabella da modificare.

    Nel database, ad esempio, AdventureWorks2022 la ProductVendor tabella ha una relazione referenziale con la Vendor tabella: ProductVendor.BusinessEntity la chiave esterna fa riferimento alla Vendor.BusinessEntityID chiave primaria.

    Se viene eseguita un'istruzione UPDATE in una riga della Vendor tabella e viene specificata un'azione ON UPDATE CASCADE per ProductVendor.BusinessEntityID, il motore di database verifica la presenza di una o più righe dipendenti nella ProductVendor tabella. Se presente, le righe dipendenti nella ProductVendor tabella vengono aggiornate e anche la riga a cui viene fatto riferimento nella Vendor tabella.

    Viceversa, se si specifica NO ACTION, il motore di database genera un errore e esegue il rollback dell'azione di aggiornamento nella Vendor riga se nella tabella vi è almeno una riga ProductVendor a cui fa riferimento.

  • 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. I tipi di dati alias non possono far parte dell'espressione.

  • column_name

    Colonna o elenco di colonne, tra parentesi, utilizzate nei vincoli di tabella per indicare le colonne utilizzate nella definizione del vincolo.

  • [ ASC | DESC ]

    Specifica l'ordinamento della colonna o delle colonne che fanno parte dei vincoli di tabella. Il valore predefinito è ASC.

  • partition_scheme_name

    Nome dello schema di partizione che definisce i filegroup in cui verranno mappate le partizioni di una tabella partizionata. Lo schema di partizione deve essere presente nel database.

  • [ partition_column_name. ]

    Specifica la colonna in base alla quale verrà partizionata una tabella partizionata. La colonna deve corrispondere a quella specificata nella funzione di partizione usata da partition_scheme_name in termini di tipo di dati, lunghezza e precisione. Una colonna calcolata usata in una funzione di partizione deve essere contrassegnata in modo esplicito come PERSISTED.

    Importante

    Si consiglia di specificare NOT NULL sulla colonna di partizionamento di tabelle partizionate oppure di tabelle non partizionate che rappresentano origini o destinazioni di operazioni ALTER TABLE...SWITCH. In questo modo, i vincoli CHECK su colonne di partizionamento non devono verificare la presenza di valori Null.

  • WITH FILLFACTOR = fillfactor

    Specifica la percentuale utilizzata dal motore di database per riempire ogni pagina dell'indice usata per archiviare dati dell'indice. I valori per fillfactor specificati dall'utente possono essere compresi tra 1 e 100. Se non viene specificato un valore, il valore predefinito è 0. I valori 0 e 100 relativi al fattore di riempimento sono equivalenti.

    Importante

    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.

column_set_name XML COLUMN_SET FOR ALL_SPARSE_COLUMNS

Nome del set di colonne. Un set di colonne è una rappresentazione XML non tipizzata che combina tutte le colonne di tipo sparse di una tabella in un output strutturato. Per altre informazioni sui set di colonne, vedere Utilizzare set di colonne.

PERIOD FOR SYSTEM_TIME ( system_start_time_column_name , system_end_time_column_name )

Si applica a: SQL Server 2016 (13.x) e versioni successive e database SQL di Azure.

Specifica i nomi delle colonne che il sistema userà per registrare il periodo di validità di un record. Utilizzare questo argomento con gli GENERATED ALWAYS AS ROW { START | END } argomenti e WITH SYSTEM_VERSIONING = ON per creare una tabella temporale. Per altre informazioni, vedere Temporal Tables.

COMPRESSION_DELAY

Si applica a: SQL Server 2016 (13.x) e versioni successive e database SQL di Azure.

Se è applicata l'ottimizzazione della memoria, il ritardo indica il numero minimo di minuti in cui una riga deve rimanere nella tabella, invariata, prima di essere idonea per la compressione nell'indice columnstore. SQL Server seleziona le righe specifiche da comprimere in base all'ora dell'ultimo aggiornamento. Se, ad esempio, le righe cambiano frequentemente durante un periodo di due ore, è possibile impostare COMPRESSION_DELAY = 120 Minutes per assicurarsi che gli aggiornamenti vengano completati prima che SQL Server comprima la riga.

Per una tabella basata su disco, il ritardo indica il numero minimo di minuti in cui un rowgroup differenziale deve rimanere nello stato CLOSED nel rowgroup differenziale prima che SQL Server lo comprima nel rowgroup compresso. Poiché le tabelle basate su disco non tengono traccia delle ore di inserimento e aggiornamento per le singole righe, SQL Server applica il ritardo ai rowgroup differenziali nello stato CLOSED.

Il valore predefinito è 0 minuti.

Per consigli su quando usare , vedere Introduzione a Columnstore per l'analisi COMPRESSION_DELAYoperativa in tempo reale

<table_option> ::=

Specifica una o più opzioni per la tabella.

DATA_COMPRESSION

Specifica l'opzione di compressione dei dati per la tabella, il numero di partizione o l'intervallo di partizioni specificato. Le opzioni sono le seguenti:

  • NONE

    La tabella o le partizioni specificate non vengono compresse.

  • ROW

    La tabella o le partizioni specificate vengono compresse utilizzando la compressione di riga.

  • PAGE

    La tabella o le partizioni specificate vengono compresse utilizzando la compressione di pagina.

  • COLUMNSTORE

    Si applica a: SQL Server 2016 (13.x) e versioni successive e database SQL di Azure.

    Si applica solo agli indici columnstore, inclusi gli indici columnstore cluster e quelli non cluster. COLUMNSTORE indica di usare la compressione del columnstore che offre le prestazioni migliori. Questa è la scelta tipica.

  • COLUMNSTORE_ARCHIVE

    Si applica a: SQL Server 2016 (13.x) e versioni successive e database SQL di Azure.

    Si applica solo agli indici columnstore, inclusi gli indici columnstore cluster e quelli non cluster. COLUMNSTORE_ARCHIVE comprimerà ulteriormente la tabella o la partizione a una dimensione inferiore. Può essere utilizzata per l'archiviazione o in altre situazioni in cui sono richieste dimensioni di archiviazione inferiori ed è possibile concedere più tempo per l'archiviazione e il recupero.

Per altre informazioni, vedere Data Compression.

XML_COMPRESSION

Si applica a: SQL Server 2022 (16.x) e versioni successive Database SQL di Azure e Istanza gestita di SQL di Azure

Specifica l'opzione di compressione XML per tutte le colonne con tipo di dati xml incluse nella tabella. Le opzioni sono le seguenti:

  • In...

    Le colonne che usano il tipo di dati xml vengono compresse.

  • OFF

    Le colonne che usano il tipo di dati xml non vengono compresse.

ON PARTITIONS ( { <partition_number_expression> | [ ,... n ] )

Specifica le partizioni a cui si applicano le impostazioni DATA_COMPRESSION o XML_COMPRESSION. Se la tabella non è partizionata, l'argomento ON PARTITIONS genererà un errore. Se la ON PARTITIONS clausola non viene specificata, l'opzione DATA_COMPRESSION verrà applicata a tutte le partizioni di una tabella partizionata.

partition_number_expression può essere specificato nei modi seguenti:

  • Specificare il numero di una partizione, ad esempio: ON PARTITIONS (2)
  • Specificare i numeri di partizione per più partizioni singole separati da virgole, ad esempio: ON PARTITIONS (1, 5)
  • Specificare sia intervalli sia singole partizioni, ad esempio: ON PARTITIONS (2, 4, 6 TO 8)

È possibile specificare <range> sotto forma di numeri di partizione separati dalla parola TO, ad esempio: ON PARTITIONS (6 TO 8).

Per impostare tipi diversi di compressione dei dati per partizioni diverse, specificare più volte l'opzione DATA_COMPRESSION, ad esempio:

WITH
(
    DATA_COMPRESSION = NONE ON PARTITIONS (1),
    DATA_COMPRESSION = ROW ON PARTITIONS (2, 4, 6 TO 8),
    DATA_COMPRESSION = PAGE ON PARTITIONS (3, 5)
);

È anche possibile specificare più volte l'opzione XML_COMPRESSION, ad esempio:

WITH
(
    XML_COMPRESSION = OFF ON PARTITIONS (1),
    XML_COMPRESSION = ON ON PARTITIONS (2, 4, 6 TO 8),
    XML_COMPRESSION = OFF ON PARTITIONS (3, 5)
);

<index_option> ::=

Specifica una o più opzioni per l'indice. Per una descrizione completa di queste opzioni, vedere CREATE INDEX.

PAD_INDEX = { ON | OFF }

Se l'opzione è impostata su ON, la percentuale di spazio disponibile specificata da FILLFACTOR viene applicata alle pagine di livello intermedio dell'indice. Se si specifica OFF o se non si specifica un valore FILLFACTOR, le pagine di livello intermedio vengono riempite quasi fino alla capacità massima, lasciando spazio sufficiente per almeno una riga delle dimensioni massime consentite per l'indice, considerando il set di chiavi nelle pagine intermedie. Il valore predefinito è OFF.

FILLFACTOR = fillfactor

Specifica una percentuale che indica quanto deve essere riempito il livello foglia di ogni pagina di indice dal motore di database durante la creazione o la modifica dell'indice. fillfactor deve essere un valore intero compreso tra 1 e 100. Il valore predefinito è 0. I valori 0 e 100 relativi al fattore di riempimento sono equivalenti.

IGNORE_DUP_KEY = { ON | OFF }

Specifica l'errore restituito quando un'operazione di inserimento tenta di inserire valori di chiave duplicati in un indice univoco. L'opzione IGNORE_DUP_KEY viene applicata solo alle operazioni di inserimento eseguite dopo la creazione o la ricompilazione dell'indice. L'opzione non ha alcun effetto se si esegue CREATE INDEX, ALTER INDEX o UPDATE. Il valore predefinito è OFF.

  • In...

    Viene visualizzato un messaggio di avviso quando i valori di chiave duplicati vengono inseriti in un indice univoco. Avranno esito negativo solo le righe che violano il vincolo di unicità.

  • OFF

    Viene visualizzato un messaggio di errore quando i valori di chiave duplicati vengono inseriti in un indice univoco. Viene eseguito il rollback dell'intera operazione INSERT.

L'opzione IGNORE_DUP_KEY non può essere impostata su ON per indici creati in una vista, indici non univoci, indici XML, indici spaziali e indici filtrati.

Per visualizzare IGNORE_DUP_KEY, usare sys.indexes.

Nella sintassi compatibile con le versioni precedenti WITH IGNORE_DUP_KEY equivale a WITH IGNORE_DUP_KEY = ON.

STATISTICS_NORECOMPUTE = { ON | OFF }

Quando si attiva, le statistiche di indice non aggiornate non vengono ricalcolate automaticamente. Se si specifica OFF, viene abilitato l'aggiornamento automatico delle statistiche. Il valore predefinito è OFF.

ALLOW_ROW_LOCKS = { ON | OFF }

Se si specifica ON, sono consentiti blocchi di riga per l'accesso all'indice. Il motore di database determina quando usare i blocchi di riga. Quando è disattivato, i blocchi di riga non vengono usati. Il valore predefinito è ON.

ALLOW_PAGE_LOCKS = { ON | OFF }

Se si specifica ON, sono consentiti blocchi di pagina per l'accesso all'indice. Il motore di database determina quando usare i blocchi di pagina. Quando è disattivato, i blocchi di pagina non vengono usati. Il valore predefinito è ON.

OPTIMIZE_FOR_SEQUENTIAL_KEY = { ON | OFF }

Si applica a: SQL Server 2019 (15.x) e versioni successive, database SQL di Azure e Istanza gestita di SQL di Azure.

Specifica se eseguire o meno l'ottimizzazione per la contesa di inserimento dell'ultima pagina. Il valore predefinito è OFF. Per altre informazioni, vedere le sezione Chiavi sequenziali della pagina CREATE INDEX.

FILETABLE_DIRECTORY = directory_name

Si applica a: SQL Server 2012 (11.x) e versioni successive.

Specifica un nome di directory FileTable compatibile con Windows. Questo nome deve essere univoco tra tutti i nomi di directory FileTable nel database. Il confronto di univocità non supporta la distinzione tra maiuscole e minuscole, indipendentemente dalle impostazioni delle regole di confronto di . Se questo valore non viene specificato, viene usato il nome della tabella FileTable.

FILETABLE_COLLATE_FILENAME = { collation_name | database_default }

Si applica a: SQL Server 2012 (11.x) e versioni successive. database SQL di Azure e Istanza gestita di SQL di Azure non supportano FILETABLE.

Specifica il nome delle regole di confronto da applicare alla Name colonna nella tabella FileTable. Nelle regole di confronto specificate non deve essere applicata la distinzione tra maiuscole e minuscole ai fini della conformità con la semantica di denominazione dei file dei sistemi operativi Windows. Se questo valore non viene specificato, vengono utilizzate le regole di confronto predefinite del database. Se le regole di confronto predefinite del database fa distinzione tra maiuscole e minuscole, viene generato un errore e l'operazione CREATE TABLE non riesce.

  • collation_name

    Nome delle regole di confronto senza distinzione tra maiuscole e minuscole.

  • database_default

    Viene specificato che è necessario usare le regole di confronto predefinite per il database. Nelle regole di confronto non deve essere applicata la distinzione tra maiuscole e minuscole.

FILETABLE_PRIMARY_KEY_CONSTRAINT_NAME = constraint_name

Si applica a: SQL Server 2012 (11.x) e versioni successive. database SQL di Azure e Istanza gestita di SQL di Azure non supportano FILETABLE.

Viene specificato il nome da usare per il vincolo di chiave primaria che viene creato automaticamente nella tabella FileTable. Se questo valore non viene specificato, il sistema genera un nome per il vincolo.

FILETABLE_STREAMID_UNIQUE_CONSTRAINT_NAME = constraint_name

Si applica a: SQL Server 2012 (11.x) e versioni successive. database SQL di Azure e Istanza gestita di SQL di Azure non supportano FILETABLE.

Specifica il nome da usare per il vincolo univoco che viene creato automaticamente nella colonna stream_id di FileTable. Se questo valore non viene specificato, il sistema genera un nome per il vincolo.

FILETABLE_FULLPATH_UNIQUE_CONSTRAINT_NAME = constraint_name

Si applica a: SQL Server 2012 (11.x) e versioni successive. database SQL di Azure e Istanza gestita di SQL di Azure non supportano FILETABLE.

Specifica il nome da usare per il vincolo univoco che viene creato automaticamente per le colonne parent_path_locator e name di FileTable. Se questo valore non viene specificato, il sistema genera un nome per il vincolo.

SYSTEM_VERSIONING = ON [ ( HISTORY_TABLE = schema_name. history_table_name [ , DATA_CONSISTENCY_CHECK = { ON | OFF } ] ) ] ]

Si applica a: SQL Server 2016 (13.x) e versioni successive, database SQL di Azure e Istanza gestita di SQL di Azure.

Abilita il controllo delle versioni di sistema della tabella se vengono soddisfatti i requisiti relativi a tipo di dati, vincolo di chiave primaria e vincolo per il supporto dei valori Null. Il sistema registrerà la cronologia di ogni record della tabella con versione di sistema all'interno di una tabella della cronologia separata. Se l'argomento HISTORY_TABLE non viene usato, il nome di questa tabella di cronologia sarà MSSQL_TemporalHistoryFor<primary_table_object_id>. Se durante la creazione della tabella di cronologia viene specificato il nome di una tabella di cronologia, è necessario specificare il nome tabella e il nome schema.

Se la tabella di cronologia non esiste, il sistema genera una nuova tabella di cronologia corrispondente allo schema della tabella corrente nello stesso filegroup della tabella corrente, creando un collegamento tra le due tabelle e consente al sistema di registrare la cronologia di ogni record nella tabella corrente nella tabella di cronologia. Per impostazione predefinita, la tabella di cronologia è *PAGE compresso.

Se si usa l'argomento HISTORY_TABLE per creare un collegamento e usare una tabella di cronologia esistente, il collegamento viene creato tra la tabella corrente e la tabella specificata. Se la tabella corrente è partizionata, la tabella di cronologia viene creata nel gruppo di file predefinito perché la configurazione del partizionamento non viene replicata automaticamente dalla tabella corrente nella tabella di cronologia. Quando si crea un collegamento a una tabella di cronologia esistente, è possibile scegliere di eseguire una verifica della coerenza dei dati. Questa verifica coerenza dei dati garantisce che i record esistenti non si sovrappongano. L'impostazione predefinita prevede l'esecuzione della verifica della coerenza dei dati.

Utilizzare questo argomento con gli argomenti e GENERATED ALWAYS AS ROW { START | END } per abilitare il PERIOD FOR SYSTEM_TIME controllo delle versioni di sistema in una tabella. Per altre informazioni, vedere Temporal Tables. Usare questo argomento con l'argomento WITH LEDGER = ON per creare una tabella di contabilità generale aggiornabile. L'uso di tabelle di cronologia esistenti con tabelle mastro non è consentito.

REMOTE_DATA_ARCHIVE = { ON [ ( table_stretch_options [ ,... n ] ) ] | OFF ( MIGRATION_STATE = PAUSED ) }

Si applica a: SQL Server 2016 (13.x) e versioni successive.

Crea la nuova tabella con Stretch Database abilitato o disabilitato. Per ulteriori informazioni, vedere Stretch Database.

Importante

Stretch Database è deprecato in SQL Server 2022 (16.x) e database SQL di Azure. Questa funzionalità verrà rimossa nelle versioni future del motore di database. Evitare di usare questa funzionalità in un nuovo progetto di sviluppo e prevedere interventi di modifica nelle applicazioni in cui è attualmente implementata.

Abilitazione di Stretch Database per una tabella

Quando si abilita Stretch per una tabella specificando ON, se necessario, è possibile specificare MIGRATION_STATE = OUTBOUND per iniziare subito la migrazione dei dati o MIGRATION_STATE = PAUSED per posticiparla. Il valore predefinito è MIGRATION_STATE = OUTBOUND. Per altre informazioni sull'abilitazione di Stretch per una tabella, vedere Abilitare Stretch Database per una tabella.

Prerequisiti. Prima di abilitare Stretch per una tabella, è necessario abilitare la funzionalità nel server e nel database. Per ulteriori informazioni, vedere Enable Stretch Database for a database.

Autorizzazione. L'abilitazione di Stretch per un database o una tabella richiede autorizzazioni db_owner. L'abilitazione di Stretch per una tabella richiede anche autorizzazioni ALTER per la tabella.

[ FILTER_PREDICATE = { NULL | predicate } ]

Si applica a: SQL Server 2016 (13.x) e versioni successive.

Specifica facoltativamente un predicato di filtro per selezionare le righe di cui eseguire la migrazione da una tabella che contiene sia dati cronologici sia dati correnti. Il predicato deve eseguire la chiamata a una funzione inline con valori di tabella. Per altre informazioni, vedere Abilitare Stretch Database per una tabella e Selezionare le righe di cui eseguire la migrazione tramite una funzione di filtro.

Importante

Se si specifica un predicato del filtro inefficace, anche la migrazione dei dati risulterà inefficace. Stretch Database applica il predicato del filtro alla tabella usando l'operatore CROSS APPLY.

Se non si specifica un predicato del filtro, viene eseguita la migrazione dell'intera tabella.

Quando si specifica un predicato di filtro, è necessario specificare anche MIGRATION_STATE.

MIGRATION_STATE = { OUTBOUND | INBOUND | PAUSED }

Si applica a: SQL Server 2016 (13.x) e versioni successive, database SQL di Azure e Istanza gestita di SQL di Azure.

[ DATA_DELETION = ON { ( FILTER_COLUMN = column_name, RETENTION_PERIOD = { INFINITE | number { DAY | DAYS | SETTIMANA | SETTIMANE | MONTH | MESI | YEAR | YEARS } ) } ]

Si applica a: solo SQL Edge di Azure

Abilita la pulizia basata sui criteri di conservazione dei dati non recenti o obsoleti dalle tabelle all'interno di un database. Per altre informazioni, vedere Abilitare e disabilitare la conservazione dei dati. Per abilitare la conservazione dei dati, è necessario specificare i parametri seguenti.

  • FILTER_COLUMN = { column_name }

    Specifica la colonna che deve essere utilizzata per determinare se le righe della tabella sono obsolete o meno. Per la colonna di filtro sono consentiti i tipi di dati seguenti.

    • date
    • datetime
    • datetime2
    • smalldatetime
    • datetimeoffset
  • RETENTION_PERIOD = { INFINITE | number {DAY | DAYS | WEEK | WEEKS | MONTH | MONTHS | YEAR | YEARS }}

    Specifica i criteri del periodo di conservazione per la tabella. Il periodo di conservazione viene specificato come combinazione tra un valore intero positivo e l'unità della parte della data.

MEMORY_OPTIMIZED

Si applica a: SQL Server 2014 (12.x) e versioni successive, database SQL di Azure e Istanza gestita di SQL di Azure. Istanza gestita di SQL di Azure non supporta tabelle ottimizzate per la memoria nel livello per utilizzo generico.

Il valore ON indica che la tabella è ottimizzata per la memoria. Le tabelle ottimizzate per la memoria fanno parte della funzionalità OLTP in memoria, che viene usata ottimizzare le prestazioni dell'elaborazione delle transazioni. Per iniziare a usare OLTP in memoria, vedere Avvio rapido 1: Tecnologie OLTP in memoria per prestazioni Transact-SQL più veloci. Per informazioni più approfondite sulle tabelle ottimizzate per la memoria, vedere Tabelle ottimizzate per la memoria.

Il valore predefinito OFF indica che la tabella è basata su disco.

DURABILITY

Si applica a: SQL Server 2014 (12.x) e versioni successive, database SQL di Azure e Istanza gestita di SQL di Azure.

Il valore di SCHEMA_AND_DATA indica che la tabella è durevole, ovvero le modifiche sono persistenti sul disco e restano valide anche dopo il riavvio o il failover. SCHEMA_AND_DATA è il valore predefinito.

Il valore di SCHEMA_ONLY indica che la tabella non è durevole. Lo schema della tabella è persistente, ma tutti gli aggiornamenti dei dati non vengono mantenuti in caso di riavvio o failover del database. L'opzione DURABILITY = SCHEMA_ONLY è consentita solo con MEMORY_OPTIMIZED = ON.

Avviso

Quando una tabella viene creata con DURABILITY = SCHEMA_ONLYe READ_COMMITTED_SNAPSHOT viene successivamente modificata tramite ALTER DATABASE, i dati nella tabella andranno persi.

BUCKET_COUNT

Si applica a: SQL Server 2014 (12.x) e versioni successive, database SQL di Azure e Istanza gestita di SQL di Azure.

Indica il numero di bucket che deve essere creato nell'indice hash. Il valore massimo per BUCKET_COUNT in indici hash è 1.073.741.824. Per altre informazioni sui numeri di bucket, vedere Indici in tabelle con ottimizzazione per la memoria.

Bucket_count è un argomento obbligatorio.

INDEX

Si applica a: SQL Server 2014 (12.x) e versioni successive, database SQL di Azure e Istanza gestita di SQL di Azure.

Gli indici di tabella e di colonna possono essere specificati come parte dell'istruzione CREATE TABLE. Per informazioni dettagliate sull'aggiunta e sulla rimozione degli indici nelle tabelle ottimizzate per la memoria, vedere Modifica di tabelle ottimizzate per la memoria

  • HASH

    Si applica a: SQL Server 2014 (12.x) e versioni successive, database SQL di Azure e Istanza gestita di SQL di Azure.

    Indica che viene creato un indice HASH.

    Gli indici hash sono supportati solo nelle tabelle ottimizzate per la memoria.

LEDGER = ON ( <ledger_option> [ ,... n ] ) | SPENTO

Si applica a: SQL Server 2022 (16.x), database SQL di Azure e Istanza gestita di SQL di Azure.

Nota

Se l'istruzione crea una tabella di contabilità generale, è necessaria l'autorizzazione ENABLE LEDGER.

Indica se la tabella creata è una tabella di contabilità generale (ON) o no (OFF). Il valore predefinito è OFF. Se si specifica l'opzione APPEND_ONLY = ON, il sistema crea una tabella di contabilità generale di solo accodamento che consente solo di inserire nuove righe. In caso contrario, il sistema crea una tabella di contabilità generale aggiornabile. Una tabella di contabilità generale aggiornabile richiede anche l'argomento SYSTEM_VERSIONING = ON. Una tabella di contabilità generale aggiornabile deve essere anche una tabella con controllo delle versioni di sistema. Tuttavia, una tabella libro mastro aggiornabile non deve essere una tabella temporale (non richiede il PERIOD FOR SYSTEM_TIME parametro ). Se la tabella di cronologia viene specificata con LEDGER = ON e SYSTEM_VERSIONING = ON, non deve fare riferimento a una tabella esistente.

Un database di contabilità generale (creato con l'opzione LEDGER = ON) consente solo la creazione di tabelle di contabilità generale. I tentativi di creare una tabella con LEDGER = OFF genereranno un errore. Ogni nuova tabella per impostazione predefinita viene creata come tabella mastro aggiornabile, anche se non si specifica LEDGER = ONe verrà creata con i valori predefiniti per tutti gli altri parametri.

Una tabella libro mastro aggiornabile deve contenere quattro GENERATED ALWAYS colonne, esattamente una colonna definita con ognuno degli argomenti seguenti:

  • GENERATED ALWAYS AS TRANSACTION_ID START
  • GENERATED ALWAYS AS TRANSACTION_ID END
  • GENERATED ALWAYS AS SEQUENCE_NUMBER START
  • GENERATED ALWAYS AS SEQUENCE_NUMBER END

Una tabella di contabilità generale di solo accodamento deve contenere un'unica colonna definita con ognuno degli argomenti seguenti:

  • GENERATED ALWAYS AS TRANSACTION_ID START
  • GENERATED ALWAYS AS SEQUENCE_NUMBER START

Se una delle colonne generate sempre richieste non è definita nell'istruzione e l'istruzione CREATE TABLE include LEDGER = ON, il sistema tenterà automaticamente di aggiungere la colonna usando una definizione di colonna applicabile dall'elenco seguente. Se si verifica un conflitto di nomi con una colonna già definita, il sistema genererà un errore.

[ledger_start_transaction_id] BIGINT GENERATED ALWAYS AS TRANSACTION_ID START HIDDEN NOT NULL
[ledger_end_transaction_id] BIGINT GENERATED ALWAYS AS TRANSACTION_ID END HIDDEN NULL
[ledger_start_sequence_number] BIGINT GENERATED ALWAYS AS SEQUENCE_NUMBER START HIDDEN NOT NULL
[ledger_end_sequence_number] BIGINT GENERATED ALWAYS AS SEQUENCE_NUMBER END HIDDEN NULL

Il <ledger_view_option> specifica lo schema e il nome della visualizzazione libro mastro che il sistema crea e collega automaticamente alla tabella. Se l'opzione non è specificata, il sistema genera il nome della visualizzazione libro mastro aggiungendo _Ledger al nome della tabella in fase di creazione (database_name.schema_name.table_name). Se esiste una vista con il nome specificato o generato, il sistema genererà un errore. Se la tabella è una tabella di contabilità generale aggiornabile, la vista di contabilità generale viene creata come unione nella tabella e nella relativa tabella di cronologia.

Ogni riga nella vista di contabilità generale rappresenta la creazione o l'eliminazione di una versione di riga nella tabella di contabilità generale. La vista di contabilità generale contiene tutte le colonne della tabella di contabilità generale, ad eccezione delle colonne GENERATED ALWAYS indicate in precedenza. La vista di contabilità generale contiene anche le colonne aggiuntive seguenti:

Nome colonna Tipo di dati Descrizione
Specificato con l'opzione TRANSACTION_ID_COLUMN_NAME. ledger_transaction_id se non specificato. bigint L'ID della transazione che ha creato o eliminato una versione di riga.
Specificato con l'opzione SEQUENCE_NUMBER_COLUMN_NAME. ledger_sequence_number se non specificato. bigint Il numero di sequenza di un'operazione a livello di riga all'interno della transazione nella tabella.
Specificato con l'opzione OPERATION_TYPE_COLUMN_NAME. ledger_operation_type se non specificato. tinyint Contiene 1 (INSERT) o 2 (DELETE). L'inserimento di una riga nella tabella di contabilità generale genera una nuova riga nella vista di contabilità generale contenente 1 in questa colonna. L'eliminazione di una riga dalla tabella di contabilità generale genera una nuova riga nella vista di contabilità generale contenente 2 in questa colonna. L'aggiornamento di una riga nella tabella di contabilità generale genera due righe nella vista di contabilità generale. Una riga contiene 2 (DELETE) e l'altra contiene 1 (INSERT) in questa colonna.
Specificato con l'opzione OPERATION_TYPE_DESC_COLUMN_NAME. ledger_operation_type_desc se non specificato. nvarchar(128) Contiene INSERT o DELETE. Vedere sopra per i dettagli.

Le transazioni che includono la creazione della tabella di contabilità generale vengono acquisite in sys.database_ledger_transactions.

<> ledger_option ::=

Specifica un'opzione libro mastro.

[ LEDGER_VIEW = schema_name. ledger_view_name [ ( <ledger_view_option> [ ,... n ] ) ] ]

Specifica il nome della visualizzazione libro mastro e i nomi delle colonne aggiuntive aggiunte dal sistema alla visualizzazione libro mastro.

[ APPEND_ONLY = ON | OFF ]

Specifica se la tabella libro mastro da creare è di sola accodamento o aggiornabile. Il valore predefinito è OFF.

<> ledger_view_option ::=

Specifica una o più opzioni di visualizzazione libro mastro. Ogni opzione della vista di contabilità generale specifica il nome di una colonna che il sistema aggiungerà alla vista, oltre alle colonne definite nella tabella di contabilità generale.

[ TRANSACTION_ID_COLUMN_NAME = transaction_id_column_name ]

Specifica il nome della colonna in cui è archiviato l'ID della transazione che ha creato o eliminato una versione di riga. Il nome di colonna predefinito è ledger_transaction_id.

[ SEQUENCE_NUMBER_COLUMN_NAME = sequence_number_column_name ]

Specifica il nome delle colonne in cui è archiviato il numero di sequenza di un'operazione a livello di riga all'interno della transazione nella tabella. Il nome di colonna predefinito è ledger_sequence_number.

[ OPERATION_TYPE_COLUMN_NAME = operation_type_id column_name ]

Specifica il nome delle colonne in cui è archiviato l'ID del tipo di operazione. Il nome di colonna predefinito è ledger_operation_type.

[ OPERATION_TYPE_DESC_COLUMN_NAME = operation_type_desc_column_name ]

Specifica il nome delle colonne in cui è archiviata la descrizione del tipo di operazione. Il nome di colonna predefinito è ledger_operation_type_desc.

Osservazioni:

Per altre informazioni sul numero di tabelle, colonne, vincoli e indici consentiti, vedere Specifiche di capacità massima per SQL Server.

Lo spazio in tabelle e indici viene generalmente allocato con incrementi di un extent. Quando l'opzione SET MIXED_PAGE_ALLOCATION di ALTER DATABASE è impostata su TRUE, o sempre nelle versioni di SQL Server precedenti a 2016 (13.x), se si crea una tabella o un indice, vengono allocate pagine da extent misti finché non sono sufficienti per riempire un extent uniforme. In seguito, viene allocato un altro extent ogni volta che gli extent allocati risultano pieni. Per visualizzare un report sulla quantità di spazio allocato e usato da una tabella, eseguire sp_spaceused.

Il motore di database non applica un ordine in cui i vincoli DEFAULT, IDENTITY, ROWGUIDCOL o colonna vengono specificati in una definizione di colonna.

Quando viene creata una tabella, l'opzione QUOTED IDENTIFIER viene sempre archiviata con l'impostazione ON nei metadati della tabella, anche se l'opzione viene impostata su OFF quando si crea la tabella.

Tabelle temporanee

È possibile creare tabelle temporanee locali e globali. Le tabelle temporanee locali sono visibili solo nella sessione corrente, mentre quelle globali sono visibili in tutte le sessioni. Le tabelle temporanee non possono essere partizionate.

Anteporre i nomi delle tabelle temporanee locali con il segno di numero singolo (#table_name) e anteporre i nomi delle tabelle temporanee globali con un segno di numero doppio (##table_name).

Le istruzioni Transact-SQL fanno riferimento alla tabella temporanea usando il valore specificato per table_name nell'istruzione CREATE TABLE, ad esempio:

CREATE TABLE #MyTempTable (
    col1 INT PRIMARY KEY
);

INSERT INTO #MyTempTable
VALUES (1);

Se si creano più tabelle temporanee all'interno di una sola stored procedure o di un singolo batch, è necessario che i nomi delle tabelle siano diversi.

Se si include schema_name quando si crea o accede a una tabella temporanea, viene ignorato. Tutte le tabelle temporanee vengono create nello schema dbo.

Se viene creata una tabella temporanea locale in una stored procedure o in un'applicazione che può essere eseguita contemporaneamente da più sessioni, il motore di database deve essere in grado di distinguere le tabelle create dalle varie sessioni. A tale scopo, il motore di database aggiunge internamente un suffisso numerico a ogni nome di tabella temporanea locale. Il nome completo di una tabella temporanea archiviata nella sys.sysobjects tabella in tempdb è costituito dal nome della tabella specificato nell'istruzione CREATE TABLE e dal suffisso numerico generato dal sistema. Per consentire il suffisso, table_name specificato per un nome temporaneo locale non può superare i 116 caratteri.

Le tabelle temporanee vengono eliminate automaticamente quando non sono più comprese nell'ambito, a meno di eliminarle in modo esplicito tramite l'istruzione DROP TABLE:

  • Una tabella temporanea locale creata in una stored procedure viene eliminata automaticamente al termine della stored procedure. È possibile fare riferimento alla tabella da qualsiasi stored procedure nidificata eseguita dalla stored procedure con cui è stata creata la tabella. Non è possibile fare riferimento alla tabella dal processo che ha chiamato la stored procedure che ha creato la tabella.
  • Tutte le altre tabelle temporanee locali vengono eliminate automaticamente alla fine della sessione corrente.
  • Le tabelle temporanee globali vengono eliminate automaticamente alla fine della sessione in cui è stata creata la tabella e quando tutte le altre attività non vi fanno più riferimento. L'associazione tra un'attività e una tabella viene mantenuta solo per la durata di una singola istruzione Transact-SQL. Una tabella temporanea globale viene pertanto eliminata dopo il completamento dell'ultima istruzione Transact-SQL che fa attivamente riferimento alla tabella alla fine della sessione di creazione.

Una tabella temporanea locale creata all'interno di una stored procedure o in un trigger può avere lo stesso nome di una tabella temporanea creata prima della chiamata alla stored procedure o al trigger. Tuttavia, se una query fa riferimento a una tabella temporanea e due tabelle temporanee con lo stesso nome esistono in quel momento, non viene definita la tabella in cui viene risolta la query. Anche le stored procedure nidificate possono creare tabelle temporanee con lo stesso nome di una tabella temporanea creata dalla stored procedure chiamante. In questo caso, tuttavia, per fare in modo che le modifiche vengano applicate alla tabella creata nella stored procedure nidificata, è necessario che la struttura della tabella e i nomi di colonna siano identici a quelli della tabella creata nella procedura chiamante, come illustrato nell'esempio seguente.

CREATE PROCEDURE dbo.Test2
AS
    CREATE TABLE #t (x INT PRIMARY KEY);
    INSERT INTO #t VALUES (2);
    SELECT Test2Col = x FROM #t;
GO

CREATE PROCEDURE dbo.Test1
AS
    CREATE TABLE #t (x INT PRIMARY KEY);
    INSERT INTO #t VALUES (1);
    SELECT Test1Col = x FROM #t;
    EXEC Test2;
GO

CREATE TABLE #t(x INT PRIMARY KEY);
INSERT INTO #t VALUES (99);
GO

EXEC Test1;
GO

Il set di risultati è il seguente.

(1 row(s) affected)
Test1Col
-----------
1

(1 row(s) affected)
 Test2Col
 -----------
 2

Quando si creano tabelle temporanee locali o globali, la sintassi dell'istruzione CREATE TABLE supporta le definizioni di vincolo, ad eccezione dei vincoli FOREIGN KEY. Se si specifica un vincolo FOREIGN KEY in una tabella temporanea, l'istruzione restituisce un messaggio di avviso per segnalare che il vincolo è stato ignorato. La tabella viene comunque creata senza i vincoli FOREIGN KEY. Non è possibile fare riferimento alle tabelle temporanee nei vincoli FOREIGN KEY.

Se una tabella temporanea viene creata con un vincolo denominato e all'interno dell'ambito di una transazione definita dall'utente, solo un utente alla volta può eseguire l'istruzione che crea la tabella temporanea. Ad esempio, se una stored procedure crea una tabella temporanea con un vincolo di chiave primaria denominata, la stored procedure non può essere eseguita contemporaneamente da più utenti.

Tabelle temporanee globali con ambito database (database SQL di Azure)

Le tabelle temporanee globali per SQL Server (avviate con il nome della tabella ##) vengono archiviate in tempdb e condivise tra tutte le sessioni degli utenti nell'intera istanza di SQL Server. Per informazioni sui tipi di tabella SQL, vedere la sezione precedente sulla creazione delle tabelle.

database SQL di Azure supporta tabelle temporanee globali archiviate anche a tempdb livello di database e con ambito. Le tabelle temporanee globali vengono quindi condivise per le sessioni di tutti gli utenti all'interno dello stesso database SQL di Azure. Le sessioni utente da altri database non possono accedere alle tabelle temporanee globali.

Le tabelle temporanee globali per il database SQL di Azure seguono la stessa sintassi e la stessa semantica usate da SQL Server per le tabelle temporanee. Analogamente, le stored procedure temporanee globali hanno un ambito limitato a livello di database nel database SQL di Azure. Anche le tabelle temporanee locali (avviate con # table_name) sono supportate per il database SQL di Azure e seguono la stessa sintassi e la stessa semantica usate da SQL Server. Vedere la sezione precedente relativa alle tabelle temporanee.

Importante

Questa funzionalità è disponibile per il database SQL di Azure.

Risolvere i problemi relativi alle tabelle temporanee globali per database SQL di Azure

Per la risoluzione dei problemi tempdb, vedere Come monitorare l'uso di tempdb.

Nota

Solo un amministratore del server può accedere alle DMV di risoluzione dei problemi nel database SQL di Azure.

Autorizzazioni

Qualsiasi utente può creare oggetti temporanei globali. Gli utenti possono accedere solo ai propri oggetti, a meno che non ottengano ulteriori autorizzazioni.

Tabelle partizionate

Prima di creare una tabella partizionata con CREATE TABLE, è necessario creare una funzione di partizione per specificare la modalità di partizionamento della tabella. Una funzione di partizione viene creata usando CREATE PARTITION FUNCTION. In secondo luogo, è necessario creare uno schema di partizione per specificare i filegroup di destinazione delle partizioni indicate dalla funzione di partizione. Uno schema di partizione viene creato usando CREATE PARTITION SCHEME. Non è possibile specificare il posizionamento dei vincoli PRIMARY KEY o UNIQUE per separare i filegroup per le tabelle partizionate. Per ulteriori informazioni, vedere Partitioned Tables and Indexes.

Vincoli PRIMARY KEY

  • In una tabella è possibile includere un solo vincolo PRIMARY KEY.

  • L'indice generato da un vincolo PRIMARY KEY non può causare che il numero di indici nella tabella superi i 999 indici non cluster e 1 indice cluster.

  • Se CLUSTERED o NONCLUSTERED non è specificato per un vincolo PRIMARY KEY, CLUSTERED viene usato se non sono specificati indici cluster per vincoli UNIQUE.

  • Tutte le colonne specificate in un vincolo PRIMARY KEY devono essere definite come NOT NULL. Se non viene specificato alcun valore Null, per tutte le colonne che fanno parte di un vincolo PRIMARY KEY il valore Null è impostato su NOT NULL.

    Nota

    Per le tabelle ottimizzate per la memoria, è consentita la colonna chiave che supporta valori Null.

  • Se si definisce una chiave primaria in una colonna di tipo CLR definito dall'utente, è necessario che l'implementazione del tipo supporti l'ordinamento binario. Per altre informazioni, vedere Tipi CLR definiti dall'utente.

Vincoli UNIQUE

  • Se CLUSTERED o NONCLUSTERED non è specificato per un vincolo UNIQUE, per impostazione predefinita viene usato NONCLUSTERED.
  • Ogni vincolo UNIQUE genera un indice. Il numero di vincoli UNIQUE non può causare che il numero di indici nella tabella superi i 999 indici non cluster e 1 indice cluster.
  • Se si definisce un vincolo UNIQUE in una colonna di tipo CLR definito dall'utente, è necessario che l'implementazione del tipo supporti l'ordinamento binario o basato su operatore. Per altre informazioni, vedere Tipi CLR definiti dall'utente.

vincoli FOREIGN KEY

  • I valori diversi da NULL immessi nella colonna di un vincolo FOREIGN KEY devono essere presenti nella colonna a cui viene fatto riferimento. In caso contrario, viene restituito un messaggio di errore di violazione della chiave esterna.

  • I vincoli FOREIGN KEY vengono applicati alla colonna precedente, a meno che non vengano specificate colonne di origine.

  • I vincoli FOREIGN KEY possono fare riferimento solo a tabelle di un singolo database nello stesso server. L'integrità referenziale tra database diversi deve essere implementata tramite trigger. Per altre informazioni, vedere CREATE TRIGGER.

  • I vincoli FOREIGN KEY possono fare riferimento a un'altra colonna nella stessa tabella. Questo tipo di vincolo viene definito autoreferenziale.

  • La clausola REFERENCES di un vincolo FOREIGN KEY a livello di colonna può includere una sola colonna di riferimento. Il tipo di dati di tale colonna deve essere uguale al tipo di dati della colonna in cui viene definito il vincolo.

  • La clausola REFERENCES di un vincolo FOREIGN KEY a livello di tabella deve includere lo stesso numero di colonne di riferimento di quelle presenti nell'elenco di colonne del vincolo. Il tipo di dati di ogni colonna di riferimento deve inoltre essere uguale a quello della colonna corrispondente nell'elenco di colonne. Le colonne di riferimento devono essere specificate nello stesso ordine usato quando si specificano le colonne del vincolo PRIMARY KEY o UNIQUE nella tabella a cui si fa riferimento.

  • Non è possibile specificare CASCADE, SET NULL o SET DEFAULT se una colonna di tipo timestamp fa parte della chiave esterna o della chiave a cui si fa riferimento.

  • È possibile combinare le azioni CASCADE, SET NULL, SET DEFAULT e NO ACTION in tabelle con relazioni referenziali reciproche. Se il motore di database rileva l'azione NO ACTION, l'operazione viene arrestata e viene eseguito il rollback delle azioni CASCADE, SET NULL e SET DEFAULT correlate. Quando un'istruzione DELETE genera una combinazione di azioni CASCADE, SET NULL, SET DEFAULT e NO ACTION, vengono applicate tutte le azioni CASCADE, SET NULL e SET DEFAULT prima che il motore di database verifichi l'esistenza di azioni NO ACTION.

  • Il motore di database non ha un limite predefinito per il numero di vincoli FOREIGN KEY che una tabella può contenere tale riferimento ad altre tabelle o il numero di vincoli FOREIGN KEY di proprietà di altre tabelle che fanno riferimento a una tabella specifica.

    Il numero effettivo di vincoli FOREIGN KEY che è possibile usare, tuttavia, è limitato dalla configurazione hardware e dalla progettazione del database e dell'applicazione. È consigliabile evitare che una tabella contenga più di 253 vincoli FOREIGN KEY e che più di 253 vincoli FOREIGN KEY facciano riferimento alla tabella stessa. Il limite effettivo potrebbe variare a seconda dell'applicazione e della configurazione hardware. Nella progettazione di database e applicazioni è opportuno valutare i costi correlati all'applicazione dei vincoli FOREIGN KEY.

  • I vincoli FOREIGN KEY non vengono applicati nelle tabelle temporanee.

  • I vincoli FOREIGN KEY possono fare riferimento solo alle colonne di vincoli PRIMARY KEY o UNIQUE della tabella a cui si fa riferimento o alle colonne in un indice univoco di tale tabella.

  • Se si definisce una chiave esterna su una colonna di tipo CLR definito dall'utente, è necessario che l'implementazione del tipo supporti l'ordinamento binario. Per altre informazioni, vedere Tipi CLR definiti dall'utente.

  • Le colonne incluse in una relazione di chiave esterna devono essere definite con la stessa lunghezza e la stessa scala.

definizioni DEFAULT

  • Una colonna può contenere una sola definizione DEFAULT.

  • Una definizione DEFAULT può includere valori costanti, funzioni, funzioni senza parametri standard SQL o valori NULL. Nella tabella seguente sono illustrati le funzioni senza parametri e i valori predefiniti corrispondenti restituiti durante un'istruzione INSERT.

    Funzione senza parametri SQL-92 Valore restituito
    CURRENT_TIMESTAMP Data e ora correnti.
    CURRENT_USER Nome dell'utente che esegue un inserimento.
    SESSION_USER Nome dell'utente che esegue un inserimento.
    SYSTEM_USER Nome dell'utente che esegue un inserimento.
    USER Nome dell'utente che esegue un inserimento.
  • constant_expression in una definizione DEFAULT non può fare riferimento a un'altra colonna della tabella o ad altre tabelle, viste o stored procedure.

  • Le definizioni DEFAULT non possono essere create in colonne con un tipo di dati timestamp o colonne con una proprietà IDENTITY.

  • Non è possibile creare definizioni PREDEFINITe per le colonne con tipi di dati alias se il tipo di dati alias è associato a un oggetto predefinito.

Vincoli CHECK

  • Una colonna può contenere un numero qualsiasi di vincoli CHECK e la condizione può includere più espressioni logiche unite tramite gli operatori AND e OR. Più vincoli CHECK per una colonna vengono convalidati nell'ordine di creazione.

  • La condizione di ricerca deve restituire un'espressione booleana e non può fare riferimento a un'altra tabella.

  • Un vincolo CHECK a livello di colonna può fare riferimento solo alla colonna vincolata, mentre un vincolo CHECK a livello di tabella può fare riferimento solo alle colonne della stessa tabella.

    Le regole e i vincoli CHECK svolgono la stessa funzione di convalida dei dati durante l'esecuzione delle istruzioni INSERT e UPDATE.

  • Quando per una o più colonne sono definiti una regola e uno o più vincoli CHECK, vengono valutate tutte le restrizioni.

  • I vincoli CHECK non possono essere definiti nelle colonne text, ntext o image .

Ulteriori informazioni sui vincoli

  • Non è possibile eliminare un indice creato per un vincolo tramite DROP INDEX. Il vincolo deve essere eliminato tramite ALTER TABLE. Un indice creato per e usato da un vincolo può essere ricompilato tramite ALTER INDEX ... REBUILD. Per altre informazioni, vedere Riorganizzare e ricompilare gli indici.
  • I nomi dei vincoli devono seguire le regole per gli identificatori, ad eccezione del fatto che il nome non può iniziare con un segno di numero (#). Se constraint_name non viene specificato, al vincolo viene assegnato un nome generato dal sistema. Il nome del vincolo viene indicato nei messaggi di errore relativi alle violazioni di vincolo.
  • Quando in un'istruzione INSERT, UPDATE o DELETE viene violato un vincolo, l'istruzione viene terminata. Con l'impostazione OFF per SET XACT_ABORT, tuttavia, la transazione continua a essere elaborata se l'istruzione fa parte di una transazione esplicita. Se l'impostazione di SET XACT_ABORT è ON, viene eseguito il rollback dell'intera transazione. È anche possibile usare l'istruzione ROLLBACK TRANSACTION con la definizione di transazione eseguendo un controllo con la funzione di sistema @@ERROR.
  • Quando ALLOW_ROW_LOCKS = ON e ALLOW_PAGE_LOCK = ON, i blocchi a livello di riga, pagina e tabella sono consentiti quando si accede all'indice. Il motore di database sceglie il blocco appropriato e può eseguire un'escalation del blocco da un blocco di riga o di pagina a un blocco di tabella. Se ALLOW_ROW_LOCKS = OFF e ALLOW_PAGE_LOCK = OFF, è consentito solo un blocco a livello di tabella quando si accede all'indice.
  • Se una tabella include vincoli FOREIGN KEY o CHECK e trigger, le condizioni di vincolo vengono valutate prima dell'esecuzione del trigger.

Per visualizzare un report per una tabella e le relative colonne, usare sp_help o sp_helpconstraint. Per rinominare una tabella, usare sp_rename. Per visualizzare un report per le viste e le stored procedure che dipendono da una tabella, usare sys.dm_sql_referenced_entities e sys.dm_sql_referencing_entities.

Regole per il supporto di valori Null all'interno di una definizione di tabella

L'impostazione del supporto dei valori Null per una colonna determina se la colonna ammette o meno valori Null (NULL) come dati. NULL non è zero o vuoto: NULL indica che non è stata effettuata alcuna voce o è stata fornita esplicitamente NULL e in genere implica che il valore è sconosciuto o non applicabile.

Se si usa l'istruzione CREATE TABLE o ALTER TABLE per creare o modificare una tabella, le impostazioni del database e della sessione influenzano e talvolta sostituiscono il supporto dei valori Null del tipo di dati usato in una definizione di colonna. È consigliabile definire sempre in modo esplicito una colonna come NULL o NOT NULL per le colonne non calcolate oppure, se si utilizza un tipo di dati definito dall'utente, consentire nella colonna l'utilizzo dell'impostazione predefinita relativa al supporto di valori Null per tale tipo di dati. Le colonne di tipo sparse devono consentire sempre valori Null.

Quando non viene specificato in modo esplicito il supporto dei valori Null per le colonne, il supporto dei valori Null della colonna segue le regole illustrate nella tabella seguente.

Tipo di dati colonna Regola
Tipo di dati alias Il motore di database usa l'impostazione del supporto dei valori Null specificata in fase di creazione del tipo di dati. Per determinare il valore Nullbility predefinito del tipo di dati, usare sp_help.
Tipo CLR definito dall'utente Il supporto dei valori Null viene stabilito in base alla definizione della colonna.
Tipo di dati fornito dal sistema Se il tipo di dati fornito dal sistema prevede una sola opzione, questa ha la precedenza. I tipi di dati timestamp devono essere NOT NULL. Quando le impostazioni di sessione vengono impostate su ON tramite SET:
ANSI_NULL_DFLT_ON = ON, viene assegnato NULL.
ANSI_NULL_DFLT_OFF = ON, NOT NULL è assegnato.

Quando le impostazioni del database vengono configurate tramite ALTER DATABASE:
ANSI_NULL_DEFAULT_ON = ON, viene assegnato NULL.
ANSI_NULL_DEFAULT_OFF = ON, NOT NULL è assegnato.

Per visualizzare l'impostazione del database per ANSI_NULL_DEFAULT, usare la vista del sys.databases catalogo

Quando per la sessione non è impostata alcuna opzione ANSI_NULL_DFLT e per il database è impostato il valore predefinito (ANSI_NULL_DEFAULT è OFF), viene assegnato il valore predefinito NOT NULL.

Nel caso di una colonna calcolata, l'impostazione del supporto dei valori Null viene sempre determinata automaticamente dal motore di database. Per individuare l'impostazione relativa al supporto dei valori Null per questo tipo di colonna, usare la funzione COLUMNPROPERTY con la proprietà AllowsNull.

Nota

Per entrambi i driver ODBC e OLE DB di SQL Server l'impostazione predefinita dell'opzione ANSI_NULL_DFLT_ON è ON. Gli utenti di ODBC e OLE DB possono configurare questa impostazione nelle origini dati ODBC oppure tramite le proprietà o gli attributi di connessione impostati dall'applicazione.

Compressione dei dati

Le tabelle di sistema non possono essere abilitate per la compressione. Se non specificato diversamente, quando si crea una tabella la compressione dei dati è impostata su NONE. Se si specifica un elenco di partizioni o una partizione non compresa nell'intervallo, verrà generato un errore. Per altre informazioni sulla compressione dei dati, vedere Compressione dei dati.

Per valutare il modo in cui la modifica dello stato di compressione influirà su una tabella, un indice o una partizione, usare la stored procedure sp_estimate_data_compression_savings .

Autorizzazioni

Sono necessarie l'autorizzazione CREATE TABLE per il database e l'autorizzazione ALTER per lo schema in cui viene creata la tabella.

Se una o più colonne nell'istruzione CREATE TABLE sono definite con un tipo definito dall'utente, è necessaria l'autorizzazione REFERENCES per il tipo definito dall'utente.

Se una o più colonne nell'istruzione CREATE TABLE sono definite con un tipo CLR definito dall'utente, è necessario che l'utente sia il proprietario del tipo o abbia l'autorizzazione REFERENCES.

Se una o più colonne nell'istruzione CREATE TABLE sono associate una raccolta di XML Schema, è necessario che l'utente sia il proprietario della raccolta di XML Schema o abbia l'autorizzazione REFERENCES.

Qualsiasi utente può creare tabelle temporanee in tempdb.

Se l'istruzione crea una tabella di contabilità generale, è necessaria l'autorizzazione ENABLE LEDGER.

Esempi

R. Creare un vincolo PRIMARY KEY in una colonna

Nell'esempio seguente viene illustrata la definizione di colonna per un vincolo PRIMARY KEY con un indice cluster nella colonna EmployeeID della tabella Employee. Poiché non viene specificato un nome di vincolo, il sistema fornisce il nome del vincolo.

CREATE TABLE dbo.Employee (
    EmployeeID INT PRIMARY KEY CLUSTERED
);

B. Usare i vincoli FOREIGN KEY

Il vincolo FOREIGN KEY viene utilizzato per fare riferimento a un'altra tabella. Le chiavi esterne possono essere chiavi a colonna singola o a più colonne. Nell'esempio seguente viene illustrato un vincolo FOREIGN KEY a colonna singola nella tabella SalesOrderHeader che fa riferimento alla tabella SalesPerson. Per un vincolo FOREIGN KEY a colonna singola è sufficiente specificare solo la clausola REFERENCES.

SalesPersonID INT NULL REFERENCES SalesPerson(SalesPersonID)

È inoltre possibile usare la clausola FOREIGN KEY in modo esplicito per ridefinire l'attributo di colonna. Il nome della colonna non deve essere lo stesso in entrambe le tabelle.

FOREIGN KEY (SalesPersonID) REFERENCES SalesPerson(SalesPersonID)

I vincoli con chiavi a più colonne vengono creati come vincoli di tabella. La tabella SpecialOfferProduct del database AdventureWorks2022 include un vincolo PRIMARY KEY a più colonne. Nell'esempio seguente viene illustrato come fare riferimento a questa chiave da un'altra tabella. Il nome di vincolo esplicito è facoltativo.

CONSTRAINT FK_SpecialOfferProduct_SalesOrderDetail
    FOREIGN KEY (ProductID, SpecialOfferID)
    REFERENCES SpecialOfferProduct (ProductID, SpecialOfferID)

C. Usare vincoli UNIQUE

I vincoli UNIQUE vengono utilizzati per imporre l'univocità di colonne chiave non primaria. Nell'esempio seguente viene applicata una restrizione per specificare che la colonna Name della tabella Product deve essere univoca.

Name NVARCHAR(100) NOT NULL
UNIQUE NONCLUSTERED

D. Usare le definizioni DEFAULT

I valori predefiniti forniscono un valore (tramite le istruzioni INSERT e UPDATE) nel caso in cui non ne viene specificato alcuno. Il database AdventureWorks2022 potrebbe, ad esempio, includere una tabella di ricerca con un elenco dei vari ruoli professionali che possono essere assegnati ai dipendenti della società. In una colonna che descrive ogni processo, un valore predefinito di una stringa di caratteri potrebbe fornire una descrizione quando una descrizione effettiva non viene immessa in modo esplicito.

DEFAULT 'New Position - title not formalized yet'

Oltre alle costanti, le definizioni DEFAULT possono includere funzioni. Per ottenere la data corrente per una voce, è possibile usare l'esempio seguente:

DEFAULT (GETDATE())

È inoltre possibile migliorare l'integrità dei dati tramite un'analisi di funzioni senza parametri. Per tenere traccia dell'utente che ha inserito una riga, usare la funzione senza parametri per USER. Non racchiudere le funzioni niladic con parentesi.

DEFAULT USER

E. Usare vincoli CHECK

Nell'esempio seguente viene illustrata l'applicazione di una restrizione ai valori immessi nella colonna CreditRating della tabella Vendor. Al vincolo non viene assegnato un nome.

CHECK (CreditRating >= 1 and CreditRating <= 5)

Nell'esempio seguente viene illustrato un vincolo denominato con una restrizione basata su modello per i dati di tipo carattere immessi in una colonna di una tabella.

CONSTRAINT CK_emp_id CHECK (
    emp_id LIKE '[A-Z][A-Z][A-Z][1-9][0-9][0-9][0-9][0-9][FM]'
    OR emp_id LIKE '[A-Z]-[A-Z][1-9][0-9][0-9][0-9][0-9][FM]'
)

Nell'esempio seguente viene specificato che i valori devono essere inclusi in un elenco specifico o essere conformi a un modello specificato.

CHECK (
    emp_id IN ('1389', '0736', '0877', '1622', '1756')
    OR emp_id LIKE '99[0-9][0-9]'
)

F. Visualizzare la definizione di tabella completa

Nell'esempio seguente vengono illustrate le definizioni di tabella complete con tutte le definizioni dei vincoli per la tabella PurchaseOrderDetail creata nel database AdventureWorks2022. Per eseguire l'esempio, lo schema della tabella viene modificato in dbo.

CREATE TABLE dbo.PurchaseOrderDetail
(
    PurchaseOrderID int NOT NULL
        REFERENCES Purchasing.PurchaseOrderHeader(PurchaseOrderID),
    LineNumber smallint NOT NULL,
    ProductID int NULL
        REFERENCES Production.Product(ProductID),
    UnitPrice money NULL,
    OrderQty smallint NULL,
    ReceivedQty float NULL,
    RejectedQty float NULL,
    DueDate datetime NULL,
    rowguid uniqueidentifier ROWGUIDCOL NOT NULL
        CONSTRAINT DF_PurchaseOrderDetail_rowguid DEFAULT (NEWID()),
    ModifiedDate datetime NOT NULL
        CONSTRAINT DF_PurchaseOrderDetail_ModifiedDate DEFAULT (GETDATE()),
    LineTotal AS ((UnitPrice*OrderQty)),
    StockedQty AS ((ReceivedQty-RejectedQty)),
    CONSTRAINT PK_PurchaseOrderDetail_PurchaseOrderID_LineNumber
               PRIMARY KEY CLUSTERED (PurchaseOrderID, LineNumber)
               WITH (IGNORE_DUP_KEY = OFF)
)
ON [PRIMARY];

G. Creare una tabella con una colonna xml tipizzata in una raccolta di XML Schema

Nell'esempio seguente viene creata una tabella con una colonna xml tipizzata nella raccolta di XML Schema HRResumeSchemaCollection. La parola chiave DOCUMENT specifica che ogni istanza del tipo di dati xml in column_name può contenere un solo elemento di livello superiore.

CREATE TABLE HumanResources.EmployeeResumes
(
    LName nvarchar(25),
    FName nvarchar(25),
    Resume xml(DOCUMENT HumanResources.HRResumeSchemaCollection)
);

H. Creare una tabella partizionata

Nell'esempio seguente viene creata una funzione di partizione per suddividere una tabella o indice in quattro partizioni. Viene quindi creato uno schema di partizione per specificare i filegroup in cui posizionare ognuna delle quattro partizioni. Infine viene creata una tabella che utilizza tale schema di partizione. Nell'esempio si presuppone che i filegroup esistano già nel database.

CREATE PARTITION FUNCTION myRangePF1 (int)
    AS RANGE LEFT FOR VALUES (1, 100, 1000);
GO

CREATE PARTITION SCHEME myRangePS1
    AS PARTITION myRangePF1
    TO (test1fg, test2fg, test3fg, test4fg);
GO

CREATE TABLE PartitionTable (col1 int, col2 char(10))
    ON myRangePS1 (col1);
GO

Sulla base dei valori della colonna col1 di PartitionTable, le partizioni vengono assegnate nei modi seguenti.

Filegroup test1fg test2fg test3fg test4fg
Partizione 1 2 3 4
Valori col 1 <= 1 col1 > 1 AND col1 <= 100 col1 > 100 AND col1 <= 1,000 col1 > 1000

I. Usare il tipo di dati UNIQUEIDENTIFIER in una colonna

Nell'esempio seguente viene creata una tabella con una colonna uniqueidentifier. Il vincolo PRIMARY KEY viene utilizzato per evitare che gli utenti inseriscano valori duplicati nella tabella, mentre la funzione NEWSEQUENTIALID() nel vincolo DEFAULT fornisce i valori per le nuove righe. La proprietà ROWGUIDCOL viene applicata alla colonna uniqueidentifier in modo che sia possibile farvi riferimento tramite la parola chiave $ROWGUID.

CREATE TABLE dbo.Globally_Unique_Data
(
    GUID UNIQUEIDENTIFIER
        CONSTRAINT Guid_Default DEFAULT
        NEWSEQUENTIALID() ROWGUIDCOL,
    Employee_Name VARCHAR(60)
    CONSTRAINT Guid_PK PRIMARY KEY (GUID)
);

J. Usare un'espressione per una colonna calcolata

Nell'esempio seguente viene illustrato l'utilizzo di un'espressione ((low + high)/2) per calcolare la colonna calcolata myavg.

CREATE TABLE dbo.mytable
(
    low INT,
    high INT,
    myavg AS (low + high)/2
);

K. Creare una colonna calcolata basata su una colonna di tipo definita dall'utente

Nell'esempio seguente viene creata una tabella con una colonna di tipo definito dall'utente utf8string presupponendo che l'assembly del tipo e il tipo stesso siano già stati creati nel database corrente. Una seconda colonna viene definita in utf8stringbase a e usa il metodo ToString() type (class) utf8string per calcolare un valore per la colonna.

CREATE TABLE UDTypeTable
(
    u UTF8STRING,
    ustr AS u.ToString() PERSISTED
);

.L Usare la funzione USER_NAME per una colonna calcolata

Nell'esempio seguente viene utilizzata la funzione USER_NAME() nella colonna myuser_name.

CREATE TABLE dbo.mylogintable
(
    date_in DATETIME,
    user_id INT,
    myuser_name AS USER_NAME()
);

M. Creare una tabella con una colonna FILESTREAM

Nell'esempio seguente viene creata una tabella con una colonna FILESTREAMPhoto. Se in una tabella sono presenti una o più colonne FILESTREAM, tale tabella deve includere anche una colonna ROWGUIDCOL.

CREATE TABLE dbo.EmployeePhoto
(
    EmployeeId INT NOT NULL PRIMARY KEY,
    Photo VARBINARY(MAX) FILESTREAM NULL,
    MyRowGuidColumn UNIQUEIDENTIFIER NOT NULL ROWGUIDCOL UNIQUE DEFAULT NEWID()
);

N. Creare una tabella che utilizza la compressione di riga

Nell'esempio seguente viene creata una tabella che utilizza la compressione di riga.

CREATE TABLE dbo.T1
(
    c1 INT,
    c2 NVARCHAR(200)
)
WITH (DATA_COMPRESSION = ROW);

Per altri esempi sulla compressione dei dati, vedere Compressione dei dati.

.O Creare una tabella che usa la compressione XML

Si applica a: SQL Server 2022 (16.x) e versioni successive Database SQL di Azure e Istanza gestita di SQL di Azure

Nell'esempio seguente viene creata una tabella che usa la compressione XML.

CREATE TABLE dbo.T1
(
    c1 INT,
    c2 XML
)
WITH (XML_COMPRESSION = ON);

P. Creare una tabella con colonne di tipo sparse e un set di colonne

Negli esempi seguenti viene illustrato come creare una tabella con una colonna di tipo sparse e una tabella con due colonne di tipo sparse e un set di colonne. Negli esempi viene utilizzata la sintassi di base. Per esempi più complessi, vedere Usare le colonne di tipo sparse e Usare set di colonne.

Nell'esempio viene creata una tabella con una colonna di tipo sparse.

CREATE TABLE dbo.T1
(
    c1 INT PRIMARY KEY,
    c2 VARCHAR(50) SPARSE NULL
);

In questo esempio viene creata una tabella con due colonne di tipo sparse e un set di colonne denominato CSet.

CREATE TABLE T1
(
    c1 INT PRIMARY KEY,
    c2 VARCHAR(50) SPARSE NULL,
    c3 INT SPARSE NULL,
    CSet XML COLUMN_SET FOR ALL_SPARSE_COLUMNS
);

D. Creare una tabella temporale basata su disco con controllo delle versioni di sistema

Si applica a: SQL Server 2016 (13.x) e versioni successive e database SQL di Azure.

Gli esempi seguenti spiegano come creare una tabella temporale collegata a una nuova tabella di cronologia e come creare una tabella temporale collegata a una tabella di cronologia esistente. Per abilitare la tabella temporale per abilitare la tabella per il controllo delle versioni di sistema, è necessario che sia definita una chiave primaria. Per esempi che illustrano come aggiungere o rimuovere il controllo delle versioni di sistema per una tabella esistente, vedere Controllo delle versioni di sistema in Esempi. Per i casi d'uso, vedere Tabelle temporali.

In questo esempio viene creata una nuova tabella temporale collegata a una nuova tabella di cronologia.

CREATE TABLE Department
(
    DepartmentNumber CHAR(10) NOT NULL PRIMARY KEY CLUSTERED,
    DepartmentName VARCHAR(50) NOT NULL,
    ManagerID INT NULL,
    ParentDepartmentNumber CHAR(10) NULL,
    ValidFrom DATETIME2 GENERATED ALWAYS AS ROW START HIDDEN NOT NULL,
    ValidTo DATETIME2 GENERATED ALWAYS AS ROW END HIDDEN NOT NULL,
    PERIOD FOR SYSTEM_TIME (ValidFrom, ValidTo)
)
WITH (SYSTEM_VERSIONING = ON);

In questo esempio viene creata una nuova tabella temporale collegata a una tabella di cronologia già esistente.

-- Existing table
CREATE TABLE Department_History
(
    DepartmentNumber CHAR(10) NOT NULL,
    DepartmentName VARCHAR(50) NOT NULL,
    ManagerID INT NULL,
    ParentDepartmentNumber CHAR(10) NULL,
    ValidFrom DATETIME2 NOT NULL,
    ValidTo DATETIME2 NOT NULL
);

-- Temporal table
CREATE TABLE Department
(
    DepartmentNumber CHAR(10) NOT NULL PRIMARY KEY CLUSTERED,
    DepartmentName VARCHAR(50) NOT NULL,
    ManagerID INT NULL,
    ParentDepartmentNumber CHAR(10) NULL,
    ValidFrom DATETIME2 GENERATED ALWAYS AS ROW START HIDDEN NOT NULL,
    ValidTo DATETIME2 GENERATED ALWAYS AS ROW END HIDDEN NOT NULL,
    PERIOD FOR SYSTEM_TIME (ValidFrom, ValidTo)
)
WITH (SYSTEM_VERSIONING = ON (HISTORY_TABLE = dbo.Department_History, DATA_CONSISTENCY_CHECK = ON));

.R Creare una tabella temporale ottimizzata per la memoria con controllo delle versioni di sistema

Si applica a: SQL Server 2016 (13.x) e versioni successive e database SQL di Azure.

L'esempio seguente illustra come creare una tabella temporale ottimizzata per la memoria con controllo delle versioni di sistema collegata a una nuova tabella di cronologia basata su disco.

In questo esempio viene creata una nuova tabella temporale collegata a una nuova tabella di cronologia.

CREATE SCHEMA History;
GO

CREATE TABLE dbo.Department
(
    DepartmentNumber CHAR(10) NOT NULL PRIMARY KEY NONCLUSTERED,
    DepartmentName VARCHAR(50) NOT NULL,
    ManagerID INT NULL,
    ParentDepartmentNumber CHAR(10) NULL,
    ValidFrom DATETIME2 GENERATED ALWAYS AS ROW START HIDDEN NOT NULL,
    ValidTo DATETIME2 GENERATED ALWAYS AS ROW END HIDDEN NOT NULL,
    PERIOD FOR SYSTEM_TIME (ValidFrom, ValidTo)
)
WITH
(
    MEMORY_OPTIMIZED = ON,
    DURABILITY = SCHEMA_AND_DATA,
    SYSTEM_VERSIONING = ON (HISTORY_TABLE = History.DepartmentHistory)
);

In questo esempio viene creata una nuova tabella temporale collegata a una tabella di cronologia già esistente.

-- Existing table
CREATE TABLE Department_History
(
    DepartmentNumber CHAR(10) NOT NULL,
    DepartmentName VARCHAR(50) NOT NULL,
    ManagerID INT NULL,
    ParentDepartmentNumber CHAR(10) NULL,
    ValidFrom DATETIME2 NOT NULL,
    ValidTo DATETIME2 NOT NULL
);

-- Temporal table
CREATE TABLE Department
(
    DepartmentNumber CHAR(10) NOT NULL PRIMARY KEY CLUSTERED,
    DepartmentName VARCHAR(50) NOT NULL,
    ManagerID INT NULL,
    ParentDepartmentNumber CHAR(10) NULL,
    ValidFrom DATETIME2 GENERATED ALWAYS AS ROW START HIDDEN NOT NULL,
    ValidTo DATETIME2 GENERATED ALWAYS AS ROW END HIDDEN NOT NULL,
    PERIOD FOR SYSTEM_TIME (ValidFrom, ValidTo)
)
WITH
(
    SYSTEM_VERSIONING = ON (HISTORY_TABLE = dbo.Department_History, DATA_CONSISTENCY_CHECK = ON)
);

S. Creare una tabella con colonne crittografate

L'esempio seguente crea una tabella con due colonne crittografate. Per altre informazioni, vedere Always Encrypted.

CREATE TABLE Customers (
    CustName NVARCHAR(60)
        ENCRYPTED WITH (
            COLUMN_ENCRYPTION_KEY = MyCEK,
            ENCRYPTION_TYPE = RANDOMIZED,
            ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256'
        ),
    SSN VARCHAR(11) COLLATE Latin1_General_BIN2
        ENCRYPTED WITH (
            COLUMN_ENCRYPTION_KEY = MyCEK,
            ENCRYPTION_TYPE = DETERMINISTIC ,
            ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256'
        ),
    Age INT NULL
);

T. Creare un indice filtrato inline

Crea una tabella con un indice filtrato inline.

CREATE TABLE t1
(
    c1 INT,
    index IX1 (c1) WHERE c1 > 0
);

U. Creare un indice inline

Di seguito viene illustrato come usare NONCLUSTERED inline per tabelle basate su disco:

CREATE TABLE t1
(
    c1 INT,
    INDEX ix_1 NONCLUSTERED (c1)
);

CREATE TABLE t2
(
    c1 INT,
    c2 INT INDEX ix_1 NONCLUSTERED
);

CREATE TABLE t3
(
    c1 INT,
    c2 INT,
    INDEX ix_1 NONCLUSTERED (c1,c2)
);

V. Creare una tabella temporanea con una chiave primaria composta denominata in modo anonimo

Crea una tabella con una chiave primaria composta denominata in modo anonimo. Ciò è utile per evitare conflitti di runtime quando due tabelle temporanee con ambito sessione, ognuna in una sessione separata, usano lo stesso nome per un vincolo.

CREATE TABLE #tmp
(
    c1 INT,
    c2 INT,
    PRIMARY KEY CLUSTERED ([c1], [c2])
);
GO

Se si assegna in modo esplicito il vincolo, la seconda sessione genererà un errore, ad esempio:

Msg 2714, Level 16, State 5, Line 1
There is already an object named 'PK_#tmp' in the database.
Msg 1750, Level 16, State 1, Line 1
Could not create constraint or index. See previous errors.

Il problema deriva dal fatto che, mentre il nome della tabella temporanea è univoco, i nomi dei vincoli non sono.

W. Usare tabelle temporanee globali in database SQL di Azure

Session A crea una tabella temporanea globale ##test in database SQL di Azure testdb1 e aggiunge una riga

CREATE TABLE ##test (
    a INT,
    b INT
);

INSERT INTO ##test
VALUES (1, 1);

-- Obtain object ID for temp table ##test
SELECT OBJECT_ID('tempdb.dbo.##test') AS 'Object ID';

Il set di risultati è il seguente.

1253579504

Ottenere il nome della tabella temporanea globale per un ID oggetto specificato 1253579504 in tempdb (2)

SELECT name FROM tempdb.sys.objects WHERE object_id = 1253579504;

Il set di risultati è il seguente.

##test

La sessione B si connette al database SQL di Azure testdb1 e può accedere alla tabella ##test creata dalla sessione A

SELECT * FROM ##test;

Il set di risultati è il seguente.

1, 1

Sessione C si connette a un altro database nel database SQL di Azure testdb2 e richiede l'accesso alla tabella ##test creata in testdb1. Questa selezione non riesce a causa dell'ambito del database per le tabelle temporanee globali

SELECT * FROM ##test

Viene generato l'errore seguente:

Msg 208, Level 16, State 0, Line 1
Invalid object name '##test'

Indirizzamento dell'oggetto di sistema in database SQL di Azure tempdb dal database utente corrente testdb1

SELECT * FROM tempdb.sys.objects;
SELECT * FROM tempdb.sys.columns;
SELECT * FROM tempdb.sys.database_files;

X. Abilitare i criteri di conservazione dei dati in una tabella

Nell'esempio seguente viene creata una tabella con conservazione dei dati abilitata e un periodo di conservazione di una settimana. Questo esempio si applica solo a SQL Edge di Azure.

CREATE TABLE [dbo].[data_retention_table]
(
  [dbdatetime2] datetime2(7),
  [product_code] int,
  [value] char(10)
)
WITH (DATA_DELETION = ON ( FILTER_COLUMN = [dbdatetime2], RETENTION_PERIOD = 1 WEEKS ))

Y. Creare una tabella del libro mastro aggiornabile

Nell'esempio seguente viene creata una tabella mastro aggiornabile che non è una tabella temporale con una tabella di cronologia anonima (il sistema genererà il nome della tabella di cronologia) e il nome della vista mastro generato. Poiché i nomi delle colonne generate sempre necessarie e le colonne aggiuntive nella visualizzazione libro mastro non vengono specificati, le colonne avranno i nomi predefiniti.

CREATE SCHEMA [HR];
GO
CREATE TABLE [HR].[Employees]
(
    EmployeeID INT NOT NULL,
    Salary Money NOT NULL
)
WITH (SYSTEM_VERSIONING = ON, LEDGER = ON);
GO

Nell'esempio seguente viene creata una tabella che è sia una tabella temporale che una tabella di contabilità generale aggiornabile, con una tabella di cronologia anonima (il cui nome viene generato dal sistema), il nome generato della vista di contabilità generale, nonché i nomi predefiniti delle colonne GENERATED ALWAYS e delle colonne aggiuntive della vista di contabilità generale.

CREATE SCHEMA [HR];
GO
CREATE TABLE [HR].[Employees]
(
    EmployeeID INT NOT NULL PRIMARY KEY,
    Salary Money NOT NULL,
    ValidFrom DATETIME2 GENERATED ALWAYS AS ROW START HIDDEN NOT NULL,
    ValidTo DATETIME2 GENERATED ALWAYS AS ROW END HIDDEN NOT NULL,
    PERIOD FOR SYSTEM_TIME (ValidFrom, ValidTo)
)
WITH (SYSTEM_VERSIONING = ON, LEDGER = ON);
GO

Nell'esempio seguente viene creata una tabella che è sia una tabella temporale che una tabella di contabilità generale aggiornabile, con la tabella di cronologia il cui nome è stato specificato esplicitamente, il nome specificato dall'utente della vista di contabilità generale e i nomi specificati dall'utente delle colonne GENERATED ALWAYS e delle colonne aggiuntive della vista di contabilità generale.

CREATE SCHEMA [HR];
GO
CREATE TABLE [HR].[Employees]
(
    EmployeeID INT NOT NULL PRIMARY KEY,
    Salary Money NOT NULL,
    StartTransactionId BIGINT GENERATED ALWAYS AS TRANSACTION_ID START HIDDEN NOT NULL,
    EndTransactionId BIGINT GENERATED ALWAYS AS TRANSACTION_ID END HIDDEN NULL,
    StartSequenceNumber BIGINT GENERATED ALWAYS AS SEQUENCE_NUMBER START HIDDEN NOT NULL,
    EndSequenceNumber BIGINT GENERATED ALWAYS AS SEQUENCE_NUMBER END HIDDEN NULL,
    ValidFrom DATETIME2 GENERATED ALWAYS AS ROW START HIDDEN NOT NULL,
    ValidTo DATETIME2 GENERATED ALWAYS AS ROW END HIDDEN NOT NULL,
    PERIOD FOR SYSTEM_TIME (ValidFrom, ValidTo)
)
WITH (
    SYSTEM_VERSIONING = ON (HISTORY_TABLE = [HR].[EmployeesHistory]),
    LEDGER = ON (
        LEDGER_VIEW = [HR].[EmployeesLedger] (
            TRANSACTION_ID_COLUMN_NAME = TransactionId,
            SEQUENCE_NUMBER_COLUMN_NAME = SequenceNumber,
            OPERATION_TYPE_COLUMN_NAME = OperationId,
            OPERATION_TYPE_DESC_COLUMN_NAME = OperationTypeDescription
        )
    )
);
GO

Nell'esempio seguente viene creata una tabella di contabilità generale di solo accodamento con i nomi generati della vista di contabilità generale e delle relative colonne.

CREATE SCHEMA [AccessControl];
GO
CREATE TABLE [AccessControl].[KeyCardEvents]
(
    EmployeeID INT NOT NULL,
    AccessOperationDescription NVARCHAR (MAX) NOT NULL,
    [Timestamp] Datetime2 NOT NULL,
    StartTransactionId BIGINT GENERATED ALWAYS AS TRANSACTION_ID START HIDDEN NOT NULL,
    StartSequenceNumber BIGINT GENERATED ALWAYS AS SEQUENCE_NUMBER START HIDDEN NOT NULL
)
WITH (
    LEDGER = ON (
        LEDGER_VIEW = [AccessControl].[KeyCardEventsLedger] (
            TRANSACTION_ID_COLUMN_NAME = TransactionId,
            SEQUENCE_NUMBER_COLUMN_NAME = SequenceNumber,
            OPERATION_TYPE_COLUMN_NAME = OperationId,
            OPERATION_TYPE_DESC_COLUMN_NAME = OperationTypeDescription
        ),
        APPEND_ONLY = ON
    )
);
GO

Nell'esempio seguente vengono creati un database di contabilità generale in Database SQL di Azure e una tabella di contabilità generale aggiornabile con le impostazioni predefinite. La creazione di una tabella libro mastro aggiornabile in un database libro mastro non richiede l'uso di WITH (SYSTEM_VERSIONING = ON, LEDGER = ON);.

CREATE DATABASE MyLedgerDB ( EDITION = 'GeneralPurpose' ) WITH LEDGER = ON;
GO

CREATE SCHEMA [HR];
GO

CREATE TABLE [HR].[Employees]
(
    EmployeeID INT NOT NULL,
    Salary Money NOT NULL
)
GO