хранимая рекурсия в SQL Server

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

К сожалению, SQL Server не имеет этого и дает мне ошибку в том смысле, что оба не могут объявить курсор, который уже существует, и о том, что он не может вставить и вставить инструкцию exec.

Могу ли я обойти некоторые из этих проблем, используя функцию? Есть ли еще лучший способ сделать это?

Расчет по своей сути рекурсивный по своей природе, поэтому нет никакого обойти это, используя соединения, насколько я могу судить.

EDIT: уточнить фактический расчет, так как код усложняется другими материалами и может усложнить вопрос –

предположим, что таблица A имеет столбцы (containerID, objID, objType, weight), а таблица B имеет столбцы (itemID, value).

objType в таблице A сообщает вам, является ли objID в таблице A контейнером (снова в таблице A) или is и itemID из таблицы B.

(containerID, objID) является первичным ключом в таблице A, как itemID в таблице B.

Обычно контейнер содержит от десятков до сотен предметов или других контейнеров. Надеемся, что глубина рекурсии не более десятка уровней. (угадывание). Расчет состоит в том, чтобы получить средневзвешенное значение.

вы получаете очень мало информации, в результате здесь есть предположение: попробуйте использовать рекурсивные запросы с использованием общих выражений таблицы , попробуйте установить операции на основе, а не курсор, или попробуйте использовать динамический SQL.

Эта статья дает 7 различных способов делать то, что вы пытаетесь сделать.

  1. Рекурсивные методы CTE
  2. XML-методы blackbox
  3. Использование Common Language Runtime.
  4. Скалярный UDF с рекурсией
  5. Табличная ценность UDF с циклом WHILE.
  6. Динамический SQL
  7. Подход курсора.

http://www.simple-talk.com/sql/t-sql-programming/concatenating-row-values-in-transact-sql/#_Toc205129484

Я думаю, вы получили сообщение об ошибке, потому что одно и то же имя курсора, вероятно, используется каждым рекурсивным вызовом, и вложенный вызов не может открыть курсор с тем же именем, пока родительский вызов не закроет курсор. Если возможно, вы можете сделать динамическое имя курсора, возможно, что-то простое, как SOME_CURSOR_{$RECURSION_DEPTH} , и вам, возможно, придется добавить глубину рекурсии в качестве параметра процедуры. Я никогда не делал ничего подобного в SQL Server, хотя я не уверен на 100%.

Не уверен в следующей проблеме / insert exec, хотя она может быть привязана к курсору.

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

Ознакомьтесь с этой статьей: http://msdn.microsoft.com/en-us/library/ms189238.aspx

 DECLARE StudentdIDCursor CURSOR LOCAL FOR SELECT ...blahblah 

Ключ – LOCAL термин. Каждый раз он генерирует отдельное определение курсора за кулисами.

  • Как я могу написать хранимую процедуру SQL Server для получения следующего вывода?
  • Отправить параметр Int из C # в хранимую процедуру
  • Хранили ли хранимые процедуры для больших наборов данных?
  • Просмотр вызова из хранимой процедуры на основе значения столбца
  • Агрегирование сообщений об ошибках в процедурах SQL Server
  • SQL Split - вставка в иерархическую структуру таблицы
  • Выполнять подзапрос, зависящий от параметра / переменной
  • Могу ли я получить результаты хранимой процедуры в курсор в другой хранимой процедуре в SQL
  • Исключение Sql: неявное преобразование из типа данных datetime в int не допускается. Используйте функцию CONVERT для запуска этого запроса
  • Как получить список параметров внутри самой хранимой процедуры
  • Необходим инструмент для автоматического отступа и форматирования хранимых процедур SQL Server
  • Interesting Posts

    CRM 2011 EmailHashBase

    Java SQL-запрос подготовить динамический параметр оператора

    MS SQL DMV для статистики производительности UDF – как найти 10 лучших худших UDF

    Скорость MIN / MAX против GROUP BY для агрегирования значений константы в группе

    как управлять отношениями учащихся и книг в системе управления библиотеками в C # .net?

    EFCore поведение отката транзакции, если процесс убит

    Что такое хороший подход при создании базы данных с множественными схемами без ссылки на NoSQL?

    Azure Automation DSC – разрешения и проблемы с модулем

    SP_HELPTEXT в Oracle

    Доступ к миграции на SQL-сервер 2012

    Каков наилучший способ узнать, является ли столбец изображения нулевым или нет?

    SQL Server: используйте ИЛИ или OR на основе условного условия в предложении where

    План выполнения против ROW_NUMBER

    SQL Server 2012, geography.STContains, неправильный результат?

    Как назвать имена файлов в базе данных и указать их местоположение в проекте Visual Studio 2015 Database?

    Давайте будем гением компьютера.