我可以在 T-SQL (SQL Server) 的函数内使用 OPTION 子句吗?

问题描述 投票:0回答:1

我想写一个这样的函数:

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)
?我认为对于函数的用户来说,在执行函数时不必记住添加选项子句会很方便。

sql sql-server tsql sql-server-2019 sql-function
1个回答
0
投票

我认为生成 1 到 1000 之间的数字的更好方法是使用 master..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()
数量
1
2
3
4
5
6
7
8
9
10
11
....
....
....
990
991
992
993
994
995
996
997
998
999
1000

小提琴

© www.soinside.com 2019 - 2024. All rights reserved.