Выполнить хранимую процедуру для всего набора результатов без использования курсора - PullRequest
4 голосов
/ 21 сентября 2010

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

Есть ли другой способ, кроме как с помощью курсора сделать выше?

UPDATE
Кто-нибудь может дать пример кода хотя бы с циклом while?

Ответы [ 5 ]

1 голос
/ 21 сентября 2010

Я бы преобразовал процедуру для использования табличной переменной и передал набор данных, используя это.Прелесть этого в том, что после внесения изменений вы можете использовать один и тот же процесс для вставок в одну строку или в несколько строк и делать это в наборах, а не по строкам.Вам нужен SQL Server 2008 для этого.

1 голос
/ 21 сентября 2010

Вам нужно будет преобразовать ваш процесс в UDF табличного значения из нескольких операторов.

create function dbo.udf_Whatever_That_Proc_Did(
     @SameOldParam as int
)
AS Begin
Declare --same variables here

/*same code in your proc that does not 
    - invoke nondeterministic built-in function
    - change state of database
    - return messages to caller
*/

Return
End

Для использования функции:

Select * 
from dbo.udf_Whatever_That_Proc_Did(9999)
1 голос
/ 21 сентября 2010

В T-SQL есть только 2 способа итерации.Пока цикл или курсоры.Если вы не хотите использовать курсоры, вы должны использовать цикл while, как сказал Джеймс Уайзман.

Другим способом решения этой ситуации является SQL CLR.Если вы используете SQL CLR, вы можете использовать все итерации C # (или VB.Net) для достижения своей цели.

0 голосов
/ 21 сентября 2010

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

0 голосов
/ 21 сентября 2010

Альтернативой курсору является цикл while, который иногда рекомендуется в качестве альтернативы курсорам SQL.

Это проблема, которую вы хотите избежать при использовании курсора, или вы хотитевообще избежать итерации?

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