хранимая рекурсия в SQL Server
У меня есть ситуация, когда я хочу, чтобы хранимый процесс возвращал таблицу, которая сама рекурсивно вызывает ее как часть ее вычисления.
К сожалению, SQL Server не имеет этого и дает мне ошибку в том смысле, что оба не могут объявить курсор, который уже существует, и о том, что он не может вставить и вставить инструкцию exec.
Могу ли я обойти некоторые из этих проблем, используя функцию? Есть ли еще лучший способ сделать это?
- Вызовите хранимую процедуру, указав только параметры со значением
- Добавление или чтение номера версии в хранимые процедуры или функции SQL
- Ошибка при добавлении параметров в вызов хранимой процедуры
- Усиливает ли триггеры производительность? Вставляемые и удаленные таблицы?
- SQL Server Хранимая процедура Увеличение max столбца varchar и возвращаемого вывода
Расчет по своей сути рекурсивный по своей природе, поэтому нет никакого обойти это, используя соединения, насколько я могу судить.
EDIT: уточнить фактический расчет, так как код усложняется другими материалами и может усложнить вопрос –
предположим, что таблица A имеет столбцы (containerID, objID, objType, weight), а таблица B имеет столбцы (itemID, value).
objType в таблице A сообщает вам, является ли objID в таблице A контейнером (снова в таблице A) или is и itemID из таблицы B.
(containerID, objID) является первичным ключом в таблице A, как itemID в таблице B.
Обычно контейнер содержит от десятков до сотен предметов или других контейнеров. Надеемся, что глубина рекурсии не более десятка уровней. (угадывание). Расчет состоит в том, чтобы получить средневзвешенное значение.
- Хранимая процедура SQL Server - как отсортировать записи с древовидным форматом?
- sp_depends в SQL Server, каковы возможные зависимости?
- Как выполнять все представления в базе данных с помощью хранимой процедуры
- TSQL: объединение получается из двух выборок (процедур?)
- SQL Server - создать временную таблицу, если ее не существует
- системные хранимые процедуры и параметры таблицы
- Сценарий SQL Archive
- Как проверить целостность хранимых процедур
вы получаете очень мало информации, в результате здесь есть предположение: попробуйте использовать рекурсивные запросы с использованием общих выражений таблицы , попробуйте установить операции на основе, а не курсор, или попробуйте использовать динамический SQL.
Эта статья дает 7 различных способов делать то, что вы пытаетесь сделать.
- Рекурсивные методы CTE
- XML-методы blackbox
- Использование Common Language Runtime.
- Скалярный UDF с рекурсией
- Табличная ценность UDF с циклом WHILE.
- Динамический SQL
- Подход курсора.
Я думаю, вы получили сообщение об ошибке, потому что одно и то же имя курсора, вероятно, используется каждым рекурсивным вызовом, и вложенный вызов не может открыть курсор с тем же именем, пока родительский вызов не закроет курсор. Если возможно, вы можете сделать динамическое имя курсора, возможно, что-то простое, как 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
термин. Каждый раз он генерирует отдельное определение курсора за кулисами.