2015-02-24 69 views
1

我在看一個例子CURSOR以下鏈接:瞭解SQL Cusros語法

http://blog.sqlauthority.com/2008/03/05/sql-server-simple-example-of-cursor-sample-cursor-part-2/

USE AdventureWorks 
GO 

DECLARE @ProductID INT 
DECLARE @getProductID CURSOR 

SET @getProductID = CURSOR FOR 
    SELECT ProductID 
    FROM Production.Product 

OPEN @getProductID 
FETCH NEXT FROM @getProductID INTO @ProductID 

WHILE @@FETCH_STATUS = 0 
BEGIN 
    PRINT @ProductID 
    FETCH NEXT FROM @getProductID INTO @ProductID 
END 

CLOSE @getProductID 
DEALLOCATE @getProductID 

GO 

這是一個非常簡單的例子,但是我不明白以下幾點:

  • 爲什麼在定義中有兩次FETCH
  • 我們看到它在打開遊標時發生,然後在while循環中發生相同的確切FETCH
  • 有什麼我們可以做的,使代碼更清潔一點,少一些?
+1

你想只有遊標做這個或任何其他方法。嘗試儘可能避免**遊標。 – 2015-02-24 01:25:12

回答

2

第一次提取是在開始循環之前填充變量。

第二次提取是爲了下一次迭代循環填充這些變量。如果您的變量用完了,循環的@@ FETCH_STATUS = 0部分將使您退出。

不幸的是,我認爲你可以使它成爲遊標。