科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道SQL 2005身份证函数包含验证和15位转18位

SQL 2005身份证函数包含验证和15位转18位

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

本文主要介绍了SQL Server 2005的身份证函数,其中包含验证和15位转18位。

作者:赛迪网 301331 来源:天新网 2008年3月24日

关键字: 数据库 SQL Server Mssql SQL

  • 评论
  • 分享微博
  • 分享邮件

本文主要介绍了SQL Server 2005的身份证函数,其中包含验证和15位转18位。

具体示例代码如下:

USE [LzmTWWorks]
GO
/****** 对象:  UserDefinedFunction [Helper].[IDCard]    脚本日期: 12/13/2007 19:16:33 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE FUNCTION [Helper].[IDCard] 
(
    @Card    varchar(18)
)
RETURNS 
@TCard TABLE 
(
     Input    varchar(18)
    ,IDCard    varchar(18)
    ,Valid    bit
)
AS
BEGIN
    DECLARE    
             @Input        as varchar(18)
            ,@IDCard    as varchar(18)
            ,@Valid        as 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

    DECLARE @Birthday    varchar(8)
    SET @Birthday = SUBSTRING(@TmpCard, 7, 8)
    IF ISDATE(@birthday) = 0 GOTO Finish /*非日期*/

    --前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
                    WHEN 17 THEN 2
                END

            SET @Sum = @Sum + @Num * @WI
            SET @Index = @Index + 1
        END

    --模11
    DECLARE @Mod as tinyint
    SET @Mod = @Sum % 11

    --校验码
DECLARE @Parity as varchar(1)
SELECT @Parity =
CASE @Mod
WHEN 0 THEN '1'
WHEN 1 THEN '0'
WHEN 2 THEN 'X'
WHEN 3 THEN '9'
WHEN 4 THEN '8'
WHEN 5 THEN '7'
WHEN 6 THEN '6'
WHEN 7 THEN '5'
WHEN 8 THEN '4'
WHEN 9 THEN '3'
WHEN 10 THEN '2'
END

--完整的18位身份证号码
SET @TmpCard = @TmpCard + @Parity

IF @IsOld = 1
SET @Valid = 1
ELSE 
IF @Parity = RIGHT(@Input, 1) /*校验*/
SET @Valid = 1

--无论对错,都给出有效身份证号码
SET @IDCard = @tmpCard

Finish:
    INSERT INTO @TCard VALUES(@Input, @IDCard, @Valid)    
    RETURN 
END
    • 评论
    • 分享微博
    • 分享邮件
    闂傚倸鍊风欢锟犲矗鎼淬劌绐楅柡鍥╁亹閺嬪酣鏌曡箛瀣仾濠殿垰銈搁弻鏇$疀鐎n亖鍋撻弽顓ㄧ稏闁跨噦鎷�

    婵犵數濮烽。浠嬪焵椤掆偓閸熷潡鍩€椤掆偓缂嶅﹪骞冨Ο璇茬窞闁归偊鍓涢悾娲⒑闂堟单鍫ュ疾濠婂嫭鍙忔繝濠傜墛閸嬨劍銇勯弽銊с€掗柟钘夊暣閺岀喖鎮滈埡鍌涚彋閻庤娲樺畝绋跨暦閸洖鐓涢柛灞剧矋濞堟悂姊绘担绛嬪殐闁搞劋鍗冲畷銏ゅ冀椤愩儱小闂佹寧绋戠€氼參宕伴崱妯镐簻闁靛牆鎳庢慨顒€鈹戦埥鍡椾簼婵犮垺锚铻炴俊銈呮噺閸嬪倹绻涢崱妯诲碍閻庢艾顦甸弻宥堫檨闁告挾鍠庨锝夘敆娓氬﹦鐭楁繛鎾村焹閸嬫捇鏌e☉娆愬磳闁哄本绋戦埞鎴﹀川椤曞懏鈻婄紓鍌欑劍椤ㄥ懘鎯岄崒鐐靛祦閹兼番鍔岄悞鍨亜閹烘垵顏╅悗姘槹閵囧嫰寮介妸褎鍣ョ紓浣筋嚙濡繈寮婚悢纰辨晣鐟滃秹鎮橀懠顒傜<閺夊牄鍔庣粻鐐烘煛鐏炶姤鍠橀柡浣瑰姍瀹曠喖顢橀悩铏钒闂備浇宕垫慨鎶芥⒔瀹ュ鍨傞柦妯猴級閿濆绀嬫い鏍ㄧ☉濞堟粓姊虹涵鍛【妞ゎ偅娲熼崺鈧い鎺嗗亾闁挎洩濡囧Σ鎰板籍閸繄顓洪梺缁樺姇瀵剙螖閸涱喚鍘搁梺鍓插亽閸嬪嫰鎮橀敃鍌涚厱閻庯綆鍋嗘晶顒傜磼閸屾稑绗ч柟鐟板閹煎湱鎲撮崟闈涙櫏闂傚倷绀侀幖顐も偓姘卞厴瀹曞綊鏌嗗鍛紱閻庡箍鍎遍ˇ浼村磿瀹ュ鐓曢柡鍥ュ妼婢ь垰霉閻樿秮顏堟箒闂佹寧绻傚Λ妤呭煝閺囥垺鐓冪憸婊堝礈濮樿泛钃熼柕濞у嫷鍋ㄩ梺缁樺姇椤曨參鍩㈤弴銏″€甸柨婵嗗€瑰▍鍥ㄣ亜韫囨稐鎲鹃柡灞炬礋瀹曢亶顢橀悢濂変紦

    重磅专题
    往期文章
    最新文章