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) ?
"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
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 !
"Jean-Yves" <jeanyves.rancurel@(supprimerceci)vishay.com> wrote in message
news:%2318wTpQZGHA.3424@TK2MSFTNGP02.phx.gbl...
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) ?
"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
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')
-- 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 ***********************
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')
--
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 ***********************
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')
-- 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 ***********************