Функция для проверки на корректность СНИЛС в MSSQL

Страховой номер индивидуального лицевого счёта страхового свидетельства обязательного пенсионного страхования (он же СНИЛС) проверяется на корректность контрольным числом. СНИЛС имеет вид: «XXX-XXX-XXX YY», где XXX-XXX-XXX — собственно номер, а YY — контрольное число.

Алгоритм формирования контрольного числа СНИЛС таков:

  1. Проверка контрольного числа Страхового номера проводится только для номеров больше номера 001-001-998
  2. Контрольное число СНИЛС рассчитывается следующим образом:
    1. Каждая цифра СНИЛС умножается на номер своей позиции (позиции отсчитываются с конца, то есть, справа)
    2. Полученные произведения суммируются
  3. Если сумма меньше 100, то контрольное число равно самой сумме
  4. Если сумма равна 100 или 101, то контрольное число равно 00
  5. Если сумма больше 101, то сумма делится по остатку на 101 и контрольное число определяется остатком от деления аналогично пунктам 2.3 и 2.4

Например: указан СНИЛС 112-233-445 95. Проверяем правильность контрольного числа:

  • цифры номера 1 1 2 2 3 3 4 4 5
  • номер позиции 9 8 7 6 5 4 3 2 1

Сумма = 1×9 + 1×8 + 2×7 + 2×6 + 3×5 + 3×4 + 4×3 + 4×2 + 5×1 = 95. Сумма равна YY (контрольное число). Контрольное число 95 — указано верно.

Данный алгоритм не способен обнаружить все случаи ошибок в одной цифре (например, номера 087-654-303 00 и 087-654-302 00 отличаются одной цифрой, но оба будут признаны верными). Также не во всех случаях может быть обнаружена ошибка перестановки двух соседних цифр (например, 087-654-303 00 и 086-754-303 00). Причина — пункт 2.4, где для близких чисел 100 и 101 установлено одинаковое контрольное число 00.

Если бы вместо последних двух подпунктов проверки применялся алгоритм «Если сумма равна или больше 100, то контрольное число равно двум последним цифрам этой суммы (остатку от деления суммы на 100)», то он был бы способен обнаружить все случаи ошибок в одной цифре и все случаи ошибочной перестановки двух соседних цифр.

На основе этих условий была создана функция для проверки СНИЛС:

Добавить комментарий