Используя курсор или цикл while или любой другой способ?
Я прошел несколько обсуждений, связанных (не точных) с этим, но я хочу знать правильное решение моей ситуации, поэтому отправляю этот вопрос.
Мне нужно выбрать несколько записей из таблицы на основе некоторых условий и передать значения каждой записи в SP.
Я подумал об использовании курсора для циклического прохождения набора записей, после некоторого поиска в Google, которое я нашел, в то время как цикл также используется, и есть много дискуссий о том, какой из них лучший, и большинство из них сказали, что это зависит от ситуации. Теперь я не могу судить о своей ситуации, поэтому выставляюсь перед экспертами.
Вот цикл while, о котором я подумал:
Table Test
{
id int
value int
-- Some more fields
}
WHILE EXISTS(SELECT TOP 1 id FROM Test WHERE isValid=1)
BEGIN
DECLARE @id AS INT
DECLARE @value AS INT
SELECT TOP 1 @id=id, @value=value FROM Test WHERE isValid=1
EXEC SP_SomeProcessingSP @id, @value -- Some more fields passed to it from above table
-- After execution of the above SP I need to update the record to invalid
UPDATE Test SET isValid = 0 WHERE id=@id
END
Этот подход лучше, чем курсор? Было бы замечательно, если бы кто-нибудь смог придумать лучшее решение без курсора и времени (я хочу избежать обоих).
Редактировать: Модифицировал блок while и также дал пример таблицы. Теперь SP, который вызывается внутри этого блока while, получает доступ к данным из нескольких таблиц, выполняет некоторую обработку и вставляет данные в пару других таблиц.
2 ответа
Похоже, раунд о том, как сделать:
UPDATE Test SET isValid = 0 WHERE isValid = 1
Что касается того, какой подход лучше, вы не предоставили достаточно деталей для ответа.
Это полностью зависит от того, что вы пытаетесь сделать. Возможно, рекурсивный CTE решит ваши проблемы без необходимости вызова хранимой процедуры. Возможно, хорошее соединение решит это. Возможно, было бы лучше другое решение.
Вы должны объяснить, чего именно вы пытаетесь достичь.
Вы можете изменить хранимую процедуру, чтобы принимать таблицы в качестве входных данных, а затем выбрать переменную таблицы. Для обновления вы можете присоединиться к этой табличной переменной.
Проверьте Табличные Значимые Параметры здесь: http://msdn.microsoft.com/en-us/library/bb510489.aspx