MSSQL üzerinde TC Numarası Doğrulama Fonksiyonu

MS SQLHer icad iş başa düşünce ortaya çıkarmış misali, elimdeki binlerce kimlik verisinin veritabanı üzerinde sorgulanması ve kontrolü aşamasında TC numaraları için bu güne kadar 2 kontrol tekniğimiz vardı

  1. TC numarası kolonundaki veri BOŞ mu?
  2. TC numarası kolonundaki veri 11 karakter mi?

peki ama ya oradaki veri 11 karakterli olduğu halde hatalı yazılmışsa? O zaman bu bilginin doğru olduğunu nasıl anlayacağız?

Bu soru üzerine oturdum MSSQL üzerinde aşağıdaki  fonksiyonu yazdım.

Bu fonksiyon sayesinde basit bir Select cümleciği ile tüm tablo sorgulanarak hatalı kayıtlara ulaşılabiliniyor.

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:        Burak ŞEKERCİOĞLU
-- Create date: 23.01.2012
-- Description:    TC Numarası Doğrulama Fonksiyonu
-- =============================================
alter FUNCTION fn_tcdogrula
(
@tcno as nvarchar(11)
)
RETURNS int
AS

BEGIN

declare @bilgi10 bit
declare @bilgi11 bit
declare @karakter int
declare @tek int
declare @cift int
declare @cikti int
declare @basamak10 int
declare @basamak11 int
declare @tum int
declare @sonuc bit
set @tek=0
set @cift=0
set @karakter=0
set @sonuc=0
set @cikti=0
set @basamak10=0
set @basamak11=0
set @tum=0
WHILE (@karakter<9)
begin
set @karakter=@karakter +1
if (@karakter % 2=1 )
begin
set @tek = @tek + cast(substring(@tcno,@karakter,1) as int)

end
if (@karakter %  2=0)
begin
set @cift=@cift + cast(substring(@tcno,@karakter,1) as int)
end
end
set @cikti=(@tek * 7 ) - @cift
set @basamak10=@cikti % 10

if (@basamak10 = cast(substring(@tcno,10,1) as int))
begin
set @bilgi10=1
end
set @karakter=0
while (@karakter<10)
begin
set @karakter=@karakter +1
set @tum=@tum + cast(substring(@tcno,@karakter,1) as int)
end
set @basamak11=@tum % 10

if (@basamak11 = cast(substring(@tcno,11,1) as int))
begin
set  @bilgi11=1
end

if (@bilgi10=1 and @bilgi11=1)
begin
set @sonuc=1
end

return @sonuc
END
GO

Örnek Kullanım:

Select kisino, tcnumarasi from kimlikler where fn_tcdogrula(tcnumarasi)=0

 

 

bu komut ile kimlikler tablosunda tcnumarası hatalı olan kişileri listeler.