Tworząc ostatnio bazę danych, wymaganiem była weryfikacja po stronie bazy danych poprawności wprowadzenia numeru PESEL i NIP.
Sprawa sprowadza się do wyliczenia reszty z dzielenia – w przypadku numeru PESEL lub sumy kontrolnej – w przypadku NIPu.
W treści wpisu załączam gotowe funkcje T-SQL do weryfikacji tych numerów.
Funkcja do walidacji numerów PESEL:
CREATE FUNCTION IsValidPesel ( @pesel nchar(11) ) RETURNS bit AS BEGIN IF ISNUMERIC(@pesel) = 0 RETURN 0 DECLARE @weights AS TABLE ( Position tinyint IDENTITY(1,1) NOT NULL, Weight tinyint NOT NULL ) INSERT INTO @weights VALUES (1), (3), (7), (9), (1), (3), (7), (9), (1), (3), (1) IF (SELECT SUM(CONVERT(TINYINT, SUBSTRING(@pesel, Position, 1)) * Weight) % 10 FROM @weights ) = 0 RETURN 1 RETURN 0 END
Oraz funkcja do walidacji numerów NIP:
CREATE FUNCTION IsValidNip ( @nip nvarchar(15) ) RETURNS bit AS BEGIN SELECT @nip = REPLACE(@nip,'-','') IF ISNUMERIC(@nip) = 0 RETURN 0 DECLARE @weights AS TABLE ( Position tinyint IDENTITY(1,1) NOT NULL, Weight tinyint NOT NULL ) INSERT INTO @weights VALUES (6), (5), (7), (2), (3), (4), (5), (6), (7) IF SUBSTRING(@nip, 10, 1) = (SELECT SUM(CONVERT(TINYINT, SUBSTRING(@nip, Position, 1)) * Weight) % 11 FROM @weights) RETURN 1 RETURN 0 END
Teraz wystarczy jedynie dodać check constraint do odpowiednich tabeli:
ALTER TABLE Users ADD CONSTRAINT checkPesel CHECK (dbo.IsValidPesel(PESEL) = 1) ALTER TABLE Users ADD CONSTRAINT checkNip CHECK (dbo.IsValidNip(NIP) = 1)
Piotrek Reinmar Koszuliński sie 19 , 2011 at 02:11 /
Jak spojrzałem na to to mi się przypomniał zeszły semestr na uczelni. Na jednym kursie robiliśmy aplikację, która miała wyglądać tak ładnie jak webowa, w Accessie (sic!) i tam musiałem w przecudownym VB pisać powyższe funkcje. Na drugim robiliśmy już trochę sensowniejsze rzeczy ale w T-SQL-u. Mnie, osobę, lekko mówiąc, nie przepadającą za produktami MS, bardzo bolało ;> A Ty przywróciłeś te wspomnienia łącząc tematy ;>
a wrz 08 , 2011 at 08:50 /
sad
Akodo_Shado wrz 08 , 2011 at 09:16 /
09 IF ISNUMERIC(@pesel) = 0
10 RETURN 0
?? I działa? ;)
Dodatkowo wcześniej warto sprawdzić czy nie jest null i czy ma 11 znaków.
Dodatkowo przydałyby się dwa opcjonalne parametry.
Data urodzenia i płeć i sprawdzić je w peselu jak są podane.
Adam paź 27 , 2020 at 13:24 /
7742840242 jest poprawnym NIP, a Twoja funkcja uznała go za zły :(