带计数的SQL Server函数无法按预期工作

时间:2019-10-06 14:14:38

标签: sql sql-server tsql count

我正在为一个课程和课程管理项目。我想创建一个函数,该函数根据课程名称自动创建课程代码,然后根据是否已经存在具有相同的前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 :(得分:0)

我怀疑您将值放入长度为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()函数,因此您在转换时不必担心字符串的长度。