拆分功能错误 - 语句终止。在语句完成之前,最大递归100已用尽 [英] Split function error - The statement terminated. The maximum recursion 100 has been exhausted before statement completion

查看:65
本文介绍了拆分功能错误 - 语句终止。在语句完成之前,最大递归100已用尽的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我一直在使用下面这段代码来分割输入ID,如FUNCTION_split(''1,2,3'','','')。现在问题是它不适用于列表中超过100个的情况。反正有没有修改这段代码来处理超过100个ID?

I have been using this below piece of code to split the input id like FUNCTION_split(''1,2,3'','',''). Now the problem is it is not working for cases more than 100 in the list. Is there anyway to modify this piece of code to handle more than 100 id''s?

CREATE FUNCTION [dbo].[FUNCTION_split]
   (
    @list NVARCHAR(MAX),
    @delimiter NCHAR(1) = '',''
     )
  RETURNS TABLE
   AS
   RETURN
     WITH cte_list([BeginChar], [EndChar]) AS (
      SELECT [BeginChar] = CONVERT(BIGINT, 1), [EndChar] = CHARINDEX(@delimiter, @list + @delimiter)
       UNION ALL
        SELECT [BeginChar] = [EndChar] + 1, 
         [EndChar] = CHARINDEX(@delimiter, @list + @delimiter, [EndChar] + 1)
          FROM cte_list WHERE [EndChar] > 0
          )
     SELECT LTRIM(RTRIM(SUBSTRING(@list, [BeginChar],
      CASE WHEN [EndChar] > 0 THEN [EndChar] - [BeginChar] ELSE 0 END))) AS [ParsedValue]
        FROM cte_list WHERE [EndChar] > 0 ;

推荐答案

您好,



使用以下逻辑.. ..

Hi,

Use the following Logic ....
-- Split Function (Method 1)
CREATE FUNCTION [dbo].[fnSplit](
@delimited NVARCHAR(MAX),
@delimiter NVARCHAR(100)
) RETURNS @t TABLE (id INT IDENTITY(1,1), val NVARCHAR(MAX))
AS
BEGIN
DECLARE @xml XML
    SET @xml = N'<t>' + REPLACE(@delimited,@delimiter,'</t><t>') + '</t>'

    INSERT INTO @t(val)
    SELECT  r.value('.','varchar(MAX)') as item
    FROM  @xml.nodes('/t') as records(r)
RETURN
END
SELECT val FROM fnSplit('Micro Soft,SQL Server 2008, R2',',')
-- Note : If Record Count is Not required then remove ID column from "fnSplit" Function.

-- Split Function (Method 2)
IF OBJECT_ID('fnSplit') IS NOT NULL DROP FUNCTION dbo.fnSplit
GO
CREATE FUNCTION dbo.fnSplit(
    @InputString VARCHAR(8000), -- List of delimited items
    @Delimiter CHAR(1) = ',') -- delimiter that separates items)
RETURNS @List TABLE (ColumnValues VARCHAR(8000))
AS
BEGIN
    DECLARE @NextString NVARCHAR(40), @Pos INT

    SET @InputString = @InputString + @Delimiter
    SET @Pos = CHARINDEX(@Delimiter,@InputString)

    WHILE (@pos <> 0)
    BEGIN
	   SET @NextString = SUBSTRING(@InputString,1,@Pos - 1)
	   INSERT INTO @List(ColumnValues) SELECT @NextString 
	   SET @InputString = SUBSTRING(@InputString,@pos+1,len(@InputString))
	   SET @pos = CHARINDEX(@Delimiter,@InputString)
    END 
    RETURN 
END
GO
SELECT ColumnValues FROM fnSplit('Micro Soft,SQL Server 2008, R2',',')



问候,

GVPrabu


Regards,
GVPrabu


试试这个



创建以下功能

try this

create below function
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
GO
CREATE FUNCTION [dbo].[ParseValues]
(@String varchar(8000), @Delimiter varchar(max) )
RETURNS @RESULTS TABLE (ID int identity(1,1), Val varchar(max))
AS
BEGIN
    DECLARE @Value varchar(max)
    WHILE @String is not null
    BEGIN
        SELECT @Value=CASE WHEN PATINDEX('%'+@Delimiter+'%',@String) >0 THEN LEFT(
          @String,PATINDEX('%'+@Delimiter+'%',@String)-1) ELSE @String END, 
          @String=CASE WHEN PATINDEX('%'+@Delimiter+'%',@String) >0 THEN SUBSTRING(
          @String,PATINDEX('%'+@Delimiter+'%',@String)+LEN(@Delimiter),LEN(@String)) ELSE NULL END
        INSERT INTO @RESULTS (Val)
        SELECT @Value
    END
RETURN
END





使用如下所示



use as below

select Val from dbo.ParseValues('1,2,3',',')





快乐编码!

:)



Happy Coding!
:)


select * from dbo.FUNCTION_split(''1,2,3'','','') OPTION (MAXRECURSION 0


这篇关于拆分功能错误 - 语句终止。在语句完成之前,最大递归100已用尽的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