Функция SQL Server со счетчиком не работает должным образом - PullRequest
0 голосов
/ 06 октября 2019

Я работаю над проектом для управления классом и курсом. Я хочу создать функцию, которая автоматически создает код курса на основе имени курса, а затем добавляет число в зависимости от того, существует ли уже название курса с такими же первыми 4 символами.

Вот как выглядит моя функциянапример:

CREATE FUNCTION [dbo].[fxGenerateCourseCode]
    (@course_name VARCHAR(50))
RETURNS VARCHAR(8)
AS
BEGIN
    DECLARE @course_code VARCHAR(8), @count_course INT

    SET @count_course = (SELECT COUNT(1) FROM dbo.COURSE_TB 
                         WHERE SUBSTRING(course_name, 1, 4) = SUBSTRING(@course_name, 1, 4)) + 1 

    SELECT @course_code = UPPER(SUBSTRING(@course_name, 1, 4)) + ' - ' + '00' + CAST(@count_course AS VARCHAR)

    RETURN @course_code
END

Проблема в том, что всякий раз, когда я выполняю эту функцию, она не возвращает правильные значения счетчика и также не включает 00.

Например, выполнение этого:

SELECT dbo.fxGenerateCourseCode('french')

возвращает FREN-0 вместо FREN-001 (что я и ожидаю).

Однако, когда я выполняюкод вручную, он дает мне ожидаемый результат:

DECLARE @course_code VARCHAR(8), @count_course INT, @course_name VARCHAR(50)

SET @course_name = 'french'

SET @count_course = (SELECT COUNT(1) + 1 FROM dbo.PARAMETRES_COURS 
                     WHERE SUBSTRING(nom_cours, 1, 4) = SUBSTRING(@course_name, 1, 4))

SELECT course_code = UPPER(SUBSTRING(@course_name, 1, 4)) + ' - ' + '00' + CAST(@count_course AS VARCHAR)

Результат: FREN-001.

Я попытался изменить способ написания функции с небольшим результатом. Может кто-нибудь помочь мне узнать, откуда возникла проблема? Я что-то не так делаю в функции?

Спасибо

1 Ответ

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

Я подозреваю, что вы помещаете значение в столбец длиной 6. Тем не менее проблема заключается в пробелах вокруг дефиса. Кроме того, всегда включайте длину для varchar, потому что длина по умолчанию зависит от контекста и может не выполнять то, что вы хотите:

Вы можете упростить свой код и сделать его более точным:

declare @course_code varchar(8), @count_course int;

select @count_course = count(1) + 1
from dbo.COURSE_TB
where left(course_name, 4) = left(@course_name, 4);

select @course_code = concat(left(upper(@course_name, 4)), '-', '00', @count_course);

Обратите внимание, что это все еще не делает то, что вы хотите, то есть заполнение числа. Эта версия работает только для 9 курсов. Вы, кажется, хотите:

select @course_code = concat(left(upper(@course_name, 4)), '-',
                             right(concat('00', @count_course), 3)
                            );

Обратите внимание на использование функции concat(), поэтому вам не нужно беспокоиться о длинах строк при выполнении преобразования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...