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 |