SQL函數驗證身份證號碼是否有效

-- =============================================
-- 作 者: 黃江華
-- 日 期: 2008-05-27
-- 描 述: 身份證號碼是否有效
-- 備 注:
--          身份證號只有15或18位
--          如果是15位身份證 則只驗證日期和是否數字格式
--          18位身份證 驗證日期 校驗位   
-- =============================================
IF  EXISTS (SELECT * FROM sys.objects
WHERE object_id = OBJECT_ID(N'dbo.fun_IsValidID')
 AND type in ('IF', 'FN', 'TF'))
DROP FUNCTION dbo.fun_IsValidID
GO

CREATE FUNCTION dbo.fun_IsValidID(@ID Varchar(18))
 -- Add the parameters for the stored procedure here
 RETURNS BIT
AS
BEGIN
  DECLARE @ValidFactors VARCHAR(17),
    @ValidCodes VARCHAR(11),
          @I TINYINT,
          @iTemp INT

  --位數不滿足則爲非法ID

  IF Len(@ID) <> 15 AND Len(@ID) <> 18
 RETURN(0);

  --如果是15位身份證 則只驗證日期和是否數字格式
  IF LEN(@ID)=15
    IF ISDATE('19'+SUBSTRING(@ID,7,6))=0 OR ISNUMERIC(@ID)=0
      RETURN(0);
    ELSE
      RETURN(1);

  /*18位身份證 驗證日期 校驗位 */

    --驗證日期和前17位是否數字格式
  IF ISDATE(SUBSTRING(@ID,7,8))=0 OR ISNUMERIC(SUBSTRING(@ID,1,17))=0
 RETURN(0);

 --驗證校驗位開始
  SELECT @ValidFactors='79A584216379A5842',
   @ValidCodes='10X98765432',
      @I=1,@iTemp=0

  WHILE @i<18
  BEGIN
 SELECT
   @iTemp=@iTemp+CAST(SUBSTRING(@ID,@i,1) AS INT)*(CASE SUBSTRING(@validFactors,@i,1) WHEN 'A' THEN 10 ELSE SUBSTRING(@ValidFactors,@i,1) END)
   ,@i=@i+1
  END
  IF SUBSTRING(@ValidCodes,@iTemp%11+1,1)=RIGHT(@ID,1)
    RETURN(1);
  ELSE
    RETURN(0);
 
  RETURN NULL;
END
發佈了78 篇原創文章 · 獲贊 8 · 訪問量 17萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章