IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

Vous êtes nouveau sur Developpez.com ? Créez votre compte ou connectez-vous afin de pouvoir participer !

Vous devez avoir un compte Developpez.com et être connecté pour pouvoir participer aux discussions.

Vous n'avez pas encore de compte Developpez.com ? Créez-en un en quelques instants, c'est entièrement gratuit !

Si vous disposez déjà d'un compte et qu'il est bien activé, connectez-vous à l'aide du formulaire ci-dessous.

Identifiez-vous
Identifiant
Mot de passe
Mot de passe oublié ?
Créer un compte

L'inscription est gratuite et ne vous prendra que quelques instants !

Je m'inscris !

SQL Server - Fonction scalaire T-SQL contrôle numéro SIREN ou SIRET
Un tutoriel de hmira

Le , par hmira

0PARTAGES

Je vous présente ci-dessous, une fonction scalaire SQL Server T-SQL, permettant de vérifier au niveau Serveur de base de données si des identifiants SIREN (9 chiffres) ou SIRET (14 chiffres) sont valides ou non.

Cette fonction s'inspire fortement de l'implémentation en T-SQL de l'algorithme de Luhn réalisée par SQLPro.
voir lien ci-dessous pour plus de détails :
http://blog.developpez.com/sqlpro/p7829/langage-sql-norme/controle_de_coherence_par_algorithme_de_

L’algorithme de Luhn est utilisé pour le contrôle des identifiants SIREN ou SIRET dans le cas général, autres que La Poste et ses établissements,

Cette fonction implémente et tient compte également de l'algorithme particulier pour la vérification des identifiants SIREN ou SIRET de La Poste, et ce, depuis que La Poste a changé de statut et qu'elle est devenue une société anonyme.
La Poste est désormais dotée d'un seul SIREN : 356000000 et d'établissements SIRET : 356000000xxxxx

Ce nouvel algorithme de contrôle des identifiants SIREN ou SIRET, spécifique à La Poste, permet d'immatriculer jusqu'à 18000 établissements environ. Pour plus de détails :
http://blog.pagesd.info/post/2012/09/05/verifier-numero-siret-la-poste

Voilà, le but est juste de partager cette fonction avec la communauté. Cette fonction pourra ainsi être utile à d'autres ou servir de base pour le développement d'autres fonctions de contrôle plus spécifiques.

IF NOT EXISTS (SELECT *
FROM dbo.sysobjects
WHERE id = object_id(N'dbo.FC_U_IsValidSiret')
AND xtype IN (N'FN', N'IF', N'TF')
)
EXEC sp_executesql N'CREATE FUNCTION dbo.FC_U_IsValidSiret
( @pi_cSIRET VARCHAR(14) )
RETURNS BIT
AS
BEGIN
RETURN NULL;
END; '
GO


ALTER FUNCTION dbo.FC_U_IsValidSiret
( @pi_cSIRET VARCHAR(14) )
RETURNS BIT
AS
/* ===========================================================================*/
/* dbo.FC_U_IsValidSiret */
/* ===========================================================================*/
/* Société : */
/* Créateur : Hamid MIRA */
/* Date de création : 17/01/2016 */
/* Version associée : 1 */
/* Objet : */
/* - Cette fonction scalaire SQL Server, permet de vérifier si un code SIREN (9 chiffes) */
/* ou SIRET (14 chiffres) est valide ou non. */
/* - Cette fonction s'inspire fortement de l'implémentation en T-SQL de l'algorithme */
/* de Luhn réalisée par SQLPro. voir lien ci-dessous pour plus de détails : */
/* http://blog.developpez.com/sqlpro/p7829/langage-sql-norme/controle_de_coherence_par_algorithme_de_ */
/* - Cette fonction tient compte également de l'algorithme particulier de La Poste */
/* depuis qu'elle a changé de statut et qu'elle est devenue une société anonyme */
/* dotée d'un seul SIREN : 356000000 et des établissement SIRET : 356000000xxxxx */
/* Ce nouvel algorithme spécifique à La Poste permet d'immatriculer jusqu'à 18000 établissements environ */
/* Pour plus de détails : http://blog.pagesd.info/post/2012/09/05/verifier-numero-siret-la-poste */
/* Appelée par : */
/* */
/* Paramètres : @pi_cSIRET VARCHAR(14) Code SIREN ou SIRET à vérifier la validité */
/* Valeur de retour de la fonction (BIT) : */
/* 1 si le code SIREN ou SIRET est un code Valide */
/* 0 si le code SIREN ou SIRET n'est pas un code valide */
/* ===========================================================================*/
BEGIN
-- Valeurs limites
IF @pi_cSIRET IS NULL OR @pi_cSIRET = ''
BEGIN
RETURN NULL;
END;
DECLARE
@iLengthSiret SMALLINT;

