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
Ora
varbinary
hierarchyid
int
Testo
datetime
image
sql_variant
bigint
nchar
datetime2
table
bit
nvarchar
smalldatetime
timestamp
decimale/numerico
ntext
datetimeoffset
uniqueidentifier
numeric
xml
money
geografia
smallmoney
geometry
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 - Nero, 58
706: HL Road Frame - Rosso, 58
707: Casco Sport-100, Rosso
708: Casco Sport-100, Nero
...
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 - Nero, 58
706: HL Road Frame - Rosso, 58
707: Casco Sport-100, Rosso
708: Casco Sport-100, Nero
...
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 $
...
...