Вставка строк в табличную переменную с использованием рекурсивной табличной функции - PullRequest
0 голосов
/ 19 марта 2019
CREATE function [dbo].[fnList](@id INT, @parent INT) RETURNS @res TABLE(
    [id] INT,
    [parent] INT,
    [parent_parent] INT,
    [amount] FLOAT,
    [cost] FLOAT,
    [table] VARCHAR(100)
)
BEGIN

    INSERT INTO @res
    SELECT * FROM SomeTable

    --Here I want to insert some more values

    INSERT INTO @res
    SELECT dbo.fnList(Results.id, Results.parent)
    FROM @res Results WHERE Results.[table] = 'SomeValue' AND Results.parent = @id

END

Функция рекурсивная. Когда я вызываю функцию, я получаю сообщение об ошибке:

Невозможно найти ни столбец "dbo", ни пользовательскую функцию, ни агрегат "dbo.fnList", или имя неоднозначно.

Проблема в последней части, после комментария. Я хочу вставить несколько строк в @res. В res есть записи с таблицей = 'SomeValue' и 'OtherValue'. Для первых значений я хочу снова вызвать функцию. Как мне это сделать?

1 Ответ

0 голосов
/ 19 марта 2019

dbo.fnList является табличной функцией.Вы вызываете это внутри себя, как если бы это была скалярная функция.то есть

SELECT dbo.fnList(Results.id, Results.parent)

, в отличие от правильного синтаксиса:

SELECT * FROM dbo.fnList(Results.id, Results.parent)

Конечно, вышеприведенное не будет работать как Resultsсам по себе псевдоним таблицы, а не целое число.Таким образом, вам понадобится курсор для циклического просмотра результатов и вызова dbo.fnList.

Даже если вы сможете исправить синтаксис, тем не менее, несомненно, вы быстро столкнетесь с проблемами с максимальным уровнем вложенности 32?

Пользовательские функции могут быть вложенными;то есть одна пользовательская функция может вызывать другую.Уровень вложенности увеличивается, когда вызываемая функция начинает выполнение, и уменьшается, когда вызываемая функция заканчивает выполнение.Пользовательские функции могут быть вложены до 32 уровней.Превышение максимальных уровней вложенности приводит к сбою всей цепочки вызывающих функций.

Похоже, вам придется либо добавить много циклов в функцию, либо переосмыслить решение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...