В T-SQL / SQL Server 2000 ссылка на конкретную строку набора результатов - PullRequest
1 голос
/ 18 августа 2011

Я хочу сослаться на n-ую строку #temptable (второй комментарий SQL ниже). Какое выражение позволит мне сделать это?

DECLARE @counter INT
SET @counter = 0
WHILE (@counter<count(#temptable))
--#temptable has one column and 0 or more rows
BEGIN
DECLARE @variab INT
EXEC @variab = get_next_ticket 3906, 'n', 1

INSERT INTO Student_Course_List
                SELECT  @student_id,
                -- nth result set row in #temptable, where n is @count+1
                @variab

SET @counter = @counter +1
END

Курсор (это будет работать?):

for record in (select id from #temptable) loop 
--For statements, use record.id 
end loop;

Ответы [ 2 ]

2 голосов
/ 18 августа 2011

Обычно в реляционной базе данных, такой как SQL Server, вы предпочитаете выполнять операции над множествами.Поэтому было бы лучше иметь INSERT INTO tbl SOMECOMPLEXQUERY даже с очень сложными запросами.Это гораздо предпочтительнее, чем обработка строк.В сложной системе использование курсора должно быть относительно редким явлением.

В вашем случае может показаться, что процедура get_next_ticket выполняет некоторую существенную логику, которую невозможно выполнить ориентированным на набор способом.Если вы не можете выполнить его функцию альтернативным образом, ориентированным на наборы, тогда вы бы использовали CURSOR.

. Вы бы объявили CURSOR в своем наборе SELECT whatever FROM #temptable, OPEN it, FETCH из курсора в переменные для каждого столбца, а затем использовать их во вставке.

0 голосов
/ 18 августа 2011

Вместо использования цикла while (со счетчиком, как вы делаете) для итерации таблицы, вы должны использовать курсор

Синтаксис будет:

DECLARE @id int
DECLARE c cursor for select id from #temptable
begin
  open c
    fetch next from c into @id
    WHILE (@@FETCH_STATUS = 0)
    BEGIN
      --Do stuff here
      fetch next from c into @id
    END
  close c
  deallocate c
end
...