хранимая процедура рекурсии в SQL Server - PullRequest
1 голос
/ 17 июля 2010

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

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

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

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

РЕДАКТИРОВАТЬ: для уточнения фактического расчета, поскольку код усложняется другими вещами и может усложнить дело -

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

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

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

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

Ответы [ 5 ]

3 голосов
/ 17 июля 2010

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

1 голос
/ 17 июля 2010

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

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

http://www.simple -talk.com / SQL / T-SQL-программирование / конкатенация-строка-значения-в-Transact-SQL / # _ Toc205129484 * * тысяча двадцать-две

0 голосов
/ 18 октября 2016
DECLARE StudentdIDCursor CURSOR LOCAL FOR SELECT ...blahblah

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

0 голосов
/ 17 июля 2010

Объявление курсора с ЛОКАЛЬНОЙ областью действия может решить проблему.Хотя я не уверен, как курсор будет действовать в рекурсивном контексте.

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

0 голосов
/ 17 июля 2010

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

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

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