Si vous migrez vos données Access vers SQL Server ou créez une solution Access avec SQL Server comme base de données principale, vous devez absolument connaître les différences entre Access SQL et SQL Server Transact SQL (T-SQL). Voici les principales différences à savoir pour assurer un bon fonctionnement de votre solution.
Si vous souhaitez en savoir plus, consultez les articles Access SQL : concepts de base, vocabulaire et syntaxe et Référence Transact-SQL.
Différences de syntaxe et d’expression
Certaines différences de syntaxe et d’expression nécessitent une conversion. Le tableau ci-dessous recense les plus courantes.
Différence |
Access SQL |
SQL Server T-SQL |
Attribut de base de données relationnelle |
Généralement appelé champ |
Généralement appelé colonne |
Littéraux de chaîne |
Guillemet droit double ("), par exemple : "Marie Q. Contraire" |
Apostrophe ou guillemet droit simple ('), par exemple : 'Marie Q. Contraire' |
Littéraux de date |
Symbole dièse (#), par exemple : #01/01/2019# |
Apostrophe ou guillemet droit simple ('), par exemple : '01/01/2019' |
Caractère générique valant plusieurs caractères |
Astérisque (*), par exemple : "Cath*" |
Symbole de pourcentage (%), par exemple : 'Cath%' |
Caractère générique valant pour un seul caractère |
Point d’interrogation (?), par exemple : "Cath?" |
Trait de soulignement (_), par exemple : "Cath_" |
Opérateur modulo |
Opérateur MOD, par exemple : Valeur1 MOD Valeur2 |
Symbole de pourcentage (%), par exemple : Valeur1 % Valeur2 |
Valeurs booléennes |
WHERE BitValue = [True | False] Ou WHERE BitValue = [-1 | 0] |
WHERE Bitvalue = [1 | 0] |
Paramètres |
[<Un nom qui n’est pas une colonne définie>] Ou En mode SQL, utilisez la déclaration SQL PARAMETERS |
@ParamName |
Remarques
-
Dans Access, les noms de tables et d’objets sont encadrés par des guillemets droits ("). Cela est possible dans T-SQL pour les noms de tables comportant des espaces. Cependant, cette convention de nommage est rare. Dans la plupart des cas, les noms d’objets doivent être renommés sans espace, mais les requêtes doivent également être réécrites pour refléter les nouveaux noms de tables. Utilisez des crochets [ ] pour les tables qui ne peuvent pas être renommées, mais qui ne sont pas conformes aux conventions de nommage. Dans les requêtes Access, les paramètres sont encadrés par des parenthèses. Elles peuvent être supprimées dans T-SQL.
-
Nous vous conseillons d’utiliser le format de date canonique, yyyy-mm-jj hh:nn:ss (année-mois-jour heures:minutes:secondes). Il s’agit d’une norme ODBC pour les dates stockées sous forme de caractères. Elle permet de les représenter de façon cohérente dans les bases de données et de conserver l’ordre de tri des dates.
-
Pour éviter toute confusion lors de la comparaison de valeurs booléennes, vous pouvez utiliser la comparaison suivante pour Access et SQL Server :
-
Tester la valeur false WHERE Bitvalue = 0
-
Tester la valeur true WHERE Bitvalue <> 0
-
Valeurs NULL
Une valeur NULL n’est pas un champ vide qui signifie « aucune valeur ». Une valeur NULL est un espace réservé qui signifie que des données sont manquantes ou inconnues. Les systèmes de base de données qui reconnaissent les valeurs NULL implémentent une « logique ternaire». Cela signifie que vous pouvez utiliser la valeur « true » (« vrai »), « false » (« faux ») ou « unknown » (« inconnu »). Si vous ne gérez pas correctement les valeurs NULL, vous risquez d’obtenir des résultats incorrects lorsque vous faites des comparaisons d’égalité ou évaluez des clauses WHERE. Voici une comparaison de la façon dont Access et SQL Server gèrent les valeurs NULL.
Désactiver les valeurs NULL dans une table
Dans Access et SQL Server, les valeurs NULL sont activées par défaut. Pour désactiver les valeurs NULL dans la colonne d’une table, procédez comme suit :
-
Dans Access, définissez la propriété d’un champ Required (Obligatoire) sur Yes (Oui).
-
Dans SQL Server, ajoutez l’attribut NOT NULL à une colonne dans une instruction CREATE TABLE.
Tester les valeurs NULL dans une clause WHERE
Utilisez les prédicats de comparaison IS NULL et IS NOT NULL :
-
Dans Access, utilisez IS NULL ou IS NOT NULL. Par exemple :
SELECT … WHERE column IS NULL.
-
Dans SQL Server, utilisez IS NULL ou IS NOT NULL. Par exemple :
SELECT … WHERE field IS NULL
Convertir des valeurs NULL à l’aide de fonctions
Utilisez les fonctions NULL pour protéger vos expressions et retourner d’autres valeurs :
-
Dans Access, utilisez la fonction NZ (value, [valueifnull]) qui renvoie 0 ou une autre valeur. Par exemple :
SELECT AVG (NZ (Weight, 50) ) FROM Product
-
Dans SQL Server, utilisez la fonction ISNULL (Value, replacement_value) qui renvoie 0 ou une autre valeur. Par exemple :
SELECT AVG (ISNULL (Weight, 50)) FROM Product
Comprendre les options de base de données
Certains systèmes de base de données disposent de mécanismes propriétaires :
-
Dans Access, aucune option de base de donnée n’est associée à NULL.
-
Dans SQL Server, vous pouvez utiliser l’option SET ANSI_NULLS OFF pour les comparaisons d’égalité directe avec NULL à l’aide des opérateurs = et <>. Nous vous déconseillons d’utiliser cette option, car elle est obsolète et peut induire en erreur les personnes qui se fient à la conformité ISO pour la gestion des valeurs NULL.
Conversion et cast
Si vous travaillez avec des données ou un langage de programmation, vous devrez forcément convertir un type de données en un autre à un moment donné. Le processus de conversion peut être simple ou complexe. Voici les principaux problèmes et choix auxquels vous devrez réfléchir : opter pour une conversion implicite ou explicite, gérer les paramètres régionaux de date et d’heure, opter pour un arrondi ou une troncation des nombres, et gérer les tailles de type de données. Aucun substitut n’est disponible pour tester et confirmer vos résultats de façon approfondie.
Access propose 11 fonctions de conversion de type sont disponibles. Elles commencent toutes par la lettre C. Chacune d’elle correspond à un type de données. Par exemple, pour convertir un nombre à virgule flottante en chaîne :
CStr(437.324) returns the string "437.324".
Dans SQL Server, vous utilisez principalement les fonctions T-SQL CAST et CONVERT, même s’il existe d’autres fonctions de conversion pour répondre à des besoins spécifiques. Par exemple, pour convertir un nombre à virgule flottante en chaîne :
CONVERT(TEXT, 437.324) returns the string "437.324"
vous pouvez utiliser les fonctions DateAdd, DateDiff et DatePart
Ces fonctions de date fréquemment utilisées sont similaires (DateAdd, DateDiff et DatePart) dans Access et T-SQL, à l’exception de l’utilisation de leur premier argument.
-
Dans Access, le premier argument est appelé interval et représente une expression de chaîne qui nécessite des guillemets.
-
Dans SQL Server, le premier argument est appelé datepartet utilise des valeurs de mot clé qui n’ont pas besoin de guillemets.
Composant
Access
SQL Server
Année
"yyyy"
year, yy, yyyy
Trimestre
"q"
quarter, qq, q
Mois
"m"
month, mm, m
Jour de l’année
"y"
dayofyear, dy, y
Jour
"d"
day, dd, d
Semaine
"ww"
wk, ww
Jour de la semaine
"w"
weekday, dw
Heure
"h"
hour, hh
Minute
"n"
minute, mi, n
Seconde
"s"
second, ss, s
Milliseconde
millisecond, ms
Comparaison de fonctions
Les requêtes Access peuvent contenir des colonnes calculées qui utilisent parfois des fonctions Access pour obtenir des résultats. Lorsque vous migrez des requêtes vers SQL Server, vous devez remplacer la fonction Access par une fonction T-SQL équivalente si celle-ci est disponible. S’il n’y a pas de fonction T-SQL correspondante, vous pouvez généralement créer une colonne calculée pour faire ce que vous souhaitez. T-SQL inclut un large éventail de fonctions qu’il est bon de connaître. Veuillez consulter la page suivante pour obtenir plus d’informations : Quelles sont les fonctions de base de données SQL ?.
Le tableau suivant indique les fonctions Access auxquelles correspondent des fonctions T-SQL.
Catégorie Access |
Fonction Access |
Fonction T-SQL |
Conversion |
||
Conversion |
||
Conversion |
||
Conversion |
||
Conversion |
||
Conversion |
||
Date/Heure |
||
Date/Heure |
||
Date/Heure |
||
Date/Heure |
||
Date/Heure |
||
Date/Heure |
||
Date/Heure |
||
Date/Heure |
||
Date/Heure |
||
Date/Heure |
||
Date/Heure |
||
Date/Heure |
||
Date/Heure |
||
Date/Heure |
||
Date/Heure |
||
Agrégation de domaine |
||
Math |
||
Math |
||
Math |
||
Math |
||
Math |
||
Math |
||
Math |
||
Math |
||
Math |
||
Math |
||
Math |
||
Déroulement de programme |
||
Déroulement de programme |
||
Statistiques |
||
Agrégat SQL |
||
Agrégat SQL |
||
Agrégat SQL |
||
Agrégat SQL |
||
Agrégat SQL |
||
Texte |
||
Texte |
||
Texte |
||
Texte |
||
Texte |
||
Texte |
||
Texte |
||
Texte |
||
Texte |