【问题标题】:CTE in Scalar Function标量函数中的 CTE
【发布时间】:2015-08-21 12:48:07
【问题描述】:

我可以在标量函数中使用公用表表达式 (CTE) 吗??

我尝试使用它来获取单个浮点值,但始终为空

这是我计算每位员工总工时的函数代码:

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

上面的代码以正确的方式运行,如果我在单个查询中使用它(而不是在函数中)给我预期的结果,那么有什么问题?

【问题讨论】:

  • 我做了一个小研究,他们都在谈论只在表值函数中使用它。我已经尝试使用它来获取单个值,但该值始终为空
  • 是的,你可以。如果您遇到问题,请发布您的 SQL 和预期结果。
  • 尝试添加“;”在返回 @Result 之前。
  • 为什么不将其转换为内联表值函数。它将更加灵活,并且从性能角度来看不会受到太大影响。

标签: sql sql-server tsql common-table-expression


【解决方案1】:

我找到了解决方案,这是一个小错误,我必须补充:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-14
    • 1970-01-01
    相关资源
    最近更新 更多