SQL : Vérifier la validité d’un numéro SIREN

Le numéro SIREN (Système d’Identification du Répertoire des ENtreprises) est un identifiant attribué à chaque entreprise en France. Son rôle est de permettre une identification unique et une traçabilité dans divers contextes administratifs et économiques.

SIREN SQL

Cependant, pour garantir la précision et l’intégrité des données, il est essentiel de vérifier la validité des numéros SIREN intégrés dans les bases de données (fiches tiers…). Dans cet article, nous fournirons une requête SQL pour faciliter ce processus de vérification sur l’ensemble d’une table de données tiers (clients, fournisseurs…) après un rapide propos introductif sur l’histoire de la création du SIREN.

Histoire du numéro SIREN

Le numéro SIREN a été introduit en France en 1973 pour simplifier l’identification des entreprises et faciliter leur suivi administratif.

Composé de 9 chiffres, il identifie de manière unique chaque entreprise enregistrée, quelle que soit sa forme juridique. Le SIREN est utilisé dans de multiples domaines, tels que les déclarations fiscales, la gestion comptable et commerciale (identification des partenaires commerciaux)…

Composition du numéro SIREN

Les huit premiers chiffres du numéro SIREN identifient l’entreprise et le neuvième, calculé à partir des huit premiers, constitue la clef de contrôle. C’est la cohérence entre les huit premiers chiffres et la clef de contrôle qu’il convient de vérifier. La clef (ou somme) de contrôle est calculée selon l’algorithme de Luhn.

L’algorithme de Luhn

L’algorithme de Luhn, également connu sous le nom d’algorithme de Mod 10, est une méthode couramment utilisée pour vérifier l’intégrité des numéros d’identification.  Il a été créé dans les années 60 par un ingénieur allemand nommé Hans Peter LUHN alors qu’il travaillait comme chercheur chez IBM, et sa notoriété prit forme lorsque les banques l’adoptèrent pour vérifier la validité des numéros de cartes de crédit. Il repose sur un calcul de somme de contrôle pour détecter les erreurs de saisie ou de transmission. Il est donc utilisé pour valider les numéros de cartes bancaires mais aussi les numéros de sécurité sociale, IMEI (téléphones portables), SIREN et SIRET, de TVA intracommunautaire…

Pour vérifier une somme de contrôle d’un numéro SIREN, cet algorithme repose sur les étapes de calcul suivantes :

  1. Doubler un chiffre sur deux (position paire) en partant de la droite vers gauche. Si le résultat donne un nombre à deux chiffres, soustraire 9 pour obtenir un seul chiffre ;
  2. Additionner ensemble tous les numéros obtenus lors de l’étape 1  ;
  3. Additionner tous les chiffres position impaire de droite à gauche ;
  4. Additionner les résultats des étapes 2 et 3 ;
  5. Si le résultat de l’étape 4 est divisible par 10, le numéro SIREN testé est valide sinon, il est invalide.

Cet algorithme est assez simple à programmer.

>>> Autre exemple d’application de l’algorithme de Luhn : contrôle de la validité d’un numéro de Sécurité sociale / calcul du numéro de TVA intracommunautaire à partir d’un numéro SIREN.

Requête SQL de contrôle de la validité du numéro SIREN

La requête ci-après permet de calculer instantanément (y compris sur des tables de plusieurs milliers de tiers) la validité des numéros SIREN. Je l’ai implémentée sur mon projet PADoCC_Ecritures (programme d’analyse des données comptables de groupes de sociétés). Les balances auxiliaires enrichies (lien vers les informations juridiques Pappers, les publicités légales, les cotations…) comprennent maintenant un test de validité des numéros SIREN figurant dans les fiches tiers :

PADoCC_Ecritures - BAUX avec cotation et infos jur

