Se si esegue la migrazione dei dati di Access a SQL Server o si crea una soluzione Access usando SQL Server come database back-end, è fondamentale conoscere le differenze tra il linguaggio SQL per Access e l'estensione Transact SQL (TSQL) di SQL Server. 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 corrisponde a 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", la quale indica che un elemento può essere vero, falso o sconosciuto. Se non si gestiscono in modo corretto i valori Null, i risultati durante i confronti di uguaglianze o la valutazione delle clausole WHERE possono essere errati. 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. È comunque essenziale procedere a un test approfondito e alla conferma dei 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 viene denominato interval ed è costituito da un'espressione stringa che deve essere racchiusa tra virgolette.
-
In SQL Server il primo argomento viene denominato datepart e usa valori parole chiave che non devono essere racchiusi tra 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 offre una vasta gamma di funzioni che è utile conoscere per sfruttare le funzionalità disponibili. 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 |