SET @iLengthSiret = LEN(@pi_cSIRET);
IF @iLengthSiret <> 9 AND @iLengthSiret <> 14
BEGIN
RETURN 0; -- c.à.d. False
END;

DECLARE
@I TINYINT
, @cChiffre CHAR(1)
, @iSumNombres TINYINT
, @iRang TINYINT
, @bIsSiretLaPoste BIT;

DECLARE
@TableChiffre TABLE
( iRang SMALLINT
, iNombre SMALLINT );

SET @bIsSiretLaPoste = CASE
WHEN LEFT(@pi_cSIRET, 9) = '356000000' AND @iLengthSiret = 14
THEN 1
ELSE 0
END;
SET @I = @iLengthSiret;
SET @iRang = 0;
WHILE @I >= 1
BEGIN
SET @iRang = @iRang+1;
SET @cChiffre = SUBSTRING(@pi_cSIRET, @I, 1);

-- Vérification que la chaine ne contient que des chiffres
IF @cChiffre NOT BETWEEN '0' AND '9'
BEGIN
RETURN 0;
END;
ELSE
BEGIN
INSERT INTO @TableChiffre(
iRang
, iNombre)
VALUES
(
@iRang
, CAST(@cChiffre AS SMALLINT)
);
END;
SET @I = @I-1;
END;
-- Cas général (autre que La Poste)
IF @bIsSiretLaPoste = 0
BEGIN
-- Multiplication par deux des chiffres de rang paire
UPDATE @TableChiffre
SET
iNombre = iNombre*2
WHERE
iRang%2 = 0;
-- Addition des chiffres pour les nombres strictement supérieur à 9
UPDATE @TableChiffre
SET
iNombre = iNombre-9
WHERE
iNombre > 9;
END;
-- Calcul du total des nombres de la table @TableChiffre
SET @iSumNombres = ( SELECT
SUM(iNombre)
FROM @TableChiffre
);
RETURN CASE
-- Cas général (autre que La Poste)
WHEN @bIsSiretLaPoste = 0
THEN CASE
WHEN @iSumNombres%10 = 0
THEN 1
ELSE 0
END
ELSE
-- Case particulier de La Poste
CASE
WHEN @iSumNombres%5 = 0
THEN 1
ELSE 0
END
END;
END;
GO

Exemple d'utilisation

SELECT '73282932000074' AS SIRET, dbo.FC_U_IsValidSiret('73282932000074') AS IsValid -- Code valide
UNION ALL
SELECT '732829320', dbo.FC_U_IsValidSiret('732829320') -- Code valide
UNION ALL
SELECT '356000000', dbo.FC_U_IsValidSiret('356000000') -- Code valide : La Poste
UNION ALL
SELECT '35600000066180', dbo.FC_U_IsValidSiret('35600000066180') -- Code valide : Un établissement de La Poste
UNION ALL
SELECT '39244740402112', dbo.FC_U_IsValidSiret('39244740402112') -- Code invalide !

Résultat :
SIRET IsValid
73282932000074 1
732829320 1
356000000 1
35600000066180 1
39244740402112 0

A+
Hamid MIRA

Vous avez lu gratuitement 322 articles depuis plus d'un an.
Soutenez le club developpez.com en souscrivant un abonnement pour que nous puissions continuer à vous proposer des publications.

Une erreur dans cette actualité ? Signalez-nous-la !