SQL Server 2012创建函数编译错误

SQL Server 2012创建函数编译错误,sql,sql-server,Sql,Sql Server,SQL Server 2012、Windows 2008 R2 Server 我试图创建一个以日期范围为参数的函数。它通过从给定日期范围的表中选择返回结果集 我发现这个错误: Msg 102,15级,状态31,程序emp\u性能\u fn,第23行 “BEGIN”附近的语法不正确 CREATE FUNCTION emp_performance_fn (@startDate varchar(10), @endDate varchar(10)) RETURNS TABLE as begin dec

SQL Server 2012、Windows 2008 R2 Server

我试图创建一个以日期范围为参数的函数。它通过从给定日期范围的表中选择返回结果集

我发现这个错误: Msg 102,15级,状态31,程序emp\u性能\u fn,第23行 “BEGIN”附近的语法不正确

CREATE FUNCTION emp_performance_fn (@startDate varchar(10), @endDate varchar(10))
RETURNS TABLE as
begin

declare   @vStartDate date;
declare    @vEndDate date ;
set @vStartDate = cast(@startDate as date);
    set @vEndDate = cast(@endDate as date);

RETURN
select emp_name, bugs_closed, avg_days_taken, 
(case bugs_closed_bucket when 1 then 'Low' when 4 then 'High' else 'Medium' end)
bugs_closed_bucket2,
(case avg_days_taken_bucket when 1 then 'Low' when 4 then 'High' else 'Medium' 
end) avg_days_taken_bucket2
from (
select emp_name, bugs_closed, avg_days_taken, ntile(4) over (order by 
avg_days_taken) avg_days_taken_bucket,
ntile(4) over (order by bugs_closed) bugs_closed_bucket
from (
SELECT t1.emp_name emp_name, sum(t1.bugs_closed) bugs_closed, 
avg(t1.avg_days_taken) avg_days_taken
FROM emp_performance t1
WHERE month_end_date between @vStartDate and @vEndDate
group by t1.emp_name
) v1) v2;
end;
关于这件事的原因有什么想法吗? SQL是有效的(我在注释WHERE子句后运行了它)。 如果我将返回类型更改为INT并返回1,则编译为OK


固定的 修改了代码,使其具有以下特性:

RETURNS @rtnTable TABLE (
emp_name varchar(100), 
bugs_closed numeric, 
avg_days_taken numeric,
bugs_closed_bucket_name varchar(100), 
avg_days_taken_bucket_name varchar(100)
)     

稍后在函数体中。 成功了。
感谢所有回复。

如果要声明内联表函数,则不能声明任何变量。并且请格式化您的查询(不仅当您将其发布到SO时,而且在您的系统中,有时会有人试图理解这一点,所以最好是可读的)。我不喜欢嵌套子查询,至少你可以这样做

CREATE FUNCTION emp_performance_fn (@startDate varchar(10), @endDate varchar(10))
RETURNS TABLE as
RETURN
(
    select
        emp_name, bugs_closed, avg_days_taken, 
        case bugs_closed_bucket
            when 1 then 'Low'
            when 4 then 'High'
            else 'Medium'
        end as bugs_closed_bucket2,
        case avg_days_taken_bucket
            when 1 then 'Low'
            when 4 then 'High'
            else 'Medium' 
        end as avg_days_taken_bucket2
    from (
        select
            emp_name, bugs_closed, avg_days_taken,
            ntile(4) over (order by   avg_days_taken) avg_days_taken_bucket,
            ntile(4) over (order by bugs_closed) bugs_closed_bucket
        from (
            select
                t1.emp_name emp_name, sum(t1.bugs_closed) bugs_closed, 
                avg(t1.avg_days_taken) avg_days_taken
            from emp_performance t1
            where
                month_end_date between @cast(@startDate as date) and cast(@endDate as date)
            group by t1.emp_name
        ) as v1
    ) as v2
)

如果要声明内联表函数,则不能声明任何变量。并且请格式化您的查询(不仅当您将其发布到SO时,而且在您的系统中,有时会有人试图理解这一点,所以最好是可读的)。我不喜欢嵌套子查询,至少你可以这样做

CREATE FUNCTION emp_performance_fn (@startDate varchar(10), @endDate varchar(10))
RETURNS TABLE as
RETURN
(
    select
        emp_name, bugs_closed, avg_days_taken, 
        case bugs_closed_bucket
            when 1 then 'Low'
            when 4 then 'High'
            else 'Medium'
        end as bugs_closed_bucket2,
        case avg_days_taken_bucket
            when 1 then 'Low'
            when 4 then 'High'
            else 'Medium' 
        end as avg_days_taken_bucket2
    from (
        select
            emp_name, bugs_closed, avg_days_taken,
            ntile(4) over (order by   avg_days_taken) avg_days_taken_bucket,
            ntile(4) over (order by bugs_closed) bugs_closed_bucket
        from (
            select
                t1.emp_name emp_name, sum(t1.bugs_closed) bugs_closed, 
                avg(t1.avg_days_taken) avg_days_taken
            from emp_performance t1
            where
                month_end_date between @cast(@startDate as date) and cast(@endDate as date)
            group by t1.emp_name
        ) as v1
    ) as v2
)