Como determinar se uma variável é numérica no SQL Server

Problema do aluno: Trabalho com SQL Server e preciso validar se um campo de tabela, com o datatype varchar(14), é numérico. Usei o isNumeric(campo), mas ele retorna 1 (numérico) quando o valor do campo é ‘1e2' ou ‘1d2', dentre alguns outros.

Solução: Primeiro, faremos um pequeno teste usando a função isNumeric:

DECLARE @X VARCHAR(14)
SET @X = ‘1000'
SELECT @X AS ‘VALOR’, ISNUMERIC(@X) AS ‘NUMÉRICO?’, CONVERT(INT, @X) AS ‘INTEIRO’, CONVERT(FLOAT, @X) AS ‘FLOAT’
SET @X = ‘ABC’
SELECT @X AS ‘VALOR’, ISNUMERIC(@X) AS ‘NUMÉRICO?’, ‘NÃO CONVERTE’ AS ‘INTEIRO’, ‘NÃO CONVERTE’ AS ‘FLOAT’
SET @X = ‘1D5'
SELECT @X AS ‘VALOR’, ISNUMERIC(@X) AS ‘NUMÉRICO?’, ‘NÃO CONVERTE’ AS ‘INTEIRO’, CONVERT(FLOAT, @X) AS ‘FLOAT’
SET @X = ‘2E2'
SELECT @X AS ‘VALOR’, ISNUMERIC(@X) AS ‘NUMÉRICO?’, ‘NÃO CONVERTE’ AS ‘INTEIRO’, CONVERT(FLOAT, @X) AS ‘FLOAT’
SET @X = ‘1.7E3'
SELECT @X AS ‘VALOR’, ISNUMERIC(@X) AS ‘NUMÉRICO?’, ‘NÃO CONVERTE’ AS ‘INTEIRO’, CONVERT(FLOAT, @X) AS ‘FLOAT’
SET @X = ‘2.1E-3'
SELECT @X AS ‘VALOR’, ISNUMERIC(@X) AS ‘NUMÉRICO?’, ‘NÃO CONVERTE’ AS ‘INTEIRO’, CONVERT(FLOAT, @X) AS ‘FLOAT’

isnumeric.gif

 

Mas o que significa 1.234D3 ou 1.234E3? É notação científica, uma das formas de representar um valor numérico, inteiro ou não. 1.234D3 equivale a 1.234 x 103.

Sabendo isso, ficou fácil criar uma função que além de verificar se a variável é numérica, valide, também se nela existe algum caractere:

CREATE FUNCTION ISNUMERO
(
      @X VARCHAR(14)
)
      RETURNS INT
AS
BEGIN
      DECLARE
@Y INT
      SET @Y = 0
      IF ISNUMERIC(@X)=1 AND @X NOT LIKE ‘%[A-Z]%’
      SET @Y = 1
      RETURN @Y
END

Para testar, é só executar a procedure:

SELECT DBO.ISNUMERO(‘50'), DBO.ISNUMERO(‘1D2')