我正在使用 MS SQL 并且我正在尝试创建一个函数以供稍后在查询中使用:
CREATE FUNCTION "DiasLaborales"(
"@month" INT,
"@year" INT
)
RETURNS INT
LANGUAGE SQL
NOT DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
COMMENT ''
BEGIN
DECLARE @day INT = 1
DECLARE @varfecha DATETIME
DECLARE @diaslaborales INT
SET @diaslaborales = 0
SET @varfecha = CAST(RTRIM(@year * 10000 + @month * 100 + @day) AS DATETIME)
SET @fechafinal = DATEADD(DAY, -(DAY(DATEADD(MONTH, 1, @varfecha))), DATEADD(MONTH, 1, @varfecha))
WHILE ((@fechafinal + 1) > @varfecha)
BEGIN
IF (DATEPART(dw,@varfecha) NOT IN (6,7))
BEGIN
SET @diaslaborales = @diaslaborales +1
END
SET @varfecha = @varfecha + 1
END
RETURN @diaslaborales
END
Run Code Online (Sandbox Code Playgroud)
但是,我收到此错误消息:
SQL 错误 (178):'@month' 附近的语法不正确 在此上下文中不能使用带有返回值的 RETURN 语句。
我不明白那个消息。
您在函数中遇到的问题:
@fechafinal任何地方声明RETURNS INT而BEGIN不是在SQL Server中有效。这为我成功编译。
CREATE FUNCTION "DiasLaborales" ( @month INT, @year INT )
RETURNS INT
BEGIN
DECLARE @day INT = 1;
DECLARE @varfecha DATETIME;
DECLARE @diaslaborales INT;
DECLARE @fechafinal DATETIME;
SET @diaslaborales = 0;
SET @varfecha = CAST(RTRIM(@year * 10000 + @month * 100 + @day)
AS DATETIME);
SET @fechafinal = DATEADD(DAY, - ( DAY(DATEADD(MONTH, 1, @varfecha))), DATEADD(MONTH, 1, @varfecha));
WHILE (( @fechafinal + 1 ) > @varfecha )
BEGIN
IF ( DATEPART(dw, @varfecha) NOT IN (6, 7))
BEGIN
SET @diaslaborales = @diaslaborales + 1;
END;
SET @varfecha = @varfecha + 1;
END;
RETURN @diaslaborales;
END;
Run Code Online (Sandbox Code Playgroud)
只要确保您了解SQL Server 中标量值函数对性能的影响。