我在创建函数时遇到问题,无法解决问题

时间:2020-05-22 20:44:16

标签: sql-server tsql

在T-SQL中创建函数时遇到问题。

USE DB_ASSIG1
BEGIN
    CREATE FUNCTION myFunction (@date DATETIME)
        RETURNS INT
            AS
            BEGIN
                DECLARE @day INT

                CASE SELECT DATENAME(dw, @date)
                    WHEN 'Monday'
                        THEN SET @day = 1
                    WHEN 'Tuesday'
                        THEN SET @day = 2
                    WHEN 'Wednesday'
                        THEN SET @day = 3
                    WHEN 'Thursday'
                        THEN SET @day = 4
                    WHEN 'Friday'
                        THEN SET @day = 5
                    WHEN 'Saturday'
                        THEN SET @day = 6
                    WHEN 'Sunday'
                        THEN SET @day = 7
                    END

                    RETURN (@day)
            END
END

无法解决它,请帮助,顺便说一下,我还是T-SQL的新手。

这是我得到的错误:

第156条消息,第15级,状态1,第3行 关键字“ FUNCTION”附近的语法不正确。

第15层状态1的第9行156消息 关键字“ CASE”附近的语法不正确。

第137层15级州立2行9 必须声明标量变量“ @date”。

第156条消息,第15级,状态1,第12行 关键字“ WHEN”附近的语法不正确。

第156条消息,第15级,状态1,第14行 关键字“ WHEN”附近的语法不正确。

第156条消息,第15级,状态1,第16行 关键字“ WHEN”附近的语法不正确。

第15层状态1的第18行的消息156 关键字“ WHEN”附近的语法不正确。

第156条消息,第15级,状态1,第20行 关键字“ WHEN”附近的语法不正确。

第156条消息,第15级,状态1,第22行 关键字“ WHEN”附近的语法不正确。

第137层15州第23行的消息 必须声明标量变量“ @day”。

137消息,第15级,州2,第26行 必须声明标量变量“ @day”。

完成时间:2020-05-22T22:54:38.4427014 + 02:00

2 个答案:

答案 0 :(得分:1)

Create function必须是批处理中的第一条语句。 Go终止批次,例如包含use的语句。

因此可以使函数独立于DateFirstLanguage

USE DB_ASSIG1

go -- Required batch separator.

create function dbo.someoneelsesCode( @Date as Date )
  -- Returns the day-of-the-week for the date with Monday = 1 through Sunday = 7.
  -- It is unaffected by the setting of   DateFirst   or   Language .
  returns Int
  begin
  return ( @@DateFirst + DatePart( weekday, @Date ) - 2 ) % 7 + 1;
  end;

答案 1 :(得分:1)

还有一个主意...

 CREATE OR ALTER FUNCTION dbo.NumericDOW
        (@pDate DATETIME)
RETURNS TINYINT AS
  BEGIN --==== Note that -53690 is the 1st of January, 1753, which is a Monday
        RETURN DATEDIFF(dd,-53690,@pDate)%7+1
    END
;

虽然我当然理解抽象这种公式以简化易用性的想法,但我个人不会在标量函数中使用它,因为它会自动比内联代码慢7倍。如果您不记得数字-53690,请使用“ 0”,它是1900年1月1日,也是星期一,更容易记住。公式看起来像这样...

DATEDIFF(dd,0,@pDate)%7+1

作为一个教育性的补充工具,-53690和0均为基于1900年1月1日的“日期序列号”,为“零日”。 “日期序列号”是用于执行此类操作并生成日期序列的强大工具。