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: concetti di base, terminologia e sintassi e Riferimenti 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 |
@ParamName |
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 del valore falso WHERE Bitvalue = 0
- Testare 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 ProductIn 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 delle uguaglianze dirette 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 CAST e CONVERTI TSQL, anche se esistono altre funzioni di conversione per esigenze specializzate. 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 esiste alcuna funzione TSQL corrispondente, è in genere possibile creare una colonna calcolata (il termine TSQL usato 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 Che cosa sono le funzioni di database SQL?.
La tabella seguente elenca le funzioni di Access per cui sono disponibili funzioni TSQL corrispondenti.