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

Преминаване през редове в SQL Server 2008

Ако трябва iterate(*), използвайте конструкцията, предназначена да го направи - курсора . Много злословен, но ако най-ясно изразява намеренията ви, казвам да го използвате:

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 трябва по принцип потърсете базирано на набор решение. Целият език е ориентиран към базирани на набори решения и (на свой ред) оптимизаторът е ориентиран към това да накара базираните на набори решения да работят добре. На свой ред инструментите, които имаме на разположение за настройка оптимизаторът също е ориентиран към множество - напр. прилагане на индекси към таблици.

Има няколко ситуации, при които итерацията е най-добрият подход. Това са малко и могат да бъдат оприличени на правилата на Джаксън за оптимизиране - не го правете - и (само за експерти) не го правете още .

Много по-добре е първо да се опитате да формулирате какво искате по отношение на набора от всички редове, които да бъдат засегнати - каква е общата промяна, която трябва да се постигне? - и след това се опитайте да формулирате заявка, която капсулира тази цел. Само ако заявката, получена по този начин, не се изпълнява адекватно (или има някакъв друг компонент, който не може да направи нищо друго освен да се справи с всеки ред поотделно), трябва да помислите итерация.



  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 2008 Високо натоварване на процесора

  3. Може ли SQL Server да изпрати уеб заявка?

  4. exec не успя, защото името не е валиден идентификатор?

  5. Урок по SQL (DDL, DML) на примера на диалект на MS SQL Server