使用 Cte 的结果设置变量输出
Setting a Variable Output with results from Cte's
我正在尝试创建一个存储过程,我想在其中使用 Select 语句设置变量输出值,CTE 提供的信息来自该语句:
这是我的代码:
Create procedure [dbo].[GetAvailableTime]
@ID int,
@week int,
@DirectTime int output
as
;with
cte_stg1
as
(
select
tim.[TimesheetID] as [TimeSheet Tim]
,sum(st1.Mins) as [S1Mins]
from [dbo].[Timesheets] as tim
left join [dbo].[Stage1] as st1 on st1.[TimesheetID] = tim.[TimesheetID]
where st1.[TimesheetID] = tim.[TimesheetID]
group by tim.[TimesheetID]
),
--------------
cte_stg1l
as
(
select
tim.[TimesheetID] as [TimeSheet Tim]
,sum(s1l.[Mins]) as [S1LMins]
from [dbo].[Timesheets] as tim
left join [dbo].[Stage1Leave] as s1L on s1l.[TimesheetID] = tim.[TimesheetID]
where s1L.[TimesheetID] = tim.[TimesheetID]
group by tim.[TimesheetID]
)
set @DirectTime = (select Isnull(Sum(isnull(E.[WeeklyContractedHours],0) - isnull(cte_stg1l.[S1LMins],0) - isnull(cte_stg1.[S1Mins],0)),0)
from [dbo].[Employees] as E
left join [dbo].[Timesheets] as tim on E.[EmployeeProfileID] = tim.[EmployeeID]
left join cte_stg1 as cte_stg1 on cte_stg1.[TimeSheet Tim] =tim.[TimesheetID]
left join cte_stg1l as cte_stg1l on cte_stg1l.[TimeSheet Tim] =tim.[TimesheetID]
where
E.[EmployeePID] = @PID and
tim.[WeekID] = @week)
结果应该是一个代表分钟的整数值。
@DirectTime
===========
1530
但是,我收到错误 关键字 'set' 附近的语法不正确。
任何人都可以告诉我做错了什么,如果可能的话,建议我如何解决这个问题。
谢谢
尝试用 select @DirectTime = Isnull(Sum...
替换 set @DirectTime = (select Isnull(Sum...
并删除结尾的右括号。
select @DirectTime = Isnull(Sum(isnull(E.[WeeklyContractedHours],0) - isnull(cte_stg1l.[S1LMins],0) - isnull(cte_stg1.[S1Mins],0)),0)
from [dbo].[Employees] as E
left join [dbo].[Timesheets] as tim on E.[EmployeeProfileID] = tim.[EmployeeID]
left join cte_stg1 as cte_stg1 on cte_stg1.[TimeSheet Tim] =tim.[TimesheetID]
left join cte_stg1l as cte_stg1l on cte_stg1l.[TimeSheet Tim] =tim.[TimesheetID]
where
E.[EmployeePID] = @PID and
tim.[WeekID] = @week
我正在尝试创建一个存储过程,我想在其中使用 Select 语句设置变量输出值,CTE 提供的信息来自该语句:
这是我的代码:
Create procedure [dbo].[GetAvailableTime]
@ID int,
@week int,
@DirectTime int output
as
;with
cte_stg1
as
(
select
tim.[TimesheetID] as [TimeSheet Tim]
,sum(st1.Mins) as [S1Mins]
from [dbo].[Timesheets] as tim
left join [dbo].[Stage1] as st1 on st1.[TimesheetID] = tim.[TimesheetID]
where st1.[TimesheetID] = tim.[TimesheetID]
group by tim.[TimesheetID]
),
--------------
cte_stg1l
as
(
select
tim.[TimesheetID] as [TimeSheet Tim]
,sum(s1l.[Mins]) as [S1LMins]
from [dbo].[Timesheets] as tim
left join [dbo].[Stage1Leave] as s1L on s1l.[TimesheetID] = tim.[TimesheetID]
where s1L.[TimesheetID] = tim.[TimesheetID]
group by tim.[TimesheetID]
)
set @DirectTime = (select Isnull(Sum(isnull(E.[WeeklyContractedHours],0) - isnull(cte_stg1l.[S1LMins],0) - isnull(cte_stg1.[S1Mins],0)),0)
from [dbo].[Employees] as E
left join [dbo].[Timesheets] as tim on E.[EmployeeProfileID] = tim.[EmployeeID]
left join cte_stg1 as cte_stg1 on cte_stg1.[TimeSheet Tim] =tim.[TimesheetID]
left join cte_stg1l as cte_stg1l on cte_stg1l.[TimeSheet Tim] =tim.[TimesheetID]
where
E.[EmployeePID] = @PID and
tim.[WeekID] = @week)
结果应该是一个代表分钟的整数值。
@DirectTime
===========
1530
但是,我收到错误 关键字 'set' 附近的语法不正确。
任何人都可以告诉我做错了什么,如果可能的话,建议我如何解决这个问题。
谢谢
尝试用 select @DirectTime = Isnull(Sum...
替换 set @DirectTime = (select Isnull(Sum...
并删除结尾的右括号。
select @DirectTime = Isnull(Sum(isnull(E.[WeeklyContractedHours],0) - isnull(cte_stg1l.[S1LMins],0) - isnull(cte_stg1.[S1Mins],0)),0)
from [dbo].[Employees] as E
left join [dbo].[Timesheets] as tim on E.[EmployeeProfileID] = tim.[EmployeeID]
left join cte_stg1 as cte_stg1 on cte_stg1.[TimeSheet Tim] =tim.[TimesheetID]
left join cte_stg1l as cte_stg1l on cte_stg1l.[TimeSheet Tim] =tim.[TimesheetID]
where
E.[EmployeePID] = @PID and
tim.[WeekID] = @week