part 1:
CREATE TABLE
Crea una nuova tabella.

Sintassi
CREATE TABLE
[ database_name.[ owner ] . | owner. ] table_name
( { < column_definition >
| column_name AS computed_column_expression
| < table_constraint > ::= [ CONSTRAINT constraint_name ] }

| [ { PRIMARY KEY | UNIQUE } [ ,...n ]
)

[ ON { filegroup | DEFAULT } ]
[ TEXTIMAGE_ON { filegroup | DEFAULT } ]

< column_definition > ::= { column_name data_type }
[ COLLATE < collation_name > ]
[ [ DEFAULT constant_expression ]
| [ IDENTITY [ ( seed , increment ) [ NOT FOR REPLICATION ] ] ]
]
[ ROWGUIDCOL ]
[ < column_constraint > ] [ ...n ]

< column_constraint > ::= [ CONSTRAINT constraint_name ]
{ [ NULL | NOT NULL ]
| [ { PRIMARY KEY | UNIQUE }
[ CLUSTERED | NONCLUSTERED ]
[ WITH FILLFACTOR = fillfactor ]
[ON {filegroup | DEFAULT} ] ]
]
| [ [ FOREIGN KEY ]
REFERENCES ref_table [ ( ref_column ) ]
[ ON DELETE { CASCADE | NO ACTION } ]
[ ON UPDATE { CASCADE | NO ACTION } ]
[ NOT FOR REPLICATION ]
]
| CHECK [ NOT FOR REPLICATION ]
( logical_expression )
}

< table_constraint > ::= [ CONSTRAINT constraint_name ]
{ [ { PRIMARY KEY | UNIQUE }
[ CLUSTERED | NONCLUSTERED ]
{ ( column [ ASC | DESC ] [ ,...n ] ) }
[ WITH FILLFACTOR = fillfactor ]
[ ON { filegroup | DEFAULT } ]
]
| FOREIGN KEY
[ ( column [ ,...n ] ) ]
REFERENCES ref_table [ ( ref_column [ ,...n ] ) ]
[ ON DELETE { CASCADE | NO ACTION } ]
[ ON UPDATE { CASCADE | NO ACTION } ]
[ NOT FOR REPLICATION ]
| CHECK [ NOT FOR REPLICATION ]
( search_conditions )
}

Argomenti
database_name

Nome del database in cui viene creata la tabella. database_name deve specificare il nome di un database esistente. Se viene omesso, viene impostato automaticamente il database corrente. L'account di accesso per la connessione corrente deve essere associato a un ID utente del database specificato in database_name. Per tale ID utente devono essere inoltre disponibili le autorizzazioni per la creazione di tabelle.

owner

Nome dell'ID utente del proprietario della nuova tabella. L'argomento owner deve essere un ID utente del database specificato in database_name. Il valore predefinito è l'ID utente dell'account di accesso per la connessione corrente disponibile nel database specificato in database_name. Se l'istruzione CREATE TABLE viene eseguita da un membro del ruolo predefinito del server sysadmin o dei ruoli predefiniti del database db_dbowner o db_ddladmin nel database specificato in database_name, per owner è possibile specificare un ID utente diverso da quello dell'account di accesso per la connessione in uso. Se l'istruzione CREATE TABLE viene eseguita da un account di accesso con un ID utente che dispone solo di autorizzazioni per la creazione di tabelle, owner deve specificare l'ID utente associato all'account di accesso corrente. I membri del ruolo predefinito del server sysadmin e gli account di accesso a cui è assegnato come alias l'utente dbo sono associati all'ID utente dbo. Il proprietario delle tabelle create da tali utenti è pertanto dbo. Per le tabelle create da un account di accesso non appartenente ai ruoli sopraindicati, il valore predefinito di owner è l'ID utente associato all'account di accesso.

table_name

