1. 程式人生 > 資料庫 >在sql server中使用儲存過程驗證身份證號碼是否合法

在sql server中使用儲存過程驗證身份證號碼是否合法

原文連結:

 

在一些人員資訊收錄的系統中,可能會要求填入人員的身份證號碼,但要怎麼來驗證填入的身份證號碼的格式是否合法呢。我們將驗證的sql寫成一個儲存過程,以方便重複呼叫。

首先我們要清楚我國身份號碼的組成規則:
1,18位身份證號碼的組成:6位地區編碼+8位出生年月日+3位編號(奇數代表男,偶數代表女)+1位校驗碼
2,15位身份證號碼的組成:6位地區編碼+6位出生年月日+3位編號(奇數代表男,偶數代表女)

下面是該儲存過程的所有sql:

Create FUNCTION [dbo].[udf_IsvalidIDCard]
(
@IDCardNo varchar(50)=''
)
RETURNS bit
AS
/*******************************************************************
函式名稱:udf_IsvalidIDCard()
引數:@IDCardNo string 身份證號碼
返回值:  bit 是否有效
功能描述:判斷身份證號碼是否合法

備註:目前中國的身份證號碼有18位和15位.
1,18位身份證號碼的組成:6位地區編碼+8位出生年月日+3位編號(奇男偶女)+1位校驗碼
2,15位身份證號碼的組成:6位地區編碼+6位出生年月日+3位編號(奇男偶女)
*******************************************************************/
BEGIN

declare @Length int, 
@Loop int, 
@Sum int
declare @SingleChar char

set @Sum = 0
if @IDCardNo is null or @IDCardNo = null or ltrim(rtrim(@IDCardNo)) = ''
begin
return 0
end

set @Length = len(@IDCardNo)
--判斷位數
if @Length < > 18 and @Length < > 15
begin
return 0    
end
if @Length = 18
begin
if isnumeric(left(@IDCardNo, 17)) = 0
begin    
return 0
end
if isdate(substring(@IDCardNo, 7, 4) + '-' + substring(@IDCardNo, 11, 2) + '-' + substring(@IDCardNo, 13, 2)) = 0 
begin
return 0
end
set @Loop = 17
while (@Loop  >= 1)
begin
set @Sum = @Sum + convert(int,substring(@IDCardNo, @Loop, 1)) * (power(2,(18 - @Loop)) % 11)
set @Loop = @Loop - 1
end
set @Loop = @Sum % 11
if @Loop = 0
      begin
set @SingleChar = '1'
end
      else if @Loop = 1
begin
set @SingleChar = '0'
end
      else if @Loop = 2
begin
set @SingleChar = 'X'
end
      else
begin
set @SingleChar = convert(varchar(2),(12 - @Loop))
end
if lower(Right(@IDCardNo, 1)) < > lower(@SingleChar)
begin
return 0
end
end
else if @Length = 15
begin
if isnumeric(@IDCardNo) = 0
begin
return 0
end    
if isdate('19' + substring(@IDCardNo, 7, 2) + '-' + substring(@IDCardNo, 9, 2) + '-' + substring(@IDCardNo, 11, 2)) = 0 
begin
return 0
end
end

return 1

END


建立完畢後,我們可以使用以下sql呼叫來測試是否正確:

declare @result bit
exec @result=dbo.udf_IsvalidIDCard '身份證號碼'
select @result

返回1,代表身份證號碼正確,
返回0,代表身份證號碼錯誤。

簡單講解一下以上用到的系統函式意思:
POWER函式:返回給定表示式的指定冪的值。
比如:select POWER(2,3),就返回2的3次冪,即8

LOWER函式:將大寫字元資料轉換成小寫後返回字元表示式。
比如:select LOWER('ABC'),返回'abc'

substring函式:返回 $sourceString 的子串,從 $startingLoc 指定的位置開始,長度為 $length 指定的字元數。

比如:select substring('abcd',1,2),返回'ab'
注意:該函式非常有趣
1,$sourceString引數的索引從1開始計。
2,如果你是從0位置開始取值,也不會錯,但只會返回'a'
3,如果你是從-1位置開始取值,也不會錯,但返回空,但把$length資料填大一些,又會返回值了。
從上面的測試應該可以得出,如果$startingLoc小於或等於0,那麼,substring的引數變成了
string($sourceString ,1,$length-1+$startingLoc )
即select substring('abcd',0,2)==select substring('abcd',1,1),
select substring('abcd',-1,2)==select substring('abcd',1,2-1+(-1))
select substring('abcd',-1,3)==select substring('abcd',1,3-1+(-1))
不確定公式就是這樣的,但返回結果和這個是一樣的。

isdate函式:確定輸入表示式是否為有效日期。

ISNUMERIC函式:確定表示式是否為有效的數值型別。

CONVERT函式:將一種資料型別的表示式顯式轉換為另一種資料型別的表示式。