Проверка кода EAN хранимой процедуры SQL Server

Мне нужно написать хранимую процедуру или функцию для проверки вставки кода EAN13 в SQL Server.

Может кто-нибудь мне помочь?

2 ответа

Решение

Решено,

Я создал функцию для проверки:

CREATE FUNCTION [sp_ean] (@ Ean varchar (max)) ВОЗВРАЩАЕТ INT AS
НАЧАТЬ
    ОБЪЯВИТЬ @Factor INT
    ОБЪЯВИТЬ @Sum INT
    ОБЪЯВИТЬ @Len INT
    ОБЪЯВИТЬ @CC INT
    ОБЪЯВИТЬ @CA INT
    ОБЪЯВИТЬ @Result NVARCHAR(МАКС)

    SET @Len = LEN(@Ean)
    SET @Sum = 0
    SET @Factor = 3

    ЕСЛИ @Len = 14 ИЛИ @Len = 13 ИЛИ @Len = 12 ИЛИ @Len = 8 
        НАЧАТЬ
            WHILE @Len > 0 
                НАЧАТЬ
                    ЕСЛИ @ Лен 13
                        НАЧАТЬ
                            SET @Sum = @Sum + SUBSTRING(@Ean,@Len,1) * @Factor
                            SET @Factor = 4 - @Factor
                        КОНЕЦ
                    SET @Len = @Len - 1
                КОНЕЦ

            SET @CC = ((1000 - @Sum) % 10)
            SET @CA = SUBSTRING(@Ean,LEN(@Ean),1)

            IF  @CC = @CA
                НАЧАТЬ
                    SET @Result = 0
                КОНЕЦ
            ELSE
                НАЧАТЬ
                    SET @Result = 1
                КОНЕЦ
        КОНЕЦ
    ELSE
        НАЧАТЬ
            SET @Result = 1
        КОНЕЦ
    ВОЗВРАТ (@Result)
    КОНЕЦ

Результат: от0 до true или от 1 до false

Спасибо!

Возможно, вы найдете что-то вроде этого, чтобы быть чище. Он обрабатывает ввод переменной длины, а также имеет то преимущество, что его можно использовать в качестве проверочного ограничения, на что указал Джо Селко.

CASE WHEN CAST(SUBSTRING(REVERSE(ean), 1, 1) AS INTEGER) =
        10 - (
               3 * CAST(SUBSTRING(REVERSE(ean) + '000000', 2, 1)) AS INT)
               1 * CAST(SUBSTRING(REVERSE(ean) + '000000', 3, 1)) AS INT)
               3 * CAST(SUBSTRING(REVERSE(ean) + '000000', 4, 1)) AS INT)
               1 * CAST(SUBSTRING(REVERSE(ean) + '000000', 5, 1)) AS INT)
               3 * CAST(SUBSTRING(REVERSE(ean) + '000000', 6, 1)) AS INT)
               1 * CAST(SUBSTRING(REVERSE(ean) + '000000', 7, 1)) AS INT)
               3 * CAST(SUBSTRING(REVERSE(ean) + '000000', 8, 1)) AS INT)
               1 * CAST(SUBSTRING(REVERSE(ean) + '000000', 9, 1)) AS INT)
               3 * CAST(SUBSTRING(REVERSE(ean) + '000000', 10, 1)) AS INT)
               1 * CAST(SUBSTRING(REVERSE(ean) + '000000', 11, 1)) AS INT)
               3 * CAST(SUBSTRING(REVERSE(ean) + '000000', 12, 1)) AS INT)
               1 * CAST(SUBSTRING(REVERSE(ean) + '000000', 13, 1)) AS INT)
               3 * CAST(SUBSTRING(REVERSE(ean) + '000000', 14, 1)) AS INT)
             ) % 10
THEN 1 ELSE 0 END
Другие вопросы по тегам