Conversione del tipo di dati (motore di database)

Si applica a:SQL Server database SQL di Azure Istanza gestita di SQL di Azure Azure Synapse Analytics AnalyticsPlatform System (PDW)SQL analytics endpoint in Microsoft FabricWarehouse in Microsoft Fabric

I tipi di dati possono essere convertiti negli scenari seguenti:

  • Quando i dati di un oggetto vengono spostati, confrontati o combinati con i dati di un altro oggetto, può essere necessario convertirli nel tipo di dati del secondo oggetto.
  • Quando i dati di una colonna di risultati, di un codice restituito o di un parametro di output di Transact-SQL vengono spostati in una variabile di programma, è necessario convertirli dal tipo di dati di sistema di SQL Server in quello della variabile.

Le conversioni del tipo di dati supportate tra una variabile di applicazione e una colonna del set di risultati, un codice restituito, un parametro o un marcatore di parametro di SQL Server vengono definite dall'API di database.

Conversione implicita ed esplicita

I tipi di dati possono essere convertiti in modo implicito o esplicito.

Le conversioni implicite non sono visibili all'utente. SQL Server converte automaticamente i dati da un tipo all'altro. Se ad esempio un valore smallint viene confrontato con un valore int, il valore smallint viene implicitamente convertito in un valore int prima dell'esecuzione del confronto.

GETDATE() esegue la conversione implicita in stile di data 0. SYSDATETIME() esegue la conversione implicita in stile di data 21.

Nelle conversioni esplicite vengono utilizzate le funzioni CAST e CONVERT.

Le funzioni CAST e CONVERT consentono di convertire un valore, ad esempio una variabile locale, una colonna o un'altra espressione, da un tipo di dati a un altro. Ad esempio, la funzione CAST seguente converte il valore numerico $157.27 nella stringa di caratteri '157.27':

CAST ( $157.27 AS VARCHAR(10) )  

Usare CAST invece di CONVERT per rendere il codice di programma Transact-SQL compatibile con lo standard ISO. Utilizzare CONVERT invece di CAST per trarre vantaggio dalla funzionalità degli stili disponibile in CONVERT.

Nella figura seguente vengono illustrate le conversioni di tipi di dati esplicite e implicite consentite per i tipi di dati di sistema di SQL Server. Questi includono xml, bigint e sql_variant. Non è possibile eseguire una conversione implicita in un'assegnazione dal tipo di dati sql_variant, ma è possibile eseguire una conversione implicita verso il tipo di dati sql_variant.

Data type conversion table

Mentre il grafico sopra riportato illustra tutte le conversioni esplicite e implicite consentite in SQL Server, non indica il tipo di dati risultante della conversione. Quando SQL Server esegue una conversione esplicita, l'istruzione stessa determina il tipo di dati risultante. Per le conversioni implicite, le istruzioni di assegnazione, ad esempio l'impostazione del valore di una variabile o l'inserimento di un valore in una colonna, hanno come risultato il tipo di dati definito dalla dichiarazione di variabile o dalla definizione di colonna. Per gli operatori di confronto o altre espressioni, il tipo di dati risultante dipende dalle regole di precedenza dei tipi di dati.

Ad esempio, lo script seguente definisce una variabile di tipo varchar, assegna un valore di tipo int alla variabile e quindi seleziona una concatenazione della variabile con una stringa.

DECLARE @string VARCHAR(10);
SET @string = 1;
SELECT @string + ' is a string.'

Il valore int di 1 viene convertito in un varchar, in modo che l'istruzione SELECT restituisca il valore 1 is a string..

L'esempio seguente mostra uno script simile con una variabile int:

DECLARE @notastring INT;
SET @notastring = '1';
SELECT @notastring + ' is not a string.'

In questo caso, l'istruzione SELECT genera l'errore seguente:

Msg 245, Level 16, State 1, Line 3 Conversion failed when converting the varchar value ' is not a string.' to data type int.

Per valutare l'espressione @notastring + ' is not a string.', SQL Server segue le regole di precedenza dei tipi di dati per completare la conversione implicita prima che il risultato dell'espressione possa essere calcolato. Dato che int ha una precedenza maggiore di varchar, SQL Server tenta di convertire la stringa in un intero e non riesce perché la stringa non può essere convertita in un intero. Se l'espressione fornisce una stringa che può essere convertita, l'istruzione ha esito positivo, come nell'esempio seguente:

DECLARE @notastring INT;
SET @notastring = '1';
SELECT @notastring + '1'

In questo caso, la stringa 1 può essere convertita nel valore intero 1, quindi questa istruzione SELECT restituisce il valore 2. Si noti che l'operatore + diventa un'addizione anziché una concatenazione quando i tipi di dati specificati sono interi.

Funzionamento della conversione dei tipi di dati

Alcune conversioni implicite ed esplicite non sono supportate quando si converte il tipo di dati di un oggetto di SQL Server in un altro tipo di dati. Non è ad esempio possibile convertire un valore nchar in un valore image. Un valore nchar può essere convertito in un valore binary solo tramite una conversione esplicita, in quanto la conversione implicita in valore binary non è supportata. È tuttavia possibile convertire in modo esplicito o implicito un valore nchar in valore nvarchar.

Negli argomenti seguenti viene descritto il funzionamento della conversione dei tipi di dati corrispondenti:

Conversione del tipo di dati mediante stored procedure di automazione OLE

Poiché in SQL Server vengono usati tipi di dati Transact-SQL e nell'automazione OLE vengono usati tipi di dati Visual Basic, i dati che vengono trasferiti da un sistema all'altro devono essere convertiti tramite le stored procedure di automazione OLE.

Nella tabella seguente vengono descritte le conversioni dei tipi di dati di Visual Basic SQL Server.

Tipo di dati di SQL Server Tipo di dati di Visual Basic
char, varchar, text, nvarchar, ntext Stringa
decimal, numeric Stringa
bit Boolean
binary, varbinary, image Matrice di Byte() unidimensionale
int Long
smallint Integer
tinyint Byte
float Double
real Singolo
money, smallmoney Currency
datetime, smalldatetime Date
Qualsiasi tipo impostato su NULL Variant impostato su Null

Tutti i singoli valori di SQL Server vengono convertiti in un singolo valore di Visual Basic, ad eccezione dei valori binary, varbinary e image. Questi valori vengono convertiti in una matrice di Byte() unidimensionale in Visual Basic. Questa matrice ha un intervallo di Byte( 0 to length 1**)** dove length è il numero di byte nei valori binary, varbinary o image di SQL Server.

Si tratta delle conversioni dai tipi di dati di Visual Basic ai tipi di dati SQL Server.

Tipo di dati di Visual Basic Tipo di dati di SQL Server
Long, Integer, Byte, Boolean, Object int
Double, Single float
Currency money
Date datetime
String con 4000 caratteri o meno varchar/nvarchar
String con più di 4000 caratteri text/ntext
Matrice di Byte() unidimensionale con numero di byte minore o uguale a 8000 varbinary
Matrice di Byte() unidimensionale con un numero di byte maggiore di 8000 Immagine

Vedi anche

Stored procedure di automazione OLE (Transact-SQL)
CAST e CONVERT (Transact-SQL)
Tipi di dati (Transact-SQL)
COLLATE (Transact-SQL)