Condividi tramite


Conversione del tipo di dati (motore di database)

Si applica a:SQL ServerDatabase SQL di AzureIstanza gestita di SQL di AzureAzure Synapse AnalyticsPiattaforma di strumenti analitici (PDW)Endpoint di analisi SQL 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, potrebbe 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 data0. SYSDATETIME() esegue la conversione implicita in stile di data 21.

Nelle conversioni esplicite vengono utilizzate le funzioni CAST o 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 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.

Tabella dettagliata contenente tutti i tipi di dati SQL nelle righe e nelle colonne, indicante quali tipi di conversioni di tipi di dati sono possibili.

Mentre il grafico precedente 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 un concatenamento 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 restituisce il valore 1 is a string..

L'esempio seguente mostra uno script simile ma 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. L'operatore + diventa un'addizione anziché un concatenamento 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 valorenchar può essere convertito in binario solo tramite la conversione esplicita. La conversione implicita in binario non è supportata. È tuttavia possibile convertire in modo esplicito o implicito un valore nchar in valore nvarchar.

Nei seguenti articoli viene descritto il funzionamento della conversione dei tipi di dati corrispondenti:

Convertire i tipi di dati utilizzando le 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 Booleano
binary, varbinary, image Matrice unidimensionale Byte()
int Long
smallint Integer
tinyint Byte
float Double
real Singolo
money, smallmoney Valuta
datetime, smalldatetime Data
Qualsiasi elemento impostato su NULL Variant impostato su Null

Tutti i singoli valori di SQL Server vengono convertiti in un singolo valore di Visual Basic, eccetto i valori binary, varbinary e image. Questi valori vengono convertiti in una matrice 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
Valuta money
Data datetime
String con 4.000 caratteri o meno varchar/nvarchar
String con più di 4.000 caratteri text/ntext
Matrice Byte() unidimensionale con numero di byte minore o uguale a 8.000 varbinary
Matrice Byte() unidimensionale con un numero di byte maggiore di 8.000 Immagine