WEB开发网
开发学院数据库MSSQL Server 身份证验证 阅读

身份证验证

 2007-11-11 09:57:36 来源:WEB开发网   
核心提示:alter function dbo.IDTrue--验证十八位身份证是否正确( @ID varchar(18))returns bitas begin--验证格式是否正确declare @RES bitdeclare @W table (rn int,val int)insert into @W(rn


alter  function  dbo.IDTrue--验证十八位身份证是否正确
(
  @ID  varchar(18)
)
returns  bit
as
begin
--验证格式是否正确
declare  @RES bit
declare  @W table  (rn int,val int)
insert into  @W(rn,val)
select 1,7
union select 2,9
union select 3,10
union select 4,5
union select 5,8
union select 6,4
union select 7,2
union select 8,1
union select 9,6
union select 10,3
union select 11,7
union select 12,9
union select 13,10
union select 14,5
union select 15,8
union select 16,4
union select 17,2
union select 18,1
declare  @A  table (rwn int  ,val varchar(1))
insert into @A(rwn,val)
select  0,'1'
insert into @A(rwn,val)
select  1,'0'
insert into @A(rwn,val)
select  2,'X'
insert into @A(rwn,val)
select  3,'9'
insert into @A(rwn,val)
select  4,'8'
insert into @A(rwn,val)
select  5,'7'
insert into @A(rwn,val)
select  6,'6'
insert into @A(rwn,val)
select  7,'5'
insert into @A(rwn,val)
select  8,'4'
insert into @A(rwn,val)
select  9,'3'
insert into @A(rwn,val)
select  10,'2'
declare  @i int
declare  @j int
declare  @S  int

if len(@ID)=18
  begin
  select  @S=0,@i=1
  declare  @IDI int
  declare  @WI int
  declare  @PII  varchar(1)
  while   @i<=17
   begin
    select  @PII=substring(@ID,@i,1)
    if   @PII like  '[0-9]'
     begin
     select  @IDI=convert(int,@PII)
     select  @WI=val from @W where  rn=@i
     select  @j=@IDI*@WI
     select  @S=@S+@j
     select  @i=@i+1
     end
    else
     begin
        select  @RES=0
        return  @RES
     end

end
  select @S=@S % 11
  select  @IDI=convert(int,substring(@ID,18,1))
  declare  @pi  varchar(1)
  select  @pi=val from  @A where  rwn =@S 
  if  @pi=@IDI
    select  @RES=1
  else
    select  @RES=0
  end
 else
  begin
   select  @RES=0
  end
return  @RES
end
go
declare  @pc  bit
select  @pc=dbo.IDTrue('420324198101031224')
select  @pc
go

alter function   SFZ15To18--十五位升十八
  (
  @sfz varchar(15)
  )
 returns  varchar(18)
as
 begin
 declare  @W table  (rn int,val int)
insert into  @W(rn,val)
select 1,7
union select 2,9
union select 3,10
union select 4,5
union select 5,8
union select 6,4
union select 7,2
union select 8,1
union select 9,6
union select 10,3
union select 11,7
union select 12,9
union select 13,10
union select 14,5
union select 15,8
union select 16,4
union select 17,2
union select 18,1
declare  @A  table (rwn int  ,val varchar(1))
insert into @A(rwn,val)
select  0,'1'
insert into @A(rwn,val)
select  1,'0'
insert into @A(rwn,val)
select  2,'X'
insert into @A(rwn,val)
select  3,'9'
insert into @A(rwn,val)
select  4,'8'
insert into @A(rwn,val)
select  5,'7'
insert into @A(rwn,val)
select  6,'6'
insert into @A(rwn,val)
select  7,'5'
insert into @A(rwn,val)
select  8,'4'
insert into @A(rwn,val)
select  9,'3'
insert into @A(rwn,val)
select  10,'2'
declare  @NEWID  varchar(18)
select  @NEWID=substring(@sfz,1,6)+'19'+substring(@sfz,7,9)
declare  @i int
declare  @j int
declare  @S  int
select  @S=0,@i=1
declare  @IDI int
declare  @WI int
declare  @PII  varchar(1)
while  @i<=17
  begin
     select  @PII=substring(@NEWID,@i,1)
     if   @PII like  '[0-9]'
     begin
      select  @IDI=convert(int,@PII)
      select  @WI=val from @W where  rn=@i
      select  @j=@IDI*@WI
      select  @S=@S+@j
      select  @i=@i+1
     end
     else
     begin
      return ''
     end
  end
 select @S=@S % 11
 declare  @pi  varchar(1)
 select  @pi=val from  @A where  rwn =@S
 select  @NEWID=@NEWID+@pi
 return  @NEWID

 end
go
select  dbo.SFZ15To18('420324810103153')
go
--日期是否正确
alter function  ChkYMD(
  @y int,
  @m tinyint,
  @d tinyint,
  @cy int
)
returns bit
as
begin
  declare  @res bit
  select  @res=1
  if  @y<1900 or  @y>@cy
   begin
      select  @res=0
      return @res
   end
  if  @m=1 or @m=3 or @m=5 or @m=7 or @m=8 or @m=10 or @m=12 
   begin
     if (@d<1) or  (@d>31)
      begin
       select  @res=0
       return  @res
      end
   end
 
  if  @m=2
   begin
    if ((@y%4)=0) and ((@y % 100)<>0)  or ( (@y % 400)=0 )
        begin--闰年
         if (@d<1) or (@d>29) 
          begin
             select  @res=0
             return @res
          end
        end else
        begin
         if  (@d<1) or (@d>28)
          begin
             select  @res=0
             return @res
          end
        end
  
   end
  if  @m=4 or @m=6 or @m=9 or @m=11
   begin
      if (@d<1) or (@d>30) 
          begin
             select  @res=0
             return @res
          end
   end
   return @res
     
end
go
select  dbo.chkymd(1981,1,3,Year(getdate()))
go
/*
y:年,m:月,d:日。在参数都只传入相应的整数
返回值:0  星期一
    1  星期2
    2  星期3
    3  星期4
    4 星期5
    5 星期6
    6 星期7
*/

alter function  GetWeekDay(
@y  int,
@m int,
@d int
)
returns tinyint
as
begin
  declare  @a tinyint
  select  @a=7
  if  @m=1 or @m=2
   begin
     select  @m=@m+12
     select  @y=@y-1
   end
  select @a=(@d+2*@m+3*(@m+1)/5+@y+@y/4-@y/100+@y/400)%7;
  return @a
end
go
select  dbo.getweekday(2004,12,10)

Tags:身份证 验证

编辑录入:coldstar [复制链接] [打 印]
赞助商链接