在此上下文中不能使用带有返回值的 RETURN 语句

ffu*_*tes -2 sql-server

我正在使用 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 语句。

我不明白那个消息。

Eri*_*ing 7

您在函数中遇到的问题:

  • 去掉参数声明的双引号
  • 你没有在@fechafinal任何地方声明
  • 所有你的东西,RETURNS INTBEGIN不是在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 中标量值函数对性能的影响