Nome della nuova tabella. I nomi delle tabelle devono essere conformi alle regole per gli identificatori. La combinazione owner.table_name deve essere univoca all'interno del database. L'argomento table_name può includere al massimo 128 caratteri, ad eccezione dei nomi di tabelle temporanee locali, ovvero i nomi preceduti da un simbolo di cancelletto (#), i quali devono includere al massimo 116 caratteri.

column_name

Nome di una colonna della tabella. I nomi di colonna devono essere conformi alle regole per gli identificatori e devono essere univoci all'interno della tabella. Per colonne di tipo timestamp è possibile omettere l'argomento column_name. In tal caso il nome predefinito di queste colonne è timestamp.

computed_column_expression

Espressione che determina il valore di una colonna calcolata. Una colonna calcolata è una colonna virtuale non archiviata fisicamente nella tabella. Viene calcolata in base a un'espressione che utilizza altre colonne della stessa tabella. Una colonna calcolata può essere definita, ad esempio, nel modo seguente: 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 subquery.

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

Una colonna calcolata non può essere utilizzata come definizione di vincolo DEFAULT o FOREIGN KEY o con la definizione di vincolo NOT NULL. È tuttavia possibile utilizzare una colonna calcolata come colonna chiave di un indice o come parte di un vincolo PRIMARY KEY o UNIQUE, a condizione che il valore della colonna sia definito da un'espressione deterministica e il tipo di dati del risultato sia supportato nelle colonne dell'indice.
Se la tabella contiene, ad esempio, le colonne di tipo integer a e b, è possibile indicizzare la colonna calcolata a+b, ma non la colonna calcolata a+DATEPART(dd, GETDATE()), in quanto durante chiamate successive il valore può cambiare.

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


Nota Ogni riga di una tabella può includere valori diversi per le colonne di una colonna calcolata. Le varie righe della colonna calcolata pertanto non includono necessariamente lo stesso valore.

Il supporto di valori Null delle colonne calcolate viene determinato automaticamente in base alle espressioni utilizzate. Si presuppone che per il risultato della maggior parte delle espressioni i valori Null siano supportati anche se sono disponibili solo colonne che non supportano valori Null. Possibili underflow o overflow, infatti, generano risultati NULL. Per stabilire se una colonna calcolata supporta o meno i valori Null, utilizzare la funzione COLUMNPROPERTY (proprietà AllowsNull). Un'espressione expr che supporta valori Null può essere convertita in un'espressione che non supporta valori Null specificando ISNULL(check_expression, costante) dove "costante" è un valore non Null che sostituisce qualsiasi risultato Null.

ON {filegroup | DEFAULT}

Specifica il filegroup in cui è archiviata la tabella. Se si specifica questo argomento, la tabella viene archiviata nel filegroup specificato. Il filegroup deve essere disponibile nel database. Se si specifica DEFAULT oppure ON viene omesso, la tabella viene archiviata nel filegroup predefinito.

È inoltre possibile specificare ON {filegroup | DEFAULT} in vincoli PRIMARY KEY e UNIQUE, con i quali vengono creati indici. Se si specifica l'argomento filegroup, l'indice viene archiviato nel filegroup specificato. Se si specifica DEFAULT, l'indice viene archiviato nel filegroup predefinito. Se per un vincolo non viene specificato alcun filegroup, 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.



Nota Nel contesto di ON {filegroup | DEFAULT} e TEXTIMAGE_ON {filegroup | DEFAULT} DEFAULT non è una parola chiave, ma un identificatore delimitato del filegroup predefinito, ad esempio ON "DEFAULT" o ON [DEFAULT] e TEXTIMAGE_ON "DEFAULT" o TEXTIMAGE_ON [DEFAULT].


TEXTIMAGE_ON

Parola chiave che indica che le colonne di tipo text, ntext e image vengono archiviate nel filegroup specificato. La parola chiave TEXTIMAGE_ON non è consentita se la tabella non include colonne di tipo text, ntext o image. Se la parola chiave viene omessa, le colonne di tipo text, ntext e image vengono archiviate nello stesso filegroup della tabella.

data_type

Specifica il tipo di dati della colonna. Sono validi i tipi di dati del sistema o definiti dall'utente. I tipi di dati definiti dall'utente da utilizzare in una definizione di tabella devono essere creati tramite sp_addtype.

L'assegnazione dell'attributo NULL/NOT NULL a un tipo di dati definito dall'utente può essere ignorata durante l'istruzione CREATE TABLE. L'impostazione della lunghezza tuttavia non è modificabile. In un'istruzione CREATE TABLE non è possibile specificare una lunghezza per un tipo di dati definito dall'utente.

DEFAULT

Specifica il valore assegnato alla colonna quando non viene specificato un valore in modo esplicito durante un'azione di inserimento. È possibile applicare le definizioni DEFAULT a qualsiasi colonna, ad eccezione di quelle definite come timestamp o con la proprietà IDENTITY. Le definizioni DEFAULT vengono rimosse quando la tabella viene eliminata. È possibile utilizzare come valore predefinito un valore costante, ad esempio una stringa di caratteri, una funzione di sistema, ad esempio SYSTEM_USER(), o un valore NULL. Per mantenere la compatibilità con le versioni precedenti di SQL Server, è possibile assegnare un nome di vincolo a una definizione DEFAULT.

constant_expression

Costante, valore Null o funzione di sistema utilizzata come valore predefinito della colonna.