代码之家  ›  专栏  ›  技术社区  ›  priyanka.sarkar

如何在SQL Server 2005中使用递归表值函数

  •  2
  • priyanka.sarkar  · 技术社区  · 16 年前

    我正在SQL Server 2005中创建一个拆分函数。

    我已经通过使用while循环来完成了。

    但我对此并不满意。我想用递归函数来实现。

    我已经在C里做过了。 现在我正在SQL Server 2005中绘制相同的图。但我收到一个编译错误。

    这是我的密码

    ALTER FUNCTION [dbo].[fnSplit2] 
    (
    
        @OLDSTRING AS VARCHAR(100),
        @DELIMETER AS VARCHAR(1)
    )
    
    RETURNS @MYTABLE TABLE(COUNTER INT,STRINGVAL VARCHAR(100)) 
        AS
            Begin 
    
                DECLARE @NEWSTRING AS VARCHAR(100)
                DECLARE @POS AS INT
                DECLARE @LEN AS INT
                DECLARE @COUNTER AS INT 
    
                SET @NEWSTRING = '';        
                SET @LEN = LEN(@OLDSTRING)
                SET @COUNTER = 0
                SET @POS = CHARINDEX(@DELIMETER, @OLDSTRING) 
    
                IF(@POS > 0)
    
                    BEGIN 
    
                        SET @COUNTER = @COUNTER +1
    
                        INSERT INTO @MYTABLE(COUNTER,STRINGVAL) VALUES(@COUNTER,@NEWSTRING + SUBSTRING(@OLDSTRING,0, @POS))
                        SET @OLDSTRING = SUBSTRING(@OLDSTRING,0, @POS)
                        fnSplit2(@OLDSTRING,@DELIMETER);
    
                    END
    
                ELSE
    
                    BEGIN
                        SET @COUNTER = @COUNTER +1
                        INSERT INTO @MYTABLE(COUNTER,STRINGVAL) values(@COUNTER,@OLDSTRING)
                    END
    
        RETURN
    END
    

    错误是: MSG 102,15级,状态1,程序FNSplit2,第38行 “fnsplit2”附近有语法错误。

    无法在SQL Server中使用递归表值函数?

    我在谷歌搜索,发现标量值递归函数是可能的?

    请提供代码,同时告诉我所犯的错误。

    感谢你的帮助!

    2 回复  |  直到 16 年前
        1
  •  5
  •   gbn    16 年前

    答:

    您用错误的方式调用FnsSplit2。一个表值函数就是:一个“表”…它指向“real”表在FROM子句中的位置。

    评论:

    如果你 真的? 必须在SQL中拆分CSV,读取 Erland Sommarskog's article 以各种方式正确地完成它。注意,他没有列出递归TVF方法…

        2
  •  1
  •   RBarryYoung    16 年前

    另外,您可能还需要在引用中使用模式名:“dbo.fnsplit2(..)”。如前所述,将其用作表引用。