CHill60
SQL-это язык, основанный на множествах. Очень и очень редко вам нужно использовать петлю.
Рассмотрите возможность изменения хранимой процедуры для получения требуемых данных путем присоединения к ней table
вместо.
Если "некоторая логика" не пытается обновить таблицу, просто верните значение, а затем создайте функцию и вызовите ее как часть select, например
select [Id], [name], MyFunction([name]) as Result from [table]
Некоторое время назад я написал статью об альтернативах циклам, но она также включает в себя некоторые примеры циклов, если вам абсолютно необходимо использовать один из них - см.
Циклы обработки в SQL Server[
^]
Редактировать после комментария OP
---------------------
Цитата:
что делает моя хранимая процедура
это вставка в две таблицы с использованием одного и того же идентификатора и удаление из 2 других таблиц с использованием одного и того же идентификатора
create procedure doLogic
@Id int
Insert into table1(Id) values @Id
Insert into table2(Id) values @Id
delete from table3 where Id = @Id
delete from table4 where Id = @Id
Return 0
Вот некоторые примеры данных, которые соответствуют таблицам, которые вы использовали в своих примерах
create table #table (id int identity(1,1), [name] varchar(50))
insert into #table ([name]) values
('name A'),('name B'),('name C'),('name D')
create table #table1 (id int)
create table #table2 (id int)
create table #table3 (id int)
insert into #table3 (id) values (3),(7)
create table #table4 (id int)
insert into #table4 (id) values (1),(4),(8),(9)
Используя этот пример данных, в хранимой процедуре я мог бы заменить
Insert into table1(Id) values @Id
Insert into table2(Id) values @Id
это делает вставку один за другим (или RBAR = строка за мучительной строкой - не помню, кто это говорит. Я посмотрю его позже), с двумя строками, которые будут делать всю таблицу
сразу т.е.
insert into #table1 select [id] from #table
insert into #table2 select [id] from #table
Я могу использовать несколько альтернативных идей для замены
delete from table3 where Id = @Id
delete from table4 where Id = @Id
Первый из них тривиален и просто удаляет все, что соответствует ...
delete from #table3 where [id] in (select id from #table)
Этот второй по сути точно такой же, но я включил его, чтобы попытаться показать, что вы можете сделать подзапрос таким сложным, как вам нравится
delete from #table4 where [id] in (select #table4.id from #table inner join #table4 on #table.id = #table4.id)
Вы также упоминали
Цитата:
и можете ли вы объяснить пример функции, который вы упомянули больше? как заменить его на select, который возвращает все записи? что мне нужно передать в хранимую процедуру?
Пользовательская функция не может изменять записи, она может возвращать только значения, поэтому теперь, когда я знаю, что вы пытаетесь сделать в своей хранимой процедуре, это неуместно. Оставь это на другой раз