С помощью курсора или цикла while или любым другим способом? - PullRequest
2 голосов
/ 06 мая 2011

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

Мне нужно выбрать некоторые записи из таблицы на основенекоторые условия и передать каждую запись значения в 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 и курсора (я хочу избежать обоих).

Edit: Модифицировал блок while и также дал пример таблицы.Теперь SP, который вызывается внутри этого блока while, получает доступ к данным из нескольких таблиц, выполняет некоторую обработку и вставляет данные в пару других таблиц.

Ответы [ 2 ]

1 голос
/ 06 мая 2011

Похоже на раунд того, как это сделать:

UPDATE Test SET isValid = 0 WHERE isValid = 1

Что касается того, какой подход лучше, вы не предоставили достаточно деталей для ответа.пытаемся сделать.Возможно, рекурсивный CTE решит ваши проблемы без необходимости вызова хранимой процедуры.Возможно, хорошее соединение решит это.Возможно, было бы лучше другое решение.

Вам нужно объяснить, чего именно вы пытаетесь достичь.

0 голосов
/ 06 мая 2011

Вы можете изменить хранимую процедуру, чтобы принимать таблицы в качестве входных данных, а затем выбрать переменную таблицы. Для обновления вы можете присоединиться к этой табличной переменной.

Ознакомьтесь с параметрами таблицы здесь: http://msdn.microsoft.com/en-us/library/bb510489.aspx

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