Как использовать рекурсивную табличную функцию в SQL SERVER 2005 - PullRequest
2 голосов
/ 06 июня 2009

Я делаю функцию разделения в 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

ОШИБКА: Сообщение 102, Уровень 15, Состояние 1, Процедура fnSplit2, Строка 38 Неверный синтаксис рядом с 'fnSplit2'.

Не могу ли я использовать рекурсивную табличную функцию в SQL SERVER?

Я искал в Google и обнаружил, что возможны скалярные рекурсивные функции?

Пожалуйста, предоставьте код и в то же время сообщите мне об ошибке, которую я совершаю.

Благодарим за любую помощь!

Ответы [ 2 ]

5 голосов
/ 06 июня 2009

Ответ:

Вы неправильно вызываете fnSplit2. Табличная функция - это именно то, что «таблица» ... она идет туда, куда «настоящая» таблица помещается в предложении FROM.

Комментарий:

Если вы действительно должны разделить CSV в SQL, прочитайте статью Эрланда Соммарского о различных способах сделать это правильно. Обратите внимание, что он не перечисляет рекурсивный метод TVF ...

1 голос
/ 07 июня 2009

Кроме того, вам, вероятно, также нужно использовать имя схемы в ссылке: "dbo.fnSplit2 (..)" И, как упоминалось ранее, используйте его в качестве ссылки на таблицу.

...