Tsql 如何在标量函数中使用WITH?

Tsql 如何在标量函数中使用WITH?,tsql,sql-server-2014,common-table-expression,stored-functions,Tsql,Sql Server 2014,Common Table Expression,Stored Functions,我试图将WITH子句添加到标量函数中的语句中,但当我添加WITH子句时,会出现以下语法错误: CREATE FUNCTION IsSumEqualToTen ( @number1 INT, @number2 INT ) RETURNS BIT AS BEGIN RETURN ( CASE WHEN (@number1 + @number2) = 10 THEN 1 ELSE 0 END ) E

我试图将WITH子句添加到标量函数中的语句中,但当我添加WITH子句时,会出现以下语法错误:

CREATE FUNCTION IsSumEqualToTen
(
    @number1 INT,
    @number2 INT
)
RETURNS BIT
AS
BEGIN
    RETURN
    (
        CASE WHEN (@number1 + @number2) = 10
        THEN 1
        ELSE 0
        END
    )
END
SQL80001:“WITH”附近的语法不正确

SQL80001:附近的语法不正确

最后一个错误是指最后一个结束括号

下面是一个大大简化的SQL示例,它也因同样的原因失败:

CREATE FUNCTION IsSumEqualToTen
(
    @number1 INT,
    @number2 INT
)
RETURNS BIT
AS
BEGIN
    RETURN
    (
        WITH AddNumbers AS
        (
            SELECT @number1 + @number2
        )
        SELECT CASE WHEN AddNumbers = 10
        THEN 1
        ELSE 0
        END
    )
END
我知道当更改为此时,它没有语法错误:

CREATE FUNCTION IsSumEqualToTen
(
    @number1 INT,
    @number2 INT
)
RETURNS BIT
AS
BEGIN
    RETURN
    (
        CASE WHEN (@number1 + @number2) = 10
        THEN 1
        ELSE 0
        END
    )
END

但是,对于我实际正在做的事情,我需要一个递归CTE来扁平化继承权,因此使用是必要的。

首先,我必须说我同意Larnu在这一点上的观点-使用标量函数可能不是你能采取的最佳行动。 但是,我想向您展示,在用户定义的函数中使用公共表表达式(表值或标量)是没有问题的

您所展示的代码的问题在于,您确实存在一些语法错误以及一些概念错误。该功能的固定版本仍然使用cte,如下所示:

CREATE FUNCTION IsSumEqualToTen
(
    @number1 INT,
    @number2 INT
)
RETURNS BIT
AS
BEGIN
    DECLARE @Result bit;

        WITH AddNumbers(AddNumbers) AS
        (
            SELECT @number1 + @number2 
        )
        SELECT @Result = CASE WHEN MAX(AddNumbers) = 10
            THEN 1
            ELSE 0
            END
        FROM AddNumberes;

    RETURN @Result;
END
注:

cte结果集中的每一列都必须命名。 cte被视为一个表,您必须考虑这样一个事实,即它可能包含多行,即使它只能包含一行,编译器也无法知道这一点。 标量函数不是内联的,这意味着您在这里不返回body,而是返回body。。。;返回scalarValue。事实上,这就是
你为什么在这里需要一个好朋友?当@number1+@number2时有什么问题?如果您确实需要一个rCTE,听起来您需要的是一个内联表值函数,而不是多行标量函数。你应该给我们展示一个现实的例子来说明你需要什么,而不是一个过于简化的例子,不能说明真正的问题,因为这里不需要一个简单的例子。这就是我试图解决的问题:这是另一个问题的重复,或者它的XY问题?你为什么要在这里使用标量函数?除非您使用SQLServer2019的标量内联功能,否则您应该真正坚持内联表值函数;我已经到了我已经确定的点,剩下的问题是在标量函数中使用WITH。我需要标量函数,因为我要将bool返回给C,以确定是否继续执行一些其他逻辑,从而获得所需的数据。如果我自己设计了系统的这一部分,我会将有问题的逻辑移动到一个存储过程中,该存储过程也包含了这个逻辑。