Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Как да изпълня съхранена процедура веднъж за всеки ред, върнат от заявка?

използвайте курсор

ДОПЪЛНЕНИЕ:[Пример за MS SQL курсор]

declare @field1 int
declare @field2 int
declare cur CURSOR LOCAL for
    select field1, field2 from sometable where someotherfield is null

open cur

fetch next from cur into @field1, @field2

while @@FETCH_STATUS = 0 BEGIN

    --execute your sproc on each row
    exec uspYourSproc @field1, @field2

    fetch next from cur into @field1, @field2
END

close cur
deallocate cur

в MS SQL, ето примерна статия

имайте предвид, че курсорите са по-бавни от операциите, базирани на набори, но по-бързи от ръчните while цикли; повече подробности в този въпрос SO

ДОПЪЛНЕНИЕ 2:ако ще обработвате повече от само няколко записа, първо ги издърпайте във временна таблица и пуснете курсора върху временната таблица; това ще попречи на SQL да ескалира в заключвания на таблици и ще ускори операцията

ДОПЪЛНЕНИЕ 3:и разбира се, ако можете да вградите каквото и да прави вашата съхранена процедура към всеки потребителски идентификатор и да изпълните цялото нещо като един оператор за актуализиране на SQL, това би било оптимално



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Проектиране на база данни:Изчисляване на салдото по сметката

  2. Голяма сделка:SQL Server 2016 Service Pack 1

  3. Защо cast/convert от int връща звездичка

  4. SQL Server ANSI_NULLS Обяснено

  5. Създаване на локална база данни на SQL Server