Conversione del tipo di dati (motore di database)
Si applica a: SQL Server database SQL di Azure Istanza gestita di SQL di Azure endpoint di analisi SQL di Azure Synapse Analytics Platform System (PDW) in Microsoft Fabric Warehouse 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()
converte in modo implicito in stile 0
data . 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.
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:
- binary e varbinary
- datetime2
- money e smallmoney
- bit
- datetimeoffset
- smalldatetime
- char e varchar
- decimal e numeric
- sql_variant
- date
- float e real
- time
- datetime
- int, bigint, smallint e tinyint
- uniqueidentifier
- xml
- json
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 |