灯火互联
管理员
管理员
  • 注册日期2011-07-27
  • 发帖数41778
  • QQ
  • 火币41290枚
  • 粉丝1086
  • 关注100
  • 终身成就奖
  • 最爱沙发
  • 忠实会员
  • 灌水天才奖
  • 贴图大师奖
  • 原创先锋奖
  • 特殊贡献奖
  • 宣传大使奖
  • 优秀斑竹奖
  • 社区明星
阅读:1968回复:0

[SQL Server]SqlServer数字类型校验的使用

楼主#
更多 发布于:2012-09-04 18:04


SqlServer ISNUMERIC 校验时认为科学计数法、货币符号均为合法,如果此类数据不加转换
直接插入数据库的float、decimal等字段中是会出异常。以下函数可用于校验字符串是否为数
字类型,仅允许输入+、-、0-9、.字符,包含最大值校验

--参数1:类型varchar 被校验字符串
--参数2:类型int 整数位数长度
--参数3:类型int 小数位数长度,若为负数既不校验小数位数长度
--返回值:类型int  返回"1"既检验正确,"0"既检验不通过(不是有效的数字类型或不符合规定的长度规范
)
if object_id('IS_NUMBER_NEW') is not null
drop  FUNCTION   [dbo].[IS_NUMBER_NEW]  
ALTER FUNCTION [dbo].[IS_NUMBER_NEW]
              (@strVar VARCHAR(100),
               @i INT,
               @j INT)
RETURNS INT
AS
  BEGIN
    IF (ISNUMERIC(@strVar) = 0)--系统函数过滤绝大部分异常数据,但对于科学计数法等无法过滤
      RETURN 0
     ELSE
      BEGIN
        IF (@j = 0)
          BEGIN
            IF (PATINDEX('%[^0-9|+|-]%',@strVar) > 0) --整数校验,只允许+、-、数字字符
              RETURN 0  
          END
         ELSE
          BEGIN
            IF (PATINDEX('%[^0-9|.|+|-]%',@strVar) > 0) --带小数校验
              RETURN 0
          END
        SET @strVar = REPLACE(REPLACE(@strVar,'-',''),'+','')
                      --最大值校验

        IF (CHARINDEX('.',@strVar) = 0)
          BEGIN
            IF (LEN(@strVar) > @i)
              RETURN 0
          END
         ELSE
          BEGIN
            IF ((CHARINDEX('.',@strVar) - 1) > @i)
              RETURN 0
             ELSE
              IF (@j >= 0)
                BEGIN
                  IF (@j - DATALENGTH(SUBSTRING(@strVar,CHARINDEX('.',@strVar) + 1,99)) < 0)
                    RETURN 0
                END
          END
      END
    RETURN 1
  END






喜欢0 评分0
游客

返回顶部