日期:2014-05-18 浏览次数:20569 次
ALTER FUNCTION [dbo].[CheckIDCard] ( @Card varchar(18) ) RETURNS @TCard TABLE ( Input varchar(18) ,IDCard varchar(18) ,Sex VARCHAR(2) ,Birthday datetime ,BirthdayString VARCHAR(20) ,LunarDate DATETIME ,LunarString VARCHAR(20) ,Region varchar(6) ,RegionName nvarchar(50) ,RegionFullName nvarchar(100) ,Valid bit ) AS BEGIN DECLARE @Input varchar(18) ,@IDCard varchar(18) ,@Sex VARCHAR(2) ,@Birthday DATETIME ,@birthdaystring VARCHAR(20) ,@LunarDate DATETIME ,@LunarString VARCHAR(20) ,@Region varchar(6) ,@RegionName varchar(50) ,@RegionFullName varchar(100) ,@Valid bit DECLARE @Length as smallint ,@TmpCard as varchar(18) ,@IsOld as bit SET @Valid = 0 SET @IDCard = '' SET @Input = '' IF @Card IS NULL GOTO Finish SET @Input = LTRIM(RTRIM(@Card)) /*去空格*/ SET @Length = LEN(@Input) IF NOT @Length IN (15, 18) GOTO Finish /*非15、18位*/ IF @Length = 15 BEGIN IF ISNUMERIC(@Input) = 0 GOTO Finish /*非数字*/ SET @TmpCard = LEFT(@Input, 6) + '19' + RIGHT(@input, 9) /*补充为17位*/ SET @IsOld = 1 END ELSE BEGIN IF ISNUMERIC(LEFT(@Input, 17)) = 0 GOTO Finish /*非数字*/ SET @TmpCard = LEFT(@Input, 17) /*取前17位*/ SET @IsOld = 0 END SET @Birthdaystring = SUBSTRING(@TmpCard, 7, 8) IF ISDATE(@Birthdaystring) = 0 GOTO Finish /*非日期*/ SET @Birthday=CONVERT(DATETIME,SUBSTRING(@birthdaystring,1,4) +'-' + SUBSTRING(@birthdaystring,5,2)+'-'+SUBSTRING(@birthdaystring,7,2)) SELECT @LunarDate=a.LunarDate,@LunarString=a.LunarDateString FROM fn_GetLunar(@Birthday) a --前17位数与相应加权因子的积的和 DECLARE @Sum as smallint ,@WI as tinyint ,@Index as tinyint ,@Num as tinyint SET @Sum = 0 SET @Index = 1 WHILE @Index < 18 BEGIN SET @Num = CAST(SUBSTRING(@TmpCard, @Index, 1) AS tinyint) SELECT @WI = CASE @Index WHEN 1 THEN 7 WHEN 2 THEN 9 WHEN 3 THEN 10 WHEN 4 THEN 5 WHEN 5 THEN 8 WHEN 6 THEN 4 WHEN 7 THEN 2 WHEN 8 THEN 1 WHEN 9 THEN 6 WHEN 10 THEN 3 WHEN 11 THEN 7 WHEN 12 THEN 9 WHEN 13 THEN 10 WHEN 14 THEN 5 WHEN 15 THEN 8 WHEN 16 THEN 4