Tsql 如何在标量函数中使用WITH?
我试图将WITH子句添加到标量函数中的语句中,但当我添加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
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,以确定是否继续执行一些其他逻辑,从而获得所需的数据。如果我自己设计了系统的这一部分,我会将有问题的逻辑移动到一个存储过程中,该存储过程也包含了这个逻辑。