Utilizzo di tipi di dati speciali

In questo argomento vengono descritti i tipi di dati speciali disponibili in SQL Server. I tipi di dati speciali sono tipi di dati che non rientrano in alcuna delle categorie di dati descritte in precedenza. In SQL Server i tipi di dati speciali includono bit, hierarchyid, sql_variant, sysname, table, timestamp e i tipi di dati alias.

bit

Il tipo di dati del bit è un tipo di dati numerici in cui è archiviato 0 o 1. I valori stringa True e False possono essere convertiti in valori bit come illustrato nell'esempio seguente:

SELECT CONVERT (bit, 'true')
SELECT CONVERT(bit, 'false')

In questo esempio true viene convertito in 1 e false in 0. I dati bit non devono essere racchiusi tra virgolette singole.

hierarchyid

Il tipo di dati hierarchyid viene utilizzato per gestire tabelle e dati gerarchici che presentano una struttura gerarchica. Per utilizzare dati gerarchici nel codice Transact-SQL, utilizzare le funzioni hierarchyid. Per ulteriori informazioni, vedere Utilizzo dei tipi di dati hierarchyid (Motore di database).

sql_variant

Grazie al tipo di dati sql_variant, in una singola colonna, parametro o variabile è possibile archiviare i valori di tipi diversi di dati. In ogni istanza di una colonna sql_variant vengono registrati il valore e i metadati che descrivono il valore. Sono disponibili i metadati seguenti:

  • Base data type

  • Maximum size

  • Scale

  • Precision

  • Collation

Per recuperare metadati per un'istanza sql_variant specifica, utilizzare la funzione SQL_VARIANT_PROPERTY.

Nell'esempio seguente la seconda tabella contiene una colonna sql_variant:

CREATE TABLE ObjectTable (
   ObjectID int CONSTRAINT PKObjectTable PRIMARY KEY,
   ObjectName nvarchar(80),
   ObjectWeight decimal(10,3),
   ObjectColor nvarchar(20))
CREATE TABLE VariablePropertyTable (
   ObjectID int REFERENCES ObjectTable(ObjectID),
   PropertyName nvarchar(100),
   PropertyValue sql_variant,
   CONSTRAINT PKVariablePropertyTable
   PRIMARY KEY(ObjectID, PropertyName))

sysname

Il tipo di dati sysname viene utilizzato per le colonne delle tabelle, le variabili e i parametri delle stored procedure in cui sono archiviati nomi di oggetto. La definizione esatta di sysname è correlata alle regole per gli identificatori e può variare pertanto tra istanze di SQL Server. Il funzionamento di sysname è analogo a quello di nvarchar(128), ad eccezione che sysname è diverso da NULL per impostazione predefinita. Nelle versioni precedenti di SQL Server, sysname viene definito come varchar(30).

Nota importanteImportante

Nei database in cui viene fatta distinzione tra maiuscole e minuscole, o per cui sono state definite regole di confronto binarie, sysname viene riconosciuto come un tipo di dati di sistema di SQL Server solo se riportato in caratteri minuscoli.

table

Il tipo di dati table funziona come una tabella temporanea. Viene utilizzato per archiviare un set di risultati per un'elaborazione successiva. Questo tipo di dati è utilizzabile solo per definire variabili locali di tipo table e il valore restituito di una funzione definita dall'utente.

La definizione di una variabile di tabella o di un valore restituito include le definizioni delle colonne, del tipo di dati, della precisione e della scala di ogni colonna, nonché i vincoli facoltativi PRIMARY KEY, UNIQUE, NULL e CHECK. Una tabella definita dall'utente non può essere utilizzata come tipo di dati.

Il formato delle righe archiviate in una variabile table o restituite da una funzione definita dall'utente deve essere definito al momento della dichiarazione della variabile o della creazione della funzione. La sintassi è basata sulla sintassi CREATE TABLE, ad esempio:

