游標概念
數據庫操作中我們常常會遇到這樣情況,即從某一結果集中逐一地讀取一條記錄。那麼如何解決這種問題呢?游標為我們提供了一種極為優秀的解決方案。
游標(cursor)是系統為用戶開設的一個數據緩沖區,存放SQL語句的執行結果。
每個游標區都有一個名字。用戶可以用SQL語句逐一從游標中獲取記錄,並賦給主變量,交由主語言進一步處理。游標提供了一種對從表中檢索出的數據進行操作的靈活手段,就本質而言,游標實際上是一種能從包括多條數據記錄的結果集中每次提取一條記錄的機制。
游標總是與一條SQL 查詢語句相關聯因為游標由結果集(可以是零條、一條或由相關的選擇語句檢索出的多條記錄)和結果集中指向特定記錄的游標位置組成。
當決定對結果集進行處理時,必須聲明一個指向該結果集的游標。如果曾經用C 語言寫過對文件進行處理的程序,那麼游標就像您打開文件所得到的文件句柄一樣,只要文件打開成功,該文件句柄就可代表該文件。對於游標而言,其道理是相同的。可見游標能夠實現按與傳統程序讀取平面文件類似的方式處理來自基礎表的結果集,從而把表中數據以平面文件的形式呈現給程序。
我們知道關系數據庫管理系統實質是面向集合的,在MS SQL SERVER 中並沒有一種描述表中單一記錄的表達形式,除非使用where 子句來限制只有一條記錄被選中。
因此我們必須借助於游標來進行面向單條記錄的數據處理。由此可見,游標允許應用程序對查詢語句select 返回的行結果集中每一行進行相同或不同的操作,而不是一次對整個結果集進行同一種操作;它還提供對基於游標位置而對表中數據進行刪除或更新的能力;而且,正是游標把作為面向集合的數據庫管理系統和面向行的程序設計兩者聯系起來,使兩個數據處理方式能夠進行溝通。
游標的使用一般是這樣,個人理解:定義游標-->打開游標-->Fetch next from into --> where @@fech_status=0(這個類似C語言中的指針) -->Fetch next from into -->end -->關閉游標(close 游標名)-->Deallocate 游標
具體事例:
定義游標 Test_Cursor ,
declare @paraA nvarchar(50)--定義參數
declare @paraB nvarchar(50)--定義參數
declare @paraC nvarchar(50)--定義參數
declare Test_Cursor cursor local for--定義游標
打開游標 ,定義要游標的結果集
--相當於要遍歷的表內容
select
tableA_columnA,
tableA_columnB,
tableA_columnC
from tableA
--相當於將指針指向這個表頭,指向該數據表集的第一條記錄,
open Test_Cursor fetch next from Test_Cursor into
@paraA,
@paraB,
@paraC
while @@fetch_status=0
循環遍歷數據集中的內容,一條條做
begin
insert into
tableB(
tableB_columnA,
tableB_columnB,
tableB_columnC)
values(
@paraA,
@paraB,
@paraC)
fetch next from Test_Cursor into
@paraA,
@paraB,
@paraC
end
關閉和收尾回收內存
close Test_Cursor
deallocate Test_Cursor