OVH Cloud OVH Cloud

Technique Méta données

2 réponses
Avatar
Jean-Yves
Bonjour à tous ,

J'ai mis en place dans une de mes bases la technique dite des Méta données
(http://sqlpro.developpez.com/cours/modelisation/metadonnees/)

Je voudrais dans le trigger de la table où sont stockées les valeurs des
caractéristiques effectuer un contrôle
de validité de la saisie et notament vérifier les données de type INT .

Pour celà j'utilise le test suivant ISNUMERIC(CLO_VALEUR)=0 mais c'est
insuffisant car les valeur décimales sont permises.

Pour résumer , est-ce quelqu'un sait comment contrôler la validité d'un INT
stocké dans un champ de type varchar(x) ?

Merci d'avance

Jean-Yves

2 réponses

Avatar
Bouarroudj Mohamed
Pourquoi ne pas simplement ajouter un autre test

if ISNUMERIC(CLO_VALEUR)=0 and CHARINDEX('.',CLO_VALEUR)=0

Reste que ce type de validation doit se faire au niveau du client et non par
le serveur !

---
Mohamed bouarroudj
http://www.sqldbtools.com/
---


"Jean-Yves" <jeanyves.rancurel@(supprimerceci)vishay.com> wrote in message
news:%
Bonjour à tous ,

J'ai mis en place dans une de mes bases la technique dite des Méta données
(http://sqlpro.developpez.com/cours/modelisation/metadonnees/)

Je voudrais dans le trigger de la table où sont stockées les valeurs des
caractéristiques effectuer un contrôle
de validité de la saisie et notament vérifier les données de type INT .

Pour celà j'utilise le test suivant ISNUMERIC(CLO_VALEUR)=0 mais c'est
insuffisant car les valeur décimales sont permises.

Pour résumer , est-ce quelqu'un sait comment contrôler la validité d'un
INT
stocké dans un champ de type varchar(x) ?

Merci d'avance

Jean-Yves






Avatar
SQLpro [MVP]
Bonjour,

Jean-Yves a écrit :
Bonjour à tous ,

J'ai mis en place dans une de mes bases la technique dite des Méta données
(http://sqlpro.developpez.com/cours/modelisation/metadonnees/)

Je voudrais dans le trigger de la table où sont stockées les valeurs des
caractéristiques effectuer un contrôle
de validité de la saisie et notament vérifier les données de type INT .

Pour celà j'utilise le test suivant ISNUMERIC(CLO_VALEUR)=0 mais c'est
insuffisant car les valeur décimales sont permises.

Pour résumer , est-ce quelqu'un sait comment contrôler la validité d'un INT
stocké dans un champ de type varchar(x) ?



Avec une UDF par exemple :

CREATE FUNCTION F_IS_INTEGER (@DATA VARCHAR(8000))
RETURNS BIT
AS

BEGIN

IF @DATA IS NULL RETURN NULL;
IF @DATA = '' RETURN 0;

SET @DATA = LTRIM(@DATA);

DECLARE @C CHAR(1), @I INT, @OK BIT, @SIGN BIT;
SET @I = 1;
SET @SIGN = 0;
SET @OK = 1;

WHILE @I <= LEN(@DATA)
BEGIN
-- chiffre de 0 à 9 OK
SET @C = SUBSTRING(@DATA, @I, 1)
IF @C BETWEEN '0' AND '9'
BEGIN
SET @I = @I + 1;
SET @SIGN = 0;
CONTINUE;
END;
-- signe + ou - en première position : OK
IF (@C IN ('+', '-') AND @I = 1)
BEGIN
SET @SIGN = 1;
SET @I = @I + 1;
CONTINUE;
END;
-- espace(s) après le signe : OK
IF @C = ' ' AND @SIGN = 1
BEGIN
SET @I = @I + 1;
CONTINUE;
END;
SET @OK = 0;
BREAK;
END;

RETURN @OK;

END

GO

Exemples d'utilisation :

SELECT '+ 123456' IS_INT, dbo.F_IS_INTEGER('+ 123456') AS F_IS_INTEGER
UNION ALL
SELECT '- 123456' IS_INT, dbo.F_IS_INTEGER('- 123456')
UNION ALL
SELECT '+ 123 456' IS_INT, dbo.F_IS_INTEGER('+ 123 456')
UNION ALL
SELECT '123.456' IS_INT, dbo.F_IS_INTEGER('123.456')
UNION ALL
SELECT 'sdvsdqv' IS_INT, dbo.F_IS_INTEGER('sdvsdqv')
UNION ALL
SELECT '365132' IS_INT, dbo.F_IS_INTEGER('365132')


IS_INT F_IS_INTEGER
--------- ------------
+ 123456 1
- 123456 1
+ 123 456 0
123.456 0
sdvsdqv 0
365132 1


A +



Merci d'avance

Jean-Yves




pas de quoi !

C'est dans le cadre du SAV... ;-)

--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
********************* http://www.datasapiens.com ***********************