加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

SQLServer2005 身份证函数,含验证和15位转18位

发布时间:2020-12-12 16:02:04 所属栏目:MsSql教程 来源:网络整理
导读:Author: 水如烟 SQLServer2005 身份证函数,含验证和15位转18位 USE ? [ LzmTWWorks ] GO /* *****?对象:??UserDefinedFunction?[Helper].[IDCard]????脚本日期:?12/07/2007?23:21:37?***** */ SET ?ANSI_NULLS? ON GO SET ?QUOTED_IDENTIFIER? ON GO CREATE

Author:水如烟

SQLServer2005 身份证函数,含验证和15位转18位

USE ? [ LzmTWWorks ]
GO
/* *****?对象:??UserDefinedFunction?[Helper].[IDCard]????脚本日期:?12/07/2007?23:21:37?***** */
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

使用用下列语句,可以列出所有不符的身份证号码.

SELECT
?????
[ 姓名 ]
????,
[ 身份证号 ]
????,b.
*
FROM ? [ EmployeeWorks ] . [ Base ] . [ 职员 ] ?
CROSS ?APPLY? [ LzmTWWorks ] . [ Helper ] . [ IDCard ] (身份证号)?b
WHERE ? NOT ? [ 身份证号 ] ? IS ? NULL ? AND ?Valid? = ? 0

20071217 补充一些信息

USE ? [ LzmTWWorks ]
GO
set ?ANSI_NULLS? ON
set ?QUOTED_IDENTIFIER? ON
GO
ALTER ? FUNCTION ? [ Helper ] . [ IDCard ] ?
(
????
@Card ???? varchar ( 18 )
)
RETURNS ?
@TCard ? TABLE ?
(
?????Input????
varchar ( 18 )
????,Sex????
bit
????,Birthday?
varchar ( 8 )
????,Region????
varchar ( 6 )
????,RegionName?
nvarchar ( 50 )
????,RegionFullName?
nvarchar ( 100 )
????,Valid????
bit
)
AS
BEGIN
????
DECLARE ????
?????????????
@Input ???????? varchar ( 18 )
????????????,
@IDCard ???? varchar ( 18 )
????????????,
@Sex ???????? bit
????????????,
@Birthday ???? varchar ( 8 )
????????????,
@Region ???? varchar ( 6 )
????????????,
@RegionName ? varchar ( 50 )
????????????,
@RegionFullName ? varchar ( 100 )
????????????,
@Valid ???????? bit

????
DECLARE ?????
?????????????
@Length ???? as ? smallint
????????????,?
17 )? /* 取前17位 */
????????????
SET ? @IsOld ? = ? 0
????????
END

????
SET ? @Birthday ? = ? SUBSTRING ( @TmpCard ,? 1 )? /* 校验 */
????????????
SET ? @Valid ? = ? 1

????
-- 无论正确与否,都给出有效身份证号码
???? SET ? @IDCard ? = ? @tmpCard

????
-- 取其它信息
???? SET ? @Sex ? = ? SUBSTRING ( @tmpCard ,? 17 ,? 1 )? % ? 2

????
SET ? @Region ? = ? SUBSTRING ( @tmpCard ,? 1 ,? 6 )

????
SELECT ?
?????????
@RegionName ? = ? [ Name ]
????????,
@RegionFullName ? = ? [ Full ]
????
FROM ? [ Helper ] . [ RegionCodeFullName ] ( Default ,? @Region )? /* 从最新版本数据中取区域信息 */

????
IF ? @RegionName ? IS ? NULL
????
BEGIN
????????
DECLARE ? @FirstDate ? varchar ( 8 )? /* 第一代身份证的区划码,有许多现在已经不用了。为此,要从最旧版本数据中取区域信息 */

????????
SELECT ? @FirstDate ? = ? MIN (FirstDate)?
????????
FROM ? [ Private ] . [ RegionCode ] ????
????
????????
SELECT ?
?????????????
@RegionName ? = ? [ Name ]
????????????,
@RegionFullName ? = ? [ Full ]
????????
FROM ? [ Helper ] . [ RegionCodeFullName ] (
?????????????
@FirstDate
????????????,
@Region )????
????
END

Finish:
????
INSERT ? INTO ? @TCard ?
????
VALUES (?
?????????
@Input
????????,
@IDCard
????????,
@Sex
????????,
@Birthday
????????,
@Region
????????,
@RegionName
????????,
@RegionFullName
????????,
@Valid )????
????
RETURN ?
END

示例:

SELECT ? * ? FROM ? [ LzmTWWorks ] . [ Helper ] . [ IDCard ] ?( ' 110116200808080010 ' )

/*
Input??????????????IDCard?????????????Sex???Birthday?Region?RegionName???RegionFullName????Valid
------------------?------------------?-----?--------?------?------------?--------------?-----
110116200808080010?110116200808080014?1?????20080808?110116?怀柔区???????北京市怀柔区????0

*/

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读