Confronto tra SQL per Access e T-SQL per SQL Server

Si applica a
Access per Microsoft 365 Access 2024 Access 2021 Access 2019 Access 2016

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 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 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.

Categoria di Access Funzione di Access Funzione di TSQL
Conversione Funzione Chr CODICE.CARATT
Conversione Funzione Day DAY
Conversione Funzione FormatNumber FORMATO
Conversione Funzione FormatPercent FORMATO
Conversione Funzione Str STR
Conversione Funzioni di conversione tra tipi CAST e CONVERTI
Data/Ora Funzione Date CURRENT_TIMESTAMP
Data/Ora Funzione Day DATEFROMPARTS
Data/Ora Funzione DateAdd DATEADD
Data/Ora Funzione DateDiff DATEDIFF
DATEDIFF_BIG
Data/Ora Funzione DatePart DATEPART
Data/Ora Funzione DateSerial DATEFROMPARTS
Data/Ora Funzione DateValue NOME DATA
Data/Ora Funzione Hour TIMEFROMPARTS
Data/Ora Funzione Minute TIMEFROMPARTS
Data/Ora Funzione Month MONTH
Data/Ora Funzione Now SYSDATETIME
Data/Ora Funzione Second TIMEFROMPARTS
Funzione Time TIMEFROMPARTS
Data/Ora Funzione TimeSerial TIMEFROMPARTS
Data/Ora Funzione Weekday DATEPART
NOME DATA
Data/Ora Funzione Year YEAR
DATEFROMPARTS
Aggregazione sui domini Funzioni DFirst, DLast FIRST_VALUE
LAST_VALUE
Funzioni matematiche Funzione Abs ASS
Funzioni matematiche Funzione Atn ARCTAN
ATN2
Funzioni matematiche Funzione Cos COS
ARCCOS
Funzioni matematiche Funzione Exp ESP
Funzioni matematiche Funzioni Int e Fix ARROTONDA.DIFETTO
Funzioni matematiche Funzione Log LOG
LOG10
Funzioni matematiche Funzione Rnd CASUALE
Funzioni matematiche Funzione Round ROUND
Funzioni matematiche Funzione Sgn SEGNO
Funzioni matematiche Funzione Sin SEN
Funzioni matematiche Funzione Sqr RADQ
Flusso esecuzione programma Funzione Choose CHOOSE
Flusso esecuzione programma Funzione IIf IIF
Funzioni statistiche Funzione Avg MEDIA
Aggregazione SQL Funzione Count CONTA.NUMERI
COUNT_BIG
Aggregazione SQL Funzioni Min, Max MIN
MAX
Aggregazione SQL Funzioni StDev, StDevP DEV.ST
DEV.ST.POP
Aggregazione SQL Funzione Sum SOMMA
Aggregazione SQL Funzioni Var, VarP VAR
VAR.POP
Text Funzione Format FORMATO
Text Funzione LCase LOWER
Text Funzione Left SINISTRA
Text Funzione Len LUNGHEZZA
Text Funzioni LTrim, RTrim e Trim TRIM
LTRIM
RTRIM
Text Funzione Replace SOSTITUIRE
Text Funzione Right A DESTRA
Text Funzione StrReverse INVERTIRE
Text Funzione UCase UPPER