Подтвердить что ты не робот

Итерация по строкам в SQL Server 2008

Рассмотрим таблицу 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 и не видеть его содержимое. Мне просто нужно передать значения.

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

Я просто объявляю временную таблицу @sample и вставляю все строки, которые имеют name= '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 [email protected]
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

Ответ 3

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 ,'')