Search code examples
sqlt-sqlbarcodechecksum

SQL proc to calculate check digit for 7 and 12 digit upc


I just had to scour the internet for this code yet again so I figured I would put it here so I can find it a little faster the next time and hopefully you found it a little faster too :)


Solution

  • Check this. The code below can check digit in all GTIN's (EAN8, EAN13, EAN14, UPC/A, UPC/E)

    CREATE FUNCTION [dbo].[check_digit]
    (
        @GTIN VARCHAR(14)
    )
    RETURNS TINYINT
    AS
    BEGIN
        DECLARE @Index TINYINT,
                @Multiplier TINYINT,
                @Sum TINYINT,
                @checksum TINYINT,
                @result TINYINT,
                @GTIN_strip VARCHAR(13)
    
        SELECT  @GTIN_strip = SUBSTRING(@GTIN,1,LEN(@GTIN)-1);
    
        SELECT  @Index = LEN(@GTIN_strip),
                @Multiplier = 3,
                @Sum = 0
    
        WHILE @Index > 0
            SELECT  @Sum = @Sum + @Multiplier * CAST(SUBSTRING(@GTIN_strip, @Index, 1) AS TINYINT),
                @Multiplier = 4 - @Multiplier,
                @Index = @Index - 1
    
        SELECT @checksum = CASE @Sum % 10
                WHEN 0 THEN '0'
                ELSE CAST(10 - @Sum % 10 AS CHAR(1))
            END
    
    
        IF (SUBSTRING(@GTIN,LEN(@GTIN),1) = @checksum)
            RETURN 1; /*true*/
            RETURN 0; /*false*/
    END