2013-05-09 93 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 2013-05-09 09:40:21

+0

@Jodrell,它是SQL Server 2005中感謝標記它。 – w0051977 2013-05-09 09:45:58

回答

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 2013-05-09 09:43:22

+0

@ w0051977,好的,但是,你可能做錯了。看起來邏輯在某種程度上是相關的。 – Jodrell 2013-05-09 09:45:52

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 2013-05-09 10:00:15