2009-08-19 18 views
7

我使用SQL Server構建的存儲過程,而我使用的遊標遍歷如何訪問遊標列沒有FETCH .. INTO

我定義光標如下select語句:

DECLARE @c_col1 varchar(max); 
DECLARE @c_col2 varchar(max); 

DECLARE c as CURSOR FOR 
SELECT col1, col2 
FROM table; 

OPEN c; 
FETCH NEXT FROM c INTO 
@c_col1, @c_col2; 

SELECT @c_col1, @c_col2; 

有沒有辦法訪問遊標的列而不需要爲每列聲明變量並在FETCH子句中使用INTO?換句話說,是有可能使用:

DECLARE c as CURSOR FOR 
SELECT col1, col2 
FROM table; 

OPEN c; 
FETCH NEXT FROM c; 

SELECT c.col1, c.col2; 
+0

爲什麼你需要使用遊標?您應該嘗試使用SQL來找到基於集合的替代方案,因爲這是數據庫擅長處理的方式。遊標代碼通常比等效的SQL慢得多。 – pjp 2009-08-19 08:27:22

+2

@pjp,有時遊標對於逐行運行一些複雜的邏輯非常有用,通常通過爲返回的每一行調用存儲過程。另外,如果您需要執行諸如刪除幾百萬行之類的操作,則一個基於集合的查詢可能會長時間鎖定您的數據庫。一次用光標刪除一行需要更長的時間,但允許數據庫在發生時進行呼吸。 – 2009-08-19 10:11:10

+0

您可以循環和處理數據,無需光標。使用基於集合的操作可以大幅提高性能,取代遊標。但是,我已經替換了遊標的使用,但仍然是循環的(因爲它確實是必要的),並且仍然有很大的性能提升。 – 2009-08-19 11:52:32

回答

1

不,你必須這樣做的,如果你想從光標值,而不是存儲在本地變量返回它們返回給客戶端的。

+0

來自OP的代碼,它們將這些值作爲兩列中的一行reslt組返回 – 2009-08-19 12:15:46

0

,如果這是你的整個porcedure(右從OP的問題):

DECLARE @c_col1 varchar(max); 
DECLARE @c_col2 varchar(max); 

DECLARE c as CURSOR FOR 
SELECT col1, col2 
FROM table; 

OPEN c; 
FETCH NEXT FROM c INTO 
@c_col1, @c_col2; 

SELECT @c_col1, @c_col2; 

,那麼你可以做下面的返回結果集的兩列,沒有必要光標:

SELECT top 1 col1, col2 
FROM table;