子字符串功能不比较输出

时间:2019-01-24 11:58:21

标签: sql-server

IndexError: list assignment index out of range

我拥有此功能。在星期一,星期三和星期五的情况下该功能正在打印的输出正确。但在其他情况下,它是从else条件打印输出。

2 个答案:

答案 0 :(得分:3)

总是 声明您的长度,比例和精度...不声明您的长度 会导致意外的行为;就像您在这里一样。

ALTER FUNCTION WEEKDAYS(@DAY VARCHAR)

与以下相同:

ALTER FUNCTION WEEKDAYS(@DAY VARCHAR(1))

由于@DAY的长度为1,因此它永远不能具有值'TU',因为它是2个字符;最多为@DAY的两倍。为您的varchar参数定义适当的长度,问题就消失了。

不过,完全不同的是,为什么要使用UDF来获取工作日编号,为什么不DATEPART(WEEKDAY, {Date})

答案 1 :(得分:0)

您也可以使用DATEPART()函数来获取不带函数的代码。但是要纠正您的功能,您可以尝试以下方法。

ALTER FUNCTION WEEKDAYS(@DAY VARCHAR(10))
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

SELECT dbo.WEEKDAYS('SUNDAY') as SUNDAY
SELECT dbo.WEEKDAYS('MONDAY') as MONDAY
SELECT dbo.WEEKDAYS('TUESDAY') as TUESDAY
SELECT dbo.WEEKDAYS('WEDNESDAY') as WEDNESDAY
SELECT dbo.WEEKDAYS('THURSDAY') as THURSDAY
SELECT dbo.WEEKDAYS('FRIDAY') as FRIDAY
SELECT dbo.WEEKDAYS('SATURDAY') as SATURDAY

输出如下所示

enter image description here