You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否在T-SQL(SQL Server)函数内使用OPTION子句?

在T-SQL表值函数中设置MAXRECURSION的解决方案

你遇到的问题是SQL Server的语法限制导致的:内联表值函数(即RETURNS TABLE AS RETURN这种形式)不允许在函数内部的查询中使用OPTION子句,所以直接添加OPTION (MAXRECURSION 0)会触发语法错误;但不加的话,递归CTE默认的最大递归深度是100,生成1000个数字时就会超出限制报错。

要实现让使用者无需额外添加MAXRECURSION选项的需求,有两种可行方案:

方案一:改用多语句表值函数

多语句表值函数支持在内部查询中使用OPTION子句,具体写法如下:

CREATE OR ALTER FUNCTION TestFunction()
RETURNS @Result TABLE (Number INT)
AS
BEGIN
    WITH NumberList AS (
        SELECT 1 AS Number
        UNION ALL
        SELECT Number + 1
        FROM NumberList
        WHERE Number < 1000
    )
    INSERT INTO @Result
    SELECT Number
    FROM NumberList
    OPTION (MAXRECURSION 0);

    RETURN;
END;

调用时直接执行SELECT * FROM TestFunction()即可,不会再触发递归深度超出的错误。

方案二:改用非递归方式生成数字列表

递归CTE生成连续数字的性能通常不如非递归方法,你可以利用系统表的笛卡尔积来生成序列,彻底避免递归深度问题:

CREATE OR ALTER FUNCTION TestFunction()
RETURNS TABLE
AS RETURN
SELECT TOP(1000) ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS Number
FROM sys.all_columns ac1
CROSS JOIN sys.all_columns ac2;

这种方式不需要递归,自然也不会受到递归深度限制,同时内联表值函数的性能优势也得以保留。

内容的提问来源于stack exchange,提问作者Daniel Jonsson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 04:27:18