我正在为一个课程和课程管理项目。我想创建一个函数,该函数根据课程名称自动创建课程代码,然后根据是否已经存在具有相同的前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
。
我尝试更改编写函数的方式,但效果并不理想。有人可以帮我知道问题出在哪里吗?我在功能上做错了吗?
谢谢
答案 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()
函数,因此您在转换时不必担心字符串的长度。