2013-05-09 3 views
1

Пожалуйста, смотрите код ниже:Возврат одну таблицу с курсором

DECLARE @ID int 
DECLARE @errorflag int 

DECLARE Warning_Cursor CURSOR FOR 
    SELECT TOP 3 ID FROM Warnings 
    SET @errorflag = @errorflag + @@Error 
    OPEN Warning_cursor 
     SET @errorflag = @errorflag + @@Error 
     FETCH NEXT FROM Warning_cursor INTO @ID 
     WHILE @@FETCH_STATUS = 0 
    begin 
     SELECT @ID 
     FETCH NEXT FROM Warning_cursor INTO @ID 
    END 
CLOSE Warning_cursor 
DEALLOCATE Warning_cursor 

Курсор возвращает три таблицы с одной строкой каждого. Как я могу вернуть одну таблицу с тремя строками?

+0

@marc_s, он должен быть TSQL – Jodrell

+0

@Jodrell, то SQL Server 2005. Спасибо за мечение его. – w0051977

ответ

1

Почему вы не просто делать,

SELECT TOP 3 ID FROM Warnings 

В целом, если вы используете курсор, вы, вероятно, делают это неправильно.


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

DECLARE @Id int; 
DECLARE @Ids TABLE (Id Int); 
DECLARE Warning_Cursor CURSOR FOR SELECT TOP 3 ID FROM Warnings; 
OPEN Warning_cursor; 
FETCH NEXT FROM Warning_cursor INTO @Id; 
WHILE @@FETCH_STATUS = 0 BEGIN 
    INSERT @Ids SELECT @Id; 

    FETCH NEXT FROM Warning_cursor INTO @Id; 
END 
CLOSE Warning_cursor; 
DEALLOCATE Warning_cursor; 
SELECT Id FROM @Ids; 
+0

В курсоре содержится намного больше логики, которую я исключил, поскольку это не относится к вопросу. – w0051977

+0

@ w0051977, хорошо, но вы, вероятно, ошибаетесь. Похоже, что логика в некотором роде имеет значение. – Jodrell

0

Ответ был создать временную таблицу следующим образом:

DECLARE @ID int 
DECLARE @errorflag int 
DECLARE @CONCATRESULT TABLE (ID INT) 
DECLARE Warning_Cursor CURSOR FOR 
    SELECT TOP 3 ID FROM Warnings 
    SET @errorflag = @errorflag + @@Error 
    OPEN Warning_cursor 
     SET @errorflag = @errorflag + @@Error 
     FETCH NEXT FROM Warning_cursor INTO @ID 
     WHILE @@FETCH_STATUS = 0 
    begin 
     INSERT into @CONCATRESULT (ID) VALUES (@ID) 
     FETCH NEXT FROM Warning_cursor INTO @ID 
    END 
CLOSE Warning_cursor 
DEALLOCATE Warning_cursor 
select id from @CONCATRESULT 
+0

Временная таблица не такая же, как переменная таблицы, но для ваших целей оптимальной является таблица. Это помогает вам использовать 2005+. – Jodrell

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