Sql 标量函数中的CTE
我可以在标量函数中使用公共表表达式吗 我试图用它来获得一个浮点值,但总是为null 以下是我计算每位员工总工作时间的功能代码:Sql 标量函数中的CTE,sql,sql-server,tsql,common-table-expression,Sql,Sql Server,Tsql,Common Table Expression,我可以在标量函数中使用公共表表达式吗 我试图用它来获得一个浮点值,但总是为null 以下是我计算每位员工总工作时间的功能代码: ALTER FUNCTION GetTotalWorkingHour ( @StartDate datetime, @EndDate datetime, @EmpID nvarchar(6) = null ) RETURNS float AS BEGIN DECLARE @Result float; WITH CTE_Start
ALTER FUNCTION GetTotalWorkingHour
(
@StartDate datetime,
@EndDate datetime,
@EmpID nvarchar(6) = null
)
RETURNS float
AS
BEGIN
DECLARE @Result float;
WITH
CTE_Start
AS
(
SELECT EmpID ,SUM(DATEDIFF(minute, (CAST(att.[date] AS datetime) + att.[Time]), @StartDate) *
CASE WHEN Funckey = 'EMPIN' THEN +1 ELSE -1 END) AS SumStart
FROM PERS_Attendance AS att
WHERE (EmpID = @EmpID OR @EmpID IS NULL) AND att.[date] < @StartDate GROUP BY EmpID
)
,CTE_End
AS
(
SELECT EmpID ,SUM(DATEDIFF(minute, (CAST(att.[date] AS datetime) + att.[Time]), @EndDate) * CASE WHEN Funckey = 'EMPIN' THEN +1 ELSE -1 END) AS SumEnd
FROM PERS_Attendance AS att
WHERE (EmpID = @EmpID OR @EmpID IS NULL) AND att.[date] < @EndDate GROUP BY EmpID
)
SELECT @Result =
(CTE_Start.SumStart - ISNULL(CTE_End.SumEND, 0) / 60.0) --AS SumHours
FROM
CTE_End
LEFT JOIN CTE_Start ON CTE_Start.EmpID = CTE_End.EmpID
RETURN @Result
END
GO
上面的代码以正确的方式运行,如果我在单个querynot-in函数中使用它,会得到预期的结果,那么有什么问题吗?我找到了解决方案,这是一个小错误,我必须补充:
SELECT @Result =
(SumEnd - ISNULL(SumStart, 0)) / 60.0 --AS SumHours
FROM
CTE_End
LEFT JOIN CTE_Start ON CTE_Start.EmpID = CTE_End.EmpID
RETURN @Result
而不是:
SELECT @Result =
(CTE_Start.SumStart - ISNULL(CTE_End.SumEND, 0) / 60.0) --AS SumHours
FROM
CTE_End
LEFT JOIN CTE_Start ON CTE_Start.EmpID = CTE_End.EmpID
RETURN @Result
我做了一个小调查,他们都在谈论只在表值函数中使用它。。我已经尝试使用它来获取单个值,但该值始终为空。是的,您可以。如果遇到问题,请发布SQL和预期结果。尝试添加;在返回@Result之前。为什么不将其转换为内联表值函数呢。它将更加灵活,从性能角度看不会受到太多影响。