2015-08-25 5 views
1

У меня есть таблица #tmpName с одним столбцом, [Name].Использовать верхнюю часть 1, а затем удалить?

Без использования курсора я хотел бы взять каждую строку #tmpName (это технически одно имя), сделать что-то с этим именем, а затем удалить из #tmpName.

Я начал с чего-то подобного, но это очень медленно, и в итоге я получаю исключение из памяти, которое не имеет смысла в таблице из 700 строк. Я предполагаю, что это связано с тем, что я не приказывая при выполнении удаления вершины 1.

drop table #tmpName ; 
with cte as (
    select Name from [Employees] 
    group by Name 
) 
select Name into #tmpName From cte 
declare @count int = 0 
while @@rowcount <> 0 
begin 
    select top 1 Name From #tmpName order by Name asc 
    --do stuff with top 1 
    delete top (1) from #tmpName 
    select @count = @count + 1 
    select @count 
END 

я понял, то, что я мог бы использовать это DELETE, чтобы лучше удалить TOP 1, но я не уверен, как обрабатывать каждый из которых я удаляю.

WITH q AS 
    (
    SELECT TOP 1 Name into @Name 
    FROM #tmpName 
    order by Name 
    ) 
DELETE 
FROM q 

любая помощь приветствуется.

+0

'в то время как @@ ROWCOUNT <> 0 начать ... выберите @count END' раз начавшись является бесконечный цикл. Последний выбор цикла всегда возвращает значение @count и устанавливает @@ rowcount равным 1, поэтому цикл будет повторяться снова. –

ответ

0

- когда у вас есть данные в временную таблицу, вы могли бы что-то вроде этого ....

-- populate temp table 
select Name INTO #tmpName 
from [Employees] 
group by Name 

DECLARE @Name VARCHAR(100); 

while EXISTS(SELECT * FROM #tmpName) 
BEGIN 
     select top 1 @Name = Name From #tmpName 

     -- do stuff with top 1 

     delete from #tmpName WHERE Name = @Name 
END 
0
drop table #tmpName ; 

select row_number() over(order by Name) as rn, Name 
into #tmpName From [Employees]; 

declare @count int = (select count(*) from #tmpName) 
declare @rn int = 1 

while @count > 0 

begin 

select Name From #tmpName where rn = @rn 
--do stuff with top 1 
delete from #tmpName where rn = @rn 
set @count = @count - 1 
set @rn = @rn+1 
select @count 

end 

A cte не требуется. Вы можете попробовать это.

0

Возможно, вам стоит рассмотреть курсор. Вы можете делать то, что вы хотите с пунктом output:

DECLARE @namet (name varchar(255)); 

WITH todelete as (
     SELECT TOP 1 Name 
     FROM #tmpName 
     ORDER BY Name 
    ) 
DELETE FROM todelete 
OUTPUT name into @namet; 

SELECT @name = name FROM @namet; 

Вы можете поместить эту логику в петлю.

Однако я бы рекомендовал вам добавить еще один столбец в таблицу и перечислить это.

Смежные вопросы