在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
答案 0 :(得分:1)
Create function
必须是批处理中的第一条语句。 Go
终止批次,例如包含use
的语句。
因此可以使函数独立于DateFirst
和Language
:
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日的“日期序列号”,为“零日”。 “日期序列号”是用于执行此类操作并生成日期序列的强大工具。