Usare i tipi di dati
A ogni colonna e variabile usata in Transact-SQL corrisponde un tipo di dati. Il comportamento dei valori nelle espressioni dipende dal tipo di dati della colonna o della variabile a cui si fa riferimento. Ad esempio, come illustrato in precedenza, è possibile usare l'operatore + per concatenare due valori stringa o per aggiungere due valori numerici.
Nella tabella seguente vengono illustrati i tipi di dati comuni supportati in un database di SQL Server.
Valori numerici esatti
Valori numerici approssimativi
Carattere
Data/ora
Binario
Altro
tinyint
float
char
data
binary
cursor
smallint
real
varchar
time
varbinary
hierarchyid
int
testo
data/ora
image
sql_variant
bigint
nchar
datetime2
table
bit
nvarchar
smalldatetime
timestamp
decimale/numerico
ntext
datetimeoffset
uniqueidentifier
numeric
xml
money
geografia
smallmoney
geometria
Nota
Per altre informazioni sui diversi tipi di dati e i rispettivi attributi, vedere la documentazione di riferimento di Transact-SQL.
Conversione del tipo di dati
I valori dei tipi di dati compatibili possono essere convertiti in modo implicito in base alle esigenze. Si supponga, ad esempio, di poter usare l'operatore + per aggiungere un numero intero a un numero decimale o per concatenare un valore char a lunghezza fissa con un valore varchar a lunghezza variabile. In alcuni casi potrebbe essere tuttavia necessario convertire in modo esplicito i valori da un tipo di dati a un altro. Ad esempio, se si tenta di usare + per concatenare un valore varchar con un valore Decimal verrà restituito un errore, a meno che non si converta prima il valore numerico in un tipo di dati stringa compatibile.
Nota
Le conversioni implicite ed esplicite si applicano solo a determinati tipi di dati e talvolta alcune di essere non sono possibili. Per altre informazioni, consultare i grafici disponibili nella documentazione di riferimento di Transact-SQL.
T-SQL include funzioni che consentono di eseguire la conversione esplicita tra tipi di dati
CAST e TRY_CAST
La funzione CAST converte un valore in un tipo di dati specificato se il valore è compatibile con il tipo di dati di destinazione. Se la conversione non è compatibile, viene restituito un errore.
Ad esempio, la query seguente usa CAST per convertire i valori Integer nella colonna ProductID in valori varchar (con un massimo di 4 caratteri) in modo da concatenarli con un altro valore basato su caratteri:
SELECT CAST(ProductID AS varchar(4)) + ': ' + Name AS ProductName
FROM Production.Product;
I possibili risultati di questa query potrebbero essere simili ai seguenti:
ProductName
680: HL Road Frame - Black, 58
706: HL Road Frame - Red, 58
707: Sport-100 Helmet, Red
708: Sport-100 Helmet, Black
...
Si supponga tuttavia che la colonna Size nella tabella Production.Product sia una colonna nvarchar (lunghezza variabile, dati di testo Unicode) che contiene alcune dimensioni numeriche (ad esempio 58) e alcune dimensioni basate su testo (ad esempio "S", "M" o "L"). La query seguente tenta di convertire i valori da questa colonna a un tipo di dati Integer:
SELECT CAST(Size AS integer) As NumericSize
FROM Production.Product;
La query restituirà il messaggio di errore seguente:
Errore: "Conversion failed when converting the nvarchar value 'M' to data type int" (La conversione del valore nvarchar "M" nel tipo di dati Integer non è riuscita).
Dato che almeno alcuni dei valori nella colonna sono numerici, è possibile convertire tali valori e ignorare gli altri. Per convertire i tipi di dati, è possibile usare la funzione TRY_CAST.
SELECT TRY_CAST(Size AS integer) As NumericSize
FROM Production.Product;
Questa volta i risultati potrebbero essere simili ai seguenti:
NumericSize
58
58
NULL
NULL
...
I valori che possono essere convertiti in un tipo di dati numerico vengono restituiti come valori Decimal e i valori incompatibili vengono restituiti come NULL, cioè il valore usato per indicare che un valore è sconosciuto.
Nota
Più avanti in questa unità verranno esaminate alcune considerazioni per la gestione dei valori NULL.
CONVERT e TRY_CONVERT
CAST è la funzione SQL standard ANSI per la conversione tra tipi di dati e viene usata in molti sistemi di database. In Transact-SQL è anche possibile usare la funzione CONVERT, come illustrato di seguito:
SELECT CONVERT(varchar(4), ProductID) + ': ' + Name AS ProductName
FROM Production.Product;
Ancora una volta, questa query restituisce il valore convertito nel tipo di dati specificato, come riportato di seguito:
ProductName
680: HL Road Frame - Black, 58
706: HL Road Frame - Red, 58
707: Sport-100 Helmet, Red
708: Sport-100 Helmet, Black
...
Così come CAST, CONVERT ha una variante TRY_CONVERT che restituisce NULL per i valori non compatibili.
Un altro vantaggio dell'uso di CONVERT rispetto a CAST consiste nel fatto che CONVERT include anche un parametro che consente di specificare uno stile di formato durante la conversione di valori di data e numerici in stringhe. Ad esempio, si consideri la query seguente:
SELECT SellStartDate,
CONVERT(varchar(20), SellStartDate) AS StartDate,
CONVERT(varchar(10), SellStartDate, 101) AS FormattedStartDate
FROM SalesLT.Product;
I risultati di questa query potrebbero essere simili ai seguenti:
SellStartDate
StartDate
FormattedStartDate
2002-06-01T00:00:00.0000000
1° giugno 2002 00:00
01/06/2002
2002-06-01T00:00:00.0000000
1° giugno 2002 00:00
01/06/2002
2005-07-01T00:00:00.0000000
1° luglio 2005 00:00
7/1/2005
2005-07-01T00:00:00.0000000
1° luglio 2005 00:00
7/1/2005
...
...
...
Nota
Per altre informazioni sui codici di formattazione degli stili che è possibile usare con CONVERT, vedere la documentazione di riferimento di Transact-SQL.
PARSE e TRY_PARSE
La funzione PARSE è progettata in modo da convertire stringhe formattate che rappresentano valori di data/ora o numerici. Prendere ad esempio in considerazione la query seguente, che usa valori letterali anziché valori delle colonne di una tabella:
SELECT PARSE('01/01/2021' AS date) AS DateValue,
PARSE('$199.99' AS money) AS MoneyValue;
I risultati di questa query sono simili ai seguenti:
DateValue
MoneyValue
2021-01-01T00:00:00.0000000
199.99
Analogamente a CAST e CONVERT, PARSE ha una variante TRY_PARSE che restituisce valori incompatibili come NULL.
Nota
Quando si usano tipi di dati decimali o numerici, potrebbe essere necessario arrotondare a un numero intero o impostare il punto decimale, che è possibile ottenere ricorrendo a precisione e scalabilità. Per comprendere meglio il concetto di precisione e scalabilità, consultare la documentazione di riferimento transact-SQL.
STR
La funzione STR converte un valore numerico in un valore varchar.
Ad esempio:
SELECT ProductID, '$' + STR(ListPrice) AS Price
FROM Production.Product;
Il risultato sarà simile al seguente:
ProductID
Price
680
$ 1.432,00
706
$ 1.432,00
707
$ 35,00
...
...