我想要写一个这样的函数:

CREATE OR ALTER FUNCTION TestFunction()
RETURNS TABLE
AS RETURN
WITH NumberList AS (
    SELECT  1 AS Number
    UNION ALL
    SELECT  Number + 1
    FROM    NumberList
    WHERE   Number < 1000
)
SELECT  Number
FROM    NumberList
OPTION (MAXRECURSION 0)

但是,在运行此查询时,SQL Server返回以下错误:

Msg 156, Level 15, State 1, Procedure TestFunction, Line 13 [Batch Start Line 0]
Incorrect syntax near the keyword 'OPTION'.

如果我从函数中删除第OPTION (MAXRECURSION 0)行,它会起作用:

CREATE OR ALTER FUNCTION TestFunction()
RETURNS TABLE
AS RETURN
WITH NumberList AS (
    SELECT  1 AS Number
    UNION ALL
    SELECT  Number + 1
    FROM    NumberList
    WHERE   Number < 1000
)
SELECT  Number
FROM    NumberList

但在执行此函数时:

SELECT  *
FROM    TestFunction()

然后,它返回以下错误:

Msg 530, Level 16, State 1, Line 1
The statement terminated. The maximum recursion 100 has been exhausted before statement completion.

是否可以在函数内添加第OPTION (MAXRECURSION 0)条?我认为对于函数的用户来说,在执行函数时不必记住添加OPTION子句会很方便.

推荐答案

我认为生成1到1000之间的数字的更好方法是使用MAST..SPT_VALUES,如下所示:

CREATE OR ALTER FUNCTION TestFunction()
RETURNS TABLE
AS RETURN
  
WITH NumberList AS (
  SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS Number
  FROM master..spt_values
)
SELECT Number
FROM NumberList
WHERE Number <= 1000;

select * from  TestFunction()

+------------------------------------+
|               Number               |
+------------------------------------+
| 1                                  |
| 2                                  |
| 3                                  |
| ... --4 to 995 omitted for brevity |
| 996                                |
| 997                                |
| 998                                |
| 1000                               |
+------------------------------------+

fiddle

Sql相关问答推荐

当编号和版本的唯一状态更改时报告

Postgres,使用iLike运算符从json数组中搜索的工作方式与从常规表中搜索不同

更新在两个或多个面中具有交点的面

使用sede获取不一定有两个不同标签的所有问题

如何根据给定条件PostgreSQL迭代减少组中的行数

数组列的postgres更新查询

是否可以为表中的所有列生成散列值?

如何设计一个调用嵌套函数并仅在所有被调用的嵌套函数都提交时才提交的事务,例如,如果一个子函数失败则中止?

Select 列组(按同一表格中的另一列分组)Laravel 10

将两列相加为同一表中的行的查询

如何为缺少的类别添加行

使用与JOIN一起使用的查询后进行分页和排序

使用特定的Order By子句随机化SQL输出

无法访问级联删除导致的触发器中已删除的外键记录

在特定条件下使用 LAG,确定要采用什么 LAG 值?

错误:postgresql 中缺少表评级的 FROM 子句条目

SQL 将 Varchar 转换为日期

函数调用作为插入值语句中的参数

如何在 PL/SQL 中区分返回的 XML 值?

如何在 RavenDB Studio (RQL) 中插入更新文档