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

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 $

...

...