Usare i tipi di dati

Completato

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

...

...