Se si esegue la migrazione dei dati di Access a SQL Server o si crea una soluzione di Access con SQL Server come database back-end, è fondamentale conoscere le differenze tra SQL di Access e SQL Server Transact SQL (TSQL). Di seguito sono elencate le principali varianti che è essenziale conoscere per garantire il corretto funzionamento della soluzione.
Per altre informazioni, vedere Linguaggio SQL per Access: nozioni fondamentali, terminologia e sintassi e Guida di riferimento a Transact-SQL.
Differenze relative a sintassi ed espressioni
Sono presenti alcune differenze relative a sintassi ed espressioni per le quali è richiesta la conversione. La tabella seguente riepiloga le differenze più comuni.
Differenza |
SQL per Access |
TSQL di SQL Server |
Attributo di database relazionale |
In genere denominato campo |
In genere denominata colonna |
Valori letterali stringa |
Virgolette ("), ad esempio "Mary Q. Contrary" |
Apostrofo ('), ad esempio 'Mary Q. Contrary' |
Valori letterali data |
Cancelletto (#), ad esempio #01/01/2019# |
Apostrofo ('), ad esempio '01/01/2019' |
Più caratteri jolly |
Asterisco (*), ad esempio "Cath*" |
Percentuale (%), ad esempio 'Cath%' |
Singolo carattere jolly |
Punto interrogativo (?), ad esempio "Cath?" |
Carattere di sottolineatura (_), ad esempio "Cath_" |
Operatore modulo |
Operatore MOD, ad esempio Valore 1 MOD Valore 2 |
Percentuale (%), ad esempio Valore1 % Valore2 |
Valori booleani |
WHERE Bitvalue = [True | False] Oppure WHERE Bitvalue = [-1 | 0] |
WHERE Bitvalue = [1 | 0] |
Parametri |
[<Un nome che non è una colonna definita>] Oppure Nella visualizzazione SQL usare la dichiarazione dei parametri SQL |
@NomeParametro |
Note
-
Access usa le virgolette (") per racchiudere i nomi e gli oggetti di tabella. T-SQL può usarle per i nomi di tabella contenenti spazi, ma si tratta di una procedura non standard per l'assegnazione dei nomi. Nella maggior parte dei casi i nomi degli oggetti devono essere rinominati senza spazi ed è inoltre necessario riscrivere le query in modo che rispecchino i nuovi nomi di tabella. Usare le parentesi quadre [ ] per le tabelle che non possono essere rinominate ma che non rispettano gli standard di denominazione. Per racchiudere i parametri nelle query, Access usa anche parentesi aggiuntive, che però possono essere rimosse in T-SQL.
-
È consigliabile usare il formato data canonico, ovvero aaaa-mm-gg hh:mm:ss, che corrisponde a uno standard ODBC per le date archiviate come caratteri, in quanto consente di rappresentarle in modo coerente tra più database e mantiene l'ordinamento delle date.
-
Per evitare confusione quando si confrontano valori booleani, è possibile usare il seguente confronto per Access e SQL Server:
-
Test per il valore falso WHERE Bitvalue = 0
-
Condizione per il valore vero WHERE Bitvalue <> 0
-
Valori Null
Un valore Null non è un campo vuoto che indica "nessun valore". ma è un segnaposto che indica che i dati mancano o sono sconosciuti. I sistemi di database che riconoscono i valori Null implementano la "logica a tre valori", il che significa che qualcosa può essere vero, falso o sconosciuto. Se non si gestiscono correttamente i valori Null, è possibile ottenere risultati non corretti durante i confronti delle uguaglianze o la valutazione delle clausole WHERE. Ecco un confronto relativo alla gestione dei valori Null in Access e SQL Server.
Disabilitare i valori Null in una tabella
In Access e SQL Server l'esperienza predefinita prevede che i valori Null siano abilitati. Per disabilitare i valori Null in una colonna della tabella, eseguire le operazioni seguenti:
-
In Access impostare la proprietà Required di un campo su Yes.
-
In SQL Server aggiungere l'attributo NOT NULL a una colonna in un'istruzione CREATE TABLE.
Eseguire il test per i valori Null nella clausola WHERE
Usare i predicati di confronto IS NULL e IS NOT NULL:
-
In Access usare IS NULL o IS NOT NULL. Ad esempio:
SELECT … WHERE column IS NULL.
-
In SQL Server usare IS NULL o IS NOT NULL. Ad esempio:
SELECT … WHERE field IS NULL
Convertire i valori Null con le funzioni
Usare le funzioni Null per proteggere le espressioni e restituire valori alternativi:
-
In Access usare la funzione NZ (valore, [valsenull]) che restituisce 0 o un altro valore. Ad esempio:
SELECT AVG (NZ (Weight, 50) ) FROM Product
-
In SQL Server usare la funzione ISNULL (valore, valore_sostituzione) che restituisce 0 o un altro valore. Ad esempio:
SELECT AVG (ISNULL (Weight, 50)) FROM Product
Informazioni sulle opzioni di database
Alcuni sistemi di database prevedono meccanismi proprietari:
-
In Access non esistono opzioni di database relative a Null.
-
In SQL Server è possibile usare l'opzione SET ANSI_NULLS OFF per i confronti diretti di uguaglianza con NULL usando gli operatori = e <>. È consigliabile evitare di usare questa opzione dal momento che è deprecata e può confondere altri utenti che si basano sulla gestione dei valori Null conforme alla norma ISO.
Conversione e cast
Quando si lavora con i dati o con la programmazione, è spesso necessario convertire i dati da un tipo di dati a un altro. Il processo di conversione può essere semplice o complesso. I problemi più comuni che è necessario considerare sono: la conversione implicita o esplicita, le impostazioni internazionali di data e orario correnti, l'arrotondamento o il troncamento di numeri e dimensioni dei tipi di dati. Non c'è alcun sostituto per un test approfondito e la conferma dei tuoi risultati.
In Access è possibile usare le 11 funzioni di conversione del tipo, ognuna delle quali inizia con la lettera C, una per ogni tipo di dati. Ad esempio, per convertire un numero a virgola mobile in una stringa:
CStr(437.324) returns the string "437.324".
In SQL Server si usano principalmente le funzioni TSQL CAST e CONVERT, anche se esistono altre funzioni di conversione per esigenze specifiche. Ad esempio, per convertire un numero a virgola mobile in una stringa:
CONVERT(TEXT, 437.324) returns the string "437.324"
Funzioni DateAdd, DateDiff e DatePart
Queste funzioni di data di uso comune sono simili (DateAdd, DateDiff e DatePart) in Access e TSQL, ma l'uso del primo argomento è diverso.
-
In Access il primo argomento è denominato intervallo ed è un'espressione stringa che richiede virgolette.
-
In SQL Server, il primo argomento viene chiamato datepart e usa valori di parole chiave che non richiedono virgolette.
Componente
Access
SQL Server
Anno
"aaaa"
anno, aa, aaaa
Trimestre
"t"
trimestre, tt, t
Mese
"m"
mese, mm, m
Giorno dell'anno
"a"
giornoanno, ga, a
Giorno
"g"
giorno, gg, g
Settimana
"ss"
sett, ss
Giorno della settimana
"s"
giorno feriale, gs
Ora
"h"
ora, hh
Minuto
"n"
minuto, mi, n
Secondo
"s"
secondo, ss, s
Millisecondo
millisecondo, ms
Confronto di funzioni
Le query di Access possono contenere colonne calcolate che talvolta usano funzioni di Access per ottenere risultati. Quando si esegue la migrazione di query a SQL Server, è necessario sostituire la funzione di Access con una funzione TSQL equivalente, se disponibile. Se non è presente una funzione TSQL corrispondente, in genere è possibile creare una colonna calcolata (termine TSQL per una colonna calcolata) per eseguire le operazioni desiderate. TSQL ha un'ampia gamma di funzioni ed è a tuo vantaggio vedere cosa è disponibile. Per altre informazioni, vedere Quali sono le funzioni del database SQL?.
La tabella seguente elenca le funzioni di Access per cui sono disponibili funzioni TSQL corrispondenti.
Categoria di Access |
Funzione di Access |
Funzione di TSQL |
Conversione |
||
Conversione |
||
Conversione |
||
Conversione |
||
Conversione |
||
Conversione |
||
Data/ora |
||
Data/ora |
||
Data/ora |
||
Data/ora |
||
Data/ora |
||
Data/ora |
||
Data/ora |
||
Data/ora |
||
Data/ora |
||
Data/ora |
||
Data/ora |
||
Data/ora |
||
Data/ora |
||
Data/ora |
||
Data/ora |
||
Aggregazione sui domini |
||
Funzioni matematiche |
||
Funzioni matematiche |
||
Funzioni matematiche |
||
Funzioni matematiche |
||
Funzioni matematiche |
||
Funzioni matematiche |
||
Funzioni matematiche |
||
Funzioni matematiche |
||
Funzioni matematiche |
||
Funzioni matematiche |
||
Funzioni matematiche |
||
Flusso esecuzione programma |
||
Flusso esecuzione programma |
||
Funzioni statistiche |
||
Aggregazione SQL |
||
Aggregazione SQL |
||
Aggregazione SQL |
||
Aggregazione SQL |
||
Aggregazione SQL |
||
Testo |
||
Testo |
||
Testo |
||
Testo |
||
Testo |
||
Testo |
||
Testo |
||
Testo |
||
Testo |