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