AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 101215
Accepted
Eric S
Eric S
Asked: 2015-05-12 11:59:33 +0800 CST2015-05-12 11:59:33 +0800 CST 2015-05-12 11:59:33 +0800 CST

是否可以在函数中更改 CTE 的递归级别?

  • 772

我创建了一个接受字符串的函数,它返回一个表格,其中包含字符串中每个字母的位置和字符。但是,由于 CTE 递归限制为 100 级,如果传入的字符串比这长,它就会失败。我知道我可以OPTION (MAXRECURSION [value])用来更改限制,但是在定义函数时这似乎不起作用。

我的功能:

CREATE FUNCTION [dbo].[StringSplit]
(
    @String NVARCHAR(MAX)    
)
RETURNS TABLE
AS
RETURN
(   
    WITH Split(Pos,Digit)
    AS(
        SELECT 1 AS Pos, LEFT(@String, 1) AS Digit
        UNION ALL
        SELECT Pos + 1, RIGHT(LEFT(@String, Pos + 1), 1)
            FROM Split
            WHERE Pos < LEN(@String)
    )
    SELECT Pos, Digit FROM Split    
    ---OPTION (MAXRECURSION 0) -- Unable to create function if this line is UnCommented)
)

因此,由于达到 100 个默认限制,以下 sql 代码将失败:

SELECT * FROM Impact_Work.dbo.StringSplit('How long of a sentence can I possibly think of for testing thingymadoodlers out. Yes I do love the word thingymadoodlers so don''t judge me!')

现在,如果我添加该选项,它将起作用

SELECT * FROM Impact_Work.dbo.StringSplit('How long of a sentence can I possibly think of for testing thingymadoodlers out. Yes I do love the word thingymadoodlers so don''t judge me!')
OPTION (MAXRECURSION 0)

然而,那些使用这个函数的人不太可能记得在他们的查询中添加这个额外的位,所以我希望在它自己的函数中添加这个。这可能吗?(是的,当我需要拿出一些字符串进行测试时,我确实会胡思乱想)

sql-server sql-server-2014
  • 3 3 个回答
  • 3231 Views

3 个回答

  • Voted
  1. Best Answer
    Mister Magoo
    2015-05-16T04:34:45+08:002015-05-16T04:34:45+08:00

    我相信这就是 Mikael 所暗示的。

    如果没有 MAX 参数,你会发现事情工作得更快,你真的需要那么大的字符串吗?

    CREATE FUNCTION [dbo].[StringSplit]
    (
        @String NVARCHAR(MAX)    
    )
    RETURNS TABLE
    WITH SCHEMABINDING
    AS
    RETURN
    (   
      WITH E1(N) AS (
                     SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL
                     SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL
                     SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1
                    ),                          --10E+1 or 10 rows
           E2(N) AS (SELECT 1 FROM E1 a, E1 b), --10E+2 or 100 rows
           E4(N) AS (SELECT 1 FROM E2 a, E2 b), --10E+4 or 10,000 rows max
     cteTally(N) AS (SELECT TOP (ISNULL(DATALENGTH(@String),0)) ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) FROM E4)
            SELECT N AS Pos, substring(@String, N, 1) AS Digit
            from cteTally
    );
    
    • 2
  2. Eric S
    2015-05-13T10:29:54+08:002015-05-13T10:29:54+08:00

    由于看起来无法更改特定函数的递归级别,因此出于几个原因,我决定将其保留原样。它解决了我设计它的问题,并且我在函数中添加了一条注释,说明如果人们决定将它用于其他事情,他们可以如何将其用于查询。

    • 1
  3. RLF
    2015-05-12T12:11:59+08:002015-05-12T12:11:59+08:00

    实际上,100 次递归的限制是默认值。

    从这个页面:https ://msdn.microsoft.com/en-us/library/ms181714.aspx

    它部分说:

    MAXRECURSION 号码(我看到你已经找到了)说:

    指定此查询允许的最大递归数。number 是介于 0 和 32767 之间的非负整数。指定 0 时,不应用限制。如果未指定此选项,则服务器的默认限制为 100。

    在查询执行期间达到指定的或默认的 MAXRECURSION 限制数时,查询将结束并返回错误。

    但是,递归可能比其他方法更昂贵。

    注意:这不需要是服务器范围的设置,因为它可以是查询提示。如果您有自己的函数用于此字符串解析,那么该函数可以使用 MAXRECURSION (0) 而不会影响可能使用递归的其他代码。

    • 0

相关问题

  • SQL Server - 使用聚集索引时如何存储数据页

  • 我需要为每种类型的查询使用单独的索引,还是一个多列索引可以工作?

  • 什么时候应该使用唯一约束而不是唯一索引?

  • 死锁的主要原因是什么,可以预防吗?

  • 如何确定是否需要或需要索引

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve