Альтернатива курсорам в SYBASE? - PullRequest
2 голосов
/ 03 марта 2012

Скажем, я имею дело с 10 библиотечными карточками, каждая карточка имеет значения клиентов (например, номер участника, имя члена ...), и мне нужно обновить значение для каждой карточки.

Если я хочу получить все десять из базы данных, но хочу обновлять каждую строку по одной, есть ли альтернатива курсору? Я знаю, что цикл while может сработать, но как я смогу захватывать по одной строке каждый раз, когда цикл повторяется, пока я не закончу со всеми 10 картами?

Ответы [ 2 ]

9 голосов
/ 03 марта 2012

Не нужно использовать курсоры.Я использую это большую часть времени:

declare @uid int -- this is the type unique index on the table you're updating

-- Copy out the unique ids of the rows you want to update to a temporary table
select uid into #temp from customers -- you can use a where condition here

-- Loop through the rows of the temp table
while exists (select 1 from #temp)
begin
  set rowcount 1
  select @uid = uid from #temp -- pull one uid from the temp table
  set rowcount 0
  delete from #temp where uid = @uid -- delete that uid from the temp table

  -- Do something with the uid you have
  update customers set name = 'Joe Shmoe' where uid = @uid

end
0 голосов
/ 25 мая 2013

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

declare @uid int
select @uid = 0 -- assume the uids in table are > 0
declare @rowsaf int
select @rowsaf = 1

while @rowsaf > 1
begin
    set rowcount 1
    select @uid = uid from customers where uid > @uid
    select @rowsaf = @@rowcount

    -- update the row using @uid
end

set rowcount 0

Вот статья , которая подробно объясняет это.

...