Не удалось выполнить функцию Modulo11 на SQL Server - PullRequest
0 голосов
/ 19 октября 2019

Создайте функцию CheckModulo11, которая проверяет, является ли данный accountNr действительным числом, используйте эту функцию в предложении проверки в таблице со столбцом, который представляет accountNr. (Вам необходимо создать таблицу для хранения accountNr, добавив ограничение и попытаться вставить данные в таблицу).

Подробный вопрос

Мой код:

create function CheckModulo11(@accountNr int)
returns @tableModulo11 table(
    modulo_nr int,
    number int,
    total int,
    status char(5)
)
as
BEGIN
    Declare @tmpTable table(
        modulo_nr int,
        number int,
        total int,
        status char(5)
    )
    Declare @length int, @counter int = 1, @value int, @total int, @changeNums char(10);
    SET @changeNums = CONVERT(char(10), @accountNr);
    Set @length = LEN(@changeNums);
    while @length > 0
    BEGIN
        SET @value = CONVERT(int,SUBSTRING(@changeNums, @length, 1))
        insert into @tmpTable
        (modulo_nr, number, total, status) values
        (@counter, @value, (@counter * @value), '-');
        SET @total = @total + (@counter * @value);
        SET @length = @length - 1;
        SET @counter = @counter + 1; 
    END
    IF @total % 11 = 0
        insert into @tmpTable (modulo_nr, number, total, status) values ('', '', @total, 'valid');
    ELSE
        insert into @tmpTable (modulo_nr, number, total, status) values ('', '', @total, 'not valid');

insert into @tableModulo11
SELECT * FROM @tmpTable
return
END
GO
select * from dbo.CheckModulo11(972428577);

Сообщение об ошибке:

Сообщение 8152, уровень 16, состояние 14, строка 185Строка или двоичные данные будут проигнорированы. Заявление было прекращено.

1 Ответ

0 голосов
/ 19 октября 2019

Я выяснил, почему это не работает.

Ваша функция хороша, вы просто забыли инициализировать переменную @total равной 0. Поэтому она остается нулевой все время независимо от того,Вы увеличили это;и он вылетает в конце непосредственно перед выходом из функции.

Попробуйте заменить строку объявления переменной на эту, и она будет работать (я пробовал):

    Declare @length int, @counter int = 1, @value int, @total int = 0, @changeNums char(10);
...