Scalar Valued Функция для вычисления проверки GS1 di git в SQL Server - PullRequest
0 голосов
/ 25 марта 2020

Мне нужно вычислить номер проверки GTIN-14 (ITF-14) di git на SQL сервере с 13 di git varchar и вернуть вычисленное число 14 di git (как varchar).

Я нашел это сообщение , в котором создается табличная функция, но для работы в моем приложении мне нужна скалярная функция.

Любая помощь приветствуется.

CREATE FUNCTION [GtinCheckDigit] 
    (@Input VARCHAR(17))
RETURNS TABLE 
WITH SCHEMABINDING 
AS
    RETURN 
        WITH [ReverseInput](S) AS 
        (
            SELECT REVERSE(@Input)
        ), [CharCount](N) AS 
        (
            SELECT n 
            FROM 
                (VALUES (1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11),(12),(13),(14),(15),(16),(17)) a(n)
        ), [CharPos](N,S) AS 
        (
            SELECT TOP (LEN(@Input)) 
                [CharCount].N, SUBSTRING([ReverseInput].S, [CharCount].N, 1)
            FROM 
                [CharCount], [ReverseInput]
        ), [Multiplier](N) AS 
        (
            SELECT 
                (S * CASE WHEN (N%2) = 0 THEN 1 ELSE 3 END)
            FROM 
                [CharPos]
        ), [Checksum](N) AS 
        (
            SELECT 
                CASE WHEN (SUM(N) % 10) > 0 THEN (10 - (SUM(N) % 10)) ELSE 0 END
            FROM 
                [Multiplier]
        )
        SELECT @Input + CAST(N AS VARCHAR) AS [Output] 
        FROM [Checksum];

1 Ответ

0 голосов
/ 25 марта 2020

Я не знаю, является ли это лучшим способом, но вот работающая версия, основанная на вашем коде:

CREATE FUNCTION [GtinCheckDigit] (@Input VARCHAR(17))
RETURNS VARCHAR(18)
BEGIN
DECLARE @CD VARCHAR(18);
WITH ReverseInput(S) AS (
    SELECT REVERSE(@Input)
), CharCount(N) AS (
    SELECT n from (VALUES (1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11),(12),(13),(14),(15),(16),(17)) a(n)
), CharPos(N, S) AS (
    SELECT TOP (LEN(@Input)) CharCount.N, SUBSTRING(ReverseInput.S, CharCount.N, 1)
    FROM CharCount CROSS JOIN ReverseInput
), Multiplier(N) AS (
    SELECT S * CASE WHEN N % 2 = 0 THEN 1 ELSE 3 END
    FROM CharPos
), Checksum(N) AS (
    SELECT CASE WHEN SUM(N) % 10 > 0 THEN 10 - SUM(N) % 10 ELSE 0 END
    FROM Multiplier
)
SELECT @CD = @Input + CAST(N AS CHAR(1)) from Checksum;
RETURN @CD;
END
GO
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...