Creare una tabella con SQL Server
Published: 2023-10-03 14:23:38

---
title: Creare una tabella con SQL Server
published: true
date: 2023-05-11 00:00:00 UTC
tags: 
canonical_url: 
---

# Cosa vedrai

- [Definizione di tabella](#definizione-di-tabella)
- [Come funziona](#come-funziona)
- [Tip](#tip)
- [Risorse utili](#risorse-utili)

# Definizione di tabella

Le **tabelle** sono oggetti presenti all’interno di un database che contengono tutti i dati. Nelle tabelle, i dati sono organizzati in modo strutturato tramite righe e colonne in un formato simile a quello di un foglio di calcolo, dove ogni riga rappresenta un _record_ e ogni colonna un _campo_.

# Come funziona

Per creare una nuova tabella tramite SQL Server Managament Studio, è sufficiente cliccare con il destro sulla voce _“Tabelle”_ presente all’interno del database di nostro interesse e scegliere _“Nuovo”_:

![](https://theredcode.it/img/mssql-table-menu.png) _Opzione per creare una tabella tramite SQL Server Management Studio_

Si aprirà una finestra che ci permetterà di scegliere quali sono le colonne da aggiungere alla nostra tabella, e soprattutto le **tipologie di dato**.

Nel primo campo, inseriamo il nome della colonna. Nel secondo campo, il tipo di dato che vogliamo rappresentare e l’eventuale dimensione.

Infine, possiamo decidere di permettere o meno la creazione di record in cui la colonna presenta dei valori nulli.

Un esempio di utilizzo dei diversi tipi di dato è riportato di seguito:

![](https://theredcode.it/img/mssql-table-example.png) _Esempio di tabella tramite SQL Server Management Studio_

Dopo aver definito le informazioni riguardanti le colonne, clicchiamo sul tasto per salvare (o usiamo “Ctrl+S”) e scegliamo il nome che la tabella assumerà. La tabella non sarà visibile subito nell’elenco a sinistra degli oggetti: sarà necessario cliccare con il destro sul database e selezionare _“Aggiorna”_:

![](https://theredcode.it/img/mssql-table-new.png) _Nuova tabella_

# Tipi di dato

Ne esistono moltissime varianti, di cui viene riportato un elenco dettagliato qui sotto:

## Dati testuali

| Tipo di dato | Descrizione | Dimensione massima |
| --- | --- | --- |
| char(n) | Lunghezza fissa di una stringa | 8,000 caratteri |
| varchar(n) | Lunghezza variabile di una stringa | 8,000 caratteri |
| varchar(max) | Lunghezza variabile di una stringa | 1,073,741,824 caratteri |
| text | Lunghezza variabile di una stringa fino a 2GB | 2GB |
| nchar | Lunghezza fissa di una stringa Unicode | 4,000 caratteri |
| nvarchar | Lunghezza variabile di una stringa Unicode | 4,000 caratteri |
| nvarchar(max) | Lunghezza variabile di una stringa Unicode con massimo | 536,870,912 caratteri |
| ntext | Lunghezza variabile di una stringa Unicode | 2GB |
| binary(n) | Lunghezza variabile di una stringa binaria | 8,000 bytes |
| varbinary | Lunghezza variabile di una stringa binaria | 8,000 bytes |
| varbinary(max) | Lunghezza variabile di una stringa binaria con massimo | 2GB |

La differenza tra un campo con lunghezza **fissa** e una **variabile** sta nell’allocazione dello spazio: se viene definito un campo di tipo testuale con lunghezza _variabile_ di 100 caratteri, nel caso in cui il valore del record inserito sia inferiore, lo spazio viene “trimmato”, ossia accorciato all’effettiva lunghezza del campo. Un esempio sono i dati anagrafici di una persona, che variano in lunghezza del nome e del cognome.

Se usassimo invece un campo di tipo testuale ma a lunghezza _fissa_, ogni record avrebbe allocato per sé sempre quella dimensione, anche in caso di utilizzo parziale. Un esempio è il campo che definisce il codice fiscale!

## Dati numerici

| Tipo di dato | Descrizione | Dimensione massima |
| --- | --- | --- |
| bit | 0,1 o NULL | |
| tinyint | [0, 255] | 1 byte |
| smallint | [-32768,32767] | 2 bytes |
| int | [-2147483648,2147483647] | 4 bytes |
| bigint | [-9223372036854775808,9223372036854775807] | 8 bytes |
| numeric(p,s) | [-10^38 +1, 10^38 –1] | 5-17 bytes |
| smallmoney | [-214748.3648,214748.3647] | 4 bytes |
| money | [-922337203685477.5808,922337203685477.5807] | 8 bytes |
| float(n) | [-1.79E + 308, 1.79E + 308] | 4/8 bytes |
| real | [-3.40E + 38 , 3.40E + 38] | 4 bytes |

# Dati temporali

| Tipo di dato | Descrizione | Dimensione massima |
| --- | --- | --- |
| datetime | Accuratezza in millisecondi | 8 bytes |
| datetime2 | Accuratezza in nanosecondi | 6-8 bytes |
| smalldatetime | Accuratezza in minuti | 4 bytes |
| date | Data per memorizzare giorno, mese e anno | 3 bytes |
| time | Tempo espresso con una precisione in termini di nanosecondi | 3-5 bytes |
| datetimeoffset | Come datetime2, ma con la possibilità di specificare la timezone | 8-10 bytes |
| timestamp | Tempo espresso in millisecondi | 4 bytes |

Qual è la differenza tra _timestamp_ e _time_? Un campo di tipo **timestamp** viene aggiornato automaticamente ogni volta che un valore presente nella riga viene aggiornato o modificato ed è basato su un valore interno al database.

> Ogni tabella dovrebbe avere un solo campo di tipo _timestamp_.

# Tip

Qual è la data _minima_ che un campo _datetime_ supporta? Il primo gennaio 1753.

E la data _massima_? Il 31 dicembre 9999.

# Risorse utili

- [Documentazione ufficiale](https://docs.microsoft.com/it-it/sql/relational-databases/backup-restore/create-a-full-database-backup-sql-server?view=sql-server-ver16)
- [Basi di Dati](https://amzn.to/3ABUix3)