標籤:ar os 使用 sp for strong on 資料 問題
靜態資料指標在開啟時會將資料集儲存在tempdb中,因此顯示的資料與遊標開啟時的資料集保持一致,在遊標開啟以後對資料庫的更新不會顯示在遊標中。
動態資料指標在開啟後會反映對資料庫的更改。所有UPDATE、INSERT 和 DELETE 操作都會顯示在遊標的結果集中,結果集中的行資料值、順序和成員在每次提取時都會改變。
在定義遊標的時候如果不指定STATIC關鍵字,預設是DYNAMIC的。
動態資料指標的開啟速度比靜態資料指標的開啟速度快。當開啟靜態資料指標時,必鬚生成內部臨時工作表,而動態資料指標則不需要。
在聯結中,靜態資料指標的速度可能比動態資料指標的速度快。因為動態資料指標在滾動時反應對結果集內的各行資料所做的更改,它會消耗資源去檢測基表的更改,因此對於複雜的查詢,且不需要反映基表的更新的遊標的處理應將其定義為靜態資料指標。
如果要進行絕對提取,必須使用索引鍵集驅動資料指標或靜態資料指標。
在使用動態資料指標時,應該注意行資料的更新所導致的死迴圈等問題,如下表所示:
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Test](
[ID] [int] NOT NULL,
CONSTRAINT [PK_Test] PRIMARY KEY CLUSTERED ([ID] ASC)) ON [PRIMARY]
GO
INSERT INTO Test VALUES(1)
GO
DECLARE C$Cursor Cursor
FOR
SELECT ID From Test Where ID < 10
DECLARE @id INT
OPEN C$Cursor
Fetch C$Cursor INTO @id
WHILE @@FETCH_STATUS = 0
BEGIN
UPDATE Test SET ID = ID + 1 WHERE id = @id
Fetch C$Cursor INTO @id
END
CLOSE C$Cursor
DEALLOCATE C$Cursor
執行完後表中的數值變成了10,代表更新行執行了多次。如果把遊標的定義改成如下:
DECLARE C$Cursor Cursor STATIC
FOR
SELECT ID From Test Where ID < 10
則執行結果為2
【轉】靜態資料指標和動態資料指標