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

Code 'SQL' : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
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

Code 'SQL' : Sélectionner tout
1
2
3
4
5
6
7
8
9
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 :
Code 'SQL : Sélectionner tout
1
2
3
4
5
6
SIRET	IsValid
73282932000074	1
732829320	1
356000000	1
35600000066180	1
39244740402112	0
A+
Hamid MIRA
Vous avez lu gratuitement 1 046 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 !