【发布时间】:2019-01-24 11:58:21
【问题描述】:
ALTER FUNCTION WEEKDAYS(@DAY VARCHAR)
RETURNS INT
AS BEGIN
IF(@DAY IS NULL)
RETURN 0
DECLARE @OUTPUT INT
SELECT @OUTPUT=
CASE WHEN SUBSTRING(@DAY,1,1) = 'M' THEN 1
WHEN SUBSTRING(@DAY,1,2) = 'TU' THEN 2
WHEN SUBSTRING(@DAY,1,1) = 'W' THEN 3
WHEN SUBSTRING(@DAY,1,2) = 'TH' THEN 4
WHEN SUBSTRING(@DAY,1,1) = 'F' THEN 5
WHEN SUBSTRING(@DAY,1,2) = 'SA' THEN 6
WHEN SUBSTRING(@DAY,1,2) = 'SU' THEN 7
ELSE
99 END
RETURN @OUTPUT
END
我有这个功能。在星期一、星期三和星期五的情况下,该功能正在打印的输出是正确的。但在其他情况下,它会打印 else 条件的输出。
【问题讨论】:
-
您的 DAY 参数被声明为 varchar - 这意味着 varchar(1)。您的代码假定为 varchar(2)。这里有一个重要的教训。我会更进一步——“工作日”并不总是“工作日”。小心你的假设。
-
为什么需要在参数上使用子字符串?传递无效值的人应该收到无效的返回值或错误。不要试图隐藏源代码错误。并且不要通过适应他们的懒惰来鼓励懒惰的开发人员。
标签: sql-server