Avant de vérifier la clef SIREN, la requête commence par vérifier que le numéro SIREN est bien un nombre sur neuf positions : IIf([SIREN] Is Not Null,IIf([SIREN] Like ‘#########’.

La requête vérifie la somme de contrôle de chaque numéro SIREN de la table _BAUX (balances auxiliaires du groupe) en respectant les différentes étapes de l’algorithme de Luhn :

  • Doubler un chiffre sur deux (position paire) en partant de la droite vers gauche (Mid([SIREN],8,1)*2...). Si le résultat donne un nombre à deux chiffres (IIf(Mid([SIREN], 8, 1)*2>9), soustraire 9 pour obtenir un seul chiffre ;
  • Additionner ensemble tous les numéros obtenus lors de l’étape 1  :
Mid([SIREN], 8, 1)*2-IIf(Mid([SIREN], 8, 1)*2>9,9,0)
+Mid([SIREN], 6, 1)*2-IIf(Mid([SIREN], 6, 1)*2>9,9,0)
+Mid([SIREN], 4, 1)*2-IIf(Mid([SIREN], 4, 1)*2>9,9,0)
+Mid([SIREN], 2, 1)*2-IIf(Mid([SIREN], 2, 1)*2>9,9,0)
  • Additionner tous les chiffres position impaire de droite à gauche : Mid([SIREN], 9, 1)
  • Additionner les résultats des étapes 2 et 3 ;
  • Si le résultat de l’étape 4 est divisible par 10 (Mod 10=0), le numéro SIREN testé est valide sinon, il est invalide.

IIf(condition,action1,action2) est une structure de test conditionnel. Un test conditionnel permet de n’exécuter une instruction ou un ensemble d’instructions que si une ou plusieurs conditions sont remplies. Plus d’infos : Tests conditionnels dans des requêtes SQL.

La fonction MID(chaîne,position,longueur) renvoie un extrait de la chaîne à partir du caractère situé à la position position et sur le nombre de caractères désigné par longueur ; ainsi MID(“542065479”,8,1) retourne “7”.

L’opérateur MOD renvoie le reste d’une division. Plus d’infos sur les opérateurs arithmétiques.

La requête renvoie les messages suivant dans le champ SIREN_Valide créé à cet effet :

  • Vide (Null) : si numéro SIREN absent ;
  • Format incorrect : si le numéro SIREN n’est pas un nombre composé de neuf chiffres ;
  • Non valide : si la clef calculée par la requête ne correspond pas au numéro SIREN ;
  • Valide : la clef SIREN est valide.

SIREN SQL

>>> Pour tester la validité d’un numéro SIREN avec Excel (VBA), cliquer ici.

Code-source de la requête SQL :

SELECT CompteAuxNum, SIREN, 
IIf([SIREN] Is Not Null,IIf([SIREN] Like '#########', 
IIf((Mid([SIREN], 8, 1)*2-IIf(Mid([SIREN], 8, 1)*2>9,9,0)
+Mid([SIREN], 6, 1)*2-IIf(Mid([SIREN], 6, 1)*2>9,9,0)
+Mid([SIREN], 4, 1)*2-IIf(Mid([SIREN], 4, 1)*2>9,9,0)
+Mid([SIREN], 2, 1)*2-IIf(Mid([SIREN], 2, 1)*2>9,9,0)
+Mid([SIREN], 9, 1)
+Mid([SIREN], 7, 1)
+Mid([SIREN], 5, 1)
+Mid([SIREN], 3, 1)
+Mid([SIREN], 1, 1)) Mod 10=0, 'Valide', 'Non valide'), 'Format incorrect'), Null) AS SIREN_Valide
FROM _BAUX;

A noter, cette requête ne vérifie pas l’existence du numéro SIREN mais seulement la cohérence entre les huit premiers chiffres et la clef de contrôle.

Découvrir les requêtes SQL : Analyse de données et automatisation avec Excel et Access (9ème volet)

Volet 9 SQL

___

Approfondir le sujet : SIREN / Information légale des entreprises

Share Button
The following two tabs change content below.
Après seize années passées en cabinet d’expertise-comptable et de commissariat aux comptes (où j’ai exercé comme expert-comptable et chef de mission audit), j’ai pris le poste de directeur comptable d’un groupe de distribution automobile en novembre 2014. Au cours de ma carrière, j’ai acquis une expérience significative en audit et en exploitation des systèmes d’information (analyse de données, automatisation des tâches, programmation informatique) au service de la production des comptes annuels et consolidés. C’est cette expérience personnelle et ma passion pour l’informatique que je partage sur ce blog. Mon CV / Réalisations personnelles et projets informatiques / Ma collection / Me contacter

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.