2011-03-01 88 views
8

我正在使用遊標。TSQL更改光標定義

DECLARE @column1 NVARCHAR(MAX); 

DECLARE cursor_name CURSOR FOR 
    SELECT c1 
    FROM table_name; 

OPEN cursor_name; 
FETCH cursor_name INTO @column1; 

WHILE @@FETCH_STATUS = 0 
BEGIN 

    FETCH cursor_name INTO @column1; 
END 

CLOSE cursor_name; 
DEALLOCATE cursor_name; 

現在我的問題是,使用它之後,我可以更改光標cursor_name的定義嗎?我的意思是類似於:

DECLARE cursor_name CURSOR FOR 
    SELECT c2 
    FROM table_name2; 

使用相同的光標名稱cursor_name,但定義已更改。 如果這是可能的,該怎麼做?

謝謝。

回答

10

Yes it's possible,但它必須在你的DEALLOCATE之後。你有沒有嘗試過,它不工作或什麼?

你可能還想看看你是否真的需要一個遊標。它們損害了性能,使用它們的SQL通常可以在沒有它們的情況下重寫。

看看this article它會繼續如何做到這一點。他們使用不太常見的DECLARE/SET語法來聲明遊標(至少在我的世界中是不常見的)。下面是他們提供的例子:

USE pubs 
GO 
DECLARE @MyCursor CURSOR 
SET @MyCursor = CURSOR LOCAL SCROLL FOR 
SELECT * FROM titles 

DEALLOCATE @MyCursor 

SET @MyCursor = CURSOR LOCAL SCROLL FOR 
SELECT * FROM sales 
GO 
4

從純粹的技術角度來看,避免討論遊標是否是必要的,一旦遊標關閉並釋放,您可以自由重新使用該名稱。

-1

更正安倍Miessler誤導瞭解光標的業績評論:包含在存儲 過程和觸發器時

的Transact-SQL遊標是非常有效的。這是因爲一切都被編譯成一個 執行計劃的服務器上,並沒有與讀取行

對性能有壞處的是反覆從存儲過程的外部調用下一行的全局遊標。最好使用客戶端API調度功能來減少數據庫的往返行程。

通過使用FETCH和 將FETCH返回的每列綁定到程序變量,您可以在應用程序中使用Transact-SQL遊標。 但是,Transact-SQL FETCH不支持批處理,因此這是將數據返回給應用程序的效率最低的方式。獲取每個 行需要往返於服務器。使用 內置於支持 的行的數據庫API中的遊標功能效率更高。