DECLARE @TableVar TABLE (Cola int PRIMARY KEY, Colb char(3))
INSERT INTO @TableVar VALUES (1, 'abc')
INSERT INTO @TableVar VALUES (2, 'def')
SELECT * FROM @TableVar
GO

Le variabili table e le funzioni definite dall'utente che restituiscono una table possono essere utilizzate solo in determinate istruzioni SELECT e INSERT e dove le tabelle sono supportate nelle istruzioni UPDATE, DELETE e DECLARE CURSOR. Le variabili table e le funzioni definite dall'utente che restituiscono una table non possono essere utilizzate in alcuna altra istruzione Transact-SQL.

Gli indici o altri vincoli applicati alla tabella devono essere definiti come parte della variabile DECLARE o dell'istruzione CREATE FUNCTION. Non possono essere applicati in seguito perché le istruzioni CREATE INDEX o ALTER TABLE non possono fare riferimento alle variabili di tabella e alle funzioni definite dall'utente.

Per ulteriori informazioni sulla sintassi utilizzata per definire le variabili table e le funzioni definite dall'utente, vedere DECLARE @local_variable (Transact-SQL) e CREATE FUNCTION (Transact-SQL).

timestamp

Il tipo di dati timestamp non è correlato in alcun modo all'ora o alla data. I valori timestamp sono numeri binari che indicano la sequenza relativa in cui si sono verificate le modifiche ai dati in un database.

Non utilizzare mai le colonne timestamp nelle chiavi, in particolare nelle chiavi primarie, in quanto il valore timestamp cambia ogni volta che la riga viene modificata.

Per registrare i momenti in cui vengono eseguite modifiche ai dati in una tabella, utilizzare un tipo di dati datetime2 o smalldatetime per registrare gli eventi e i trigger per aggiornare automaticamente i valori ogni volta che si verifica una modifica.

Tipi di dati alias

I tipi di dati alias consentono di estendere un tipo di dati di base di SQL Server, ad esempio varchar, con un nome descrittivo e un formato personalizzabile in base a un utilizzo specifico. Ad esempio, tramite l'istruzione seguente viene implementato un tipo di dati definito dall'utente birthday basato sul tipo di dati datetime e vengono consentiti i valori null (NULL):

EXEC sp_addtype birthday, datetime, 'NULL'

Prestare attenzione nella scelta dei tipi di base per l'implementazione dei tipi di dati definiti dall'utente. Ad esempio, negli Stati Uniti, i numeri della previdenza sociale presentano il formato nnn-nn-nnnn. Sebbene tali numeri contengano cifre, essi costituiscono un identificatore e non sono soggetti a operazioni matematiche. Pertanto, è pratica comune creare un tipo di dati specifico per i numeri della previdenza sociale, definito dall'utente, come varchar e creare un vincolo CHECK per applicare il formato dei numeri della previdenza sociale archiviati nella tabella, come illustrato nell'esempio seguente:

EXEC sp_addtype SSN, 'VARCHAR(11)', 'NOT NULL'
GO
CREATE TABLE ShowSSNUsage (EmployeeID int PRIMARY KEY, EmployeeSSN SSN, CONSTRAINT CheckSSN CHECK ( EmployeeSSN LIKE '[0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9][0-9][0-9]' )
)
GO

Se le colonne SSN vengono in genere utilizzate come colonne chiave negli indici, in particolare negli indici cluster, la dimensione delle chiavi può essere compressa da 11 a 4 byte se il tipo di dati SSN definito dall'utente viene implementato utilizzando invece il tipo di dati di base int. La riduzione delle dimensioni della chiave migliora il recupero dei dati. La migliorata efficienza del recupero dati e l'eliminazione della necessità del vincolo CHECK in genere compensa l'elaborazione di conversione aggiuntiva da int a un formato carattere in caso di visualizzazione o modifica dei valori SSN.