Итерация по строкам в SQL Server 2008 - PullRequest
19 голосов
/ 07 июля 2011

Рассмотрим таблицу SAMPLE:

id       integer
name     nvarchar(10)

Существует сохраненный процесс с именем myproc.Требуется только один параметр (который является id)

Если в качестве параметра указано имя, найдите все строки с name = @nameparameter и передайте все эти идентификаторы в myproc

, например:

sample->
1   mark
2   mark
3   stu
41  mark

Когда передано mark, 1 ,2 and 41 должно быть передано myproc индивидуально.

т.е. должно произойти следующее:

execute myproc 1
execute myproc 2
execute myproc 41

Я могу 'Не трогайте myproc и не смотрите его содержание.Мне просто нужно передать ему значения.

Ответы [ 3 ]

42 голосов
/ 07 июля 2011

Если вы должны повторить (*), используйте конструкцию, предназначенную для этого - курсор .Много оскорблено, но если оно наиболее четко выражает ваши намерения, я говорю, используйте его:

DECLARE @ID int
DECLARE IDs CURSOR LOCAL FOR select ID from SAMPLE where Name = @NameParameter

OPEN IDs
FETCH NEXT FROM IDs into @ID
WHILE @@FETCH_STATUS = 0
BEGIN
    exec myproc @ID

    FETCH NEXT FROM IDs into @ID
END

CLOSE IDs
DEALLOCATE IDs

(*) Этот ответ недавно получил несколько голосов, но я чувствую, что должен включить свой оригиналздесь также прокомментируйте и добавьте несколько общих советов:

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

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

Вы 'Намного лучше сначала попытаться сформулировать, что вы хотите, с точки зрения набора всех строк, на которые нужно воздействовать - каково общее изменение, которое должно быть достигнуто?- а затем попытайтесь сформулировать запрос, который инкапсулирует эту цель.* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *} * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}}}}}} * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}}}}}}}}

6 голосов
/ 07 июля 2011

Я просто объявляю временную таблицу @sample и вставляю все строки, которые имеют имя = 'rahul', а также беру столбец состояния, чтобы проверить, повторяется ли строка. И используя цикл while, я перебираю все строки временноготаблица @sample со всеми идентификаторами name = 'rahul'

use dumme

Declare @Name nvarchar(50)
set @Name='Rahul'
DECLARE @sample table (

    ID int,
    Status varchar(500)

    )
insert into @sample (ID,status) select ID,0 from sample where sample=@name
while ((select count(Id) from @sample where status=0 )>0) 
begin
    select top 1  Id  from @sample where status=0 order by Id
    update @sample set status=1  where Id=(select top 1  Id  from @sample where status=0 order by Id) 
end
0 голосов
/ 07 июля 2011
Declare @retStr varchar(100)

select @retStr = COALESCE(@retStr, '') + sample.ID + ', '
from sample 
WHERE sample.Name = @nameparameter 
select  @retStr = ltrim(rtrim(substring(@retStr , 1, len(@retStr )- 1)))

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