SQL Server 2012创建函数编译错误
SQL Server 2012、Windows 2008 R2 Server 我试图创建一个以日期范围为参数的函数。它通过从给定日期范围的表中选择返回结果集 我发现这个错误: Msg 102,15级,状态31,程序emp\u性能\u fn,第23行 “BEGIN”附近的语法不正确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
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
)