當前位置:首頁 » 編程語言 » sqlserver游標實例
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

sqlserver游標實例

發布時間: 2022-08-16 20:09:37

『壹』 什麼是sqlServer游標

資料庫之---游標分類:資料庫相關
在資料庫開發過程中,當你檢索的數據只是一條記錄時,你所編寫的事務語句代碼往往使用SELECT INSERT 語句。但是我們常常會遇到這樣情況,即從某一結果集中逐一地讀取一條記錄。那麼如何解決這種問題呢?游標為我們提供了一種極為優秀的解決方案。

1.游標和游標的優點

在資料庫中,游標是一個十分重要的概念。游標提供了一種對從表中檢索出的數據進行操作的靈活手段,就本質而言,游標實際上是一種能從包括多條數據記錄的結果集中每次提取一條記錄的機制。游標總是與一條SQL 選擇語句相關聯因為游標由結果集(可以是零條、一條或由相關的選擇語句檢索出的多條記錄)和結果集中指向特定記錄的游標位置組成。當決定對結果集進行處理時,必須聲明一個指向該結果集的游標。如果曾經用 C 語言寫過對文件進行處理的程序,那麼游標就像您打開文件所得到的文件句柄一樣,只要文件打開成功,該文件句柄就可代表該文件。對於游標而言,其道理是相同的。可見游標能夠實現按與傳統程序讀取平面文件類似的方式處理來自基礎表的結果集,從而把表中數據以平面文件的形式呈現給程序。

我們知道關系資料庫管理系統實質是面向集合的,在MS SQL SERVER 中並沒有一種描述表中單一記錄的表達形式,除非使用where 子句來限制只有一條記錄被選中。因此我們必須藉助於游標來進行面向單條記錄的數據處理。由此可見,游標允許應用程序對查詢語句select 返回的行結果集中每一行進行相同或不同的操作,而不是一次對整個結果集進行同一種操作;它還提供對基於游標位置而對表中數據進行刪除或更新的能力;而且,正是游標把作為面向集合的資料庫管理系統和面向行的程序設計兩者聯系起來,使兩個數據處理方式能夠進行溝通。

2. 游標種類

MS SQL SERVER 支持三種類型的游標:Transact_SQL 游標,API 伺服器游標和客戶游標。
(1) Transact_SQL 游標
Transact_SQL 游標是由DECLARE CURSOR 語法定義、主要用在Transact_SQL 腳本存儲過程和觸發器中。Transact_SQL 游標主要用在伺服器上,由從客戶端發送給伺服器的Transact_SQL 語句或是批處理、存儲過程、觸發器中的Transact_SQL 進行管理。 Transact_SQL 游標不支持提取數據塊或多行數據。
(2) API 游標
API 游標支持在OLE DB, ODBC 以及DB_library 中使用游標函數,主要用在伺服器上。每一次客戶端應用程序調用API 游標函數,MS SQL SEVER 的OLE DB 提供者、ODBC驅動器或DB_library 的動態鏈接庫(DLL) 都會將這些客戶請求傳送給伺服器以對API游標進行處理。
(3) 客戶游標
客戶游標主要是當在客戶機上緩存結果集時才使用。在客戶游標中,有一個預設的結果集被用來在客戶機上緩存整個結果集。客戶游標僅支持靜態游標而非動態游標。由於伺服器游標並不支持所有的Transact-SQL 語句或批處理,所以客戶游標常常僅被用作伺服器游標的輔助。因為在一般情況下,伺服器游標能支持絕大多數的游標操作。由於API 游標和Transact-SQL 游標使用在伺服器端,所以被稱為伺服器游標,也被稱為後台游標,而客戶端游標被稱為前台游標。在本章中我們主要講述伺服器(後台)游標。

你可以通過這個鏈接引用該篇文章:http://java021.bokee.com/tb.b?diaryId=11621633

2006.7.22 22:44 作者:java021 收藏 | 評論:5 | 閱讀:1239
----------------------
舉例還不得編程?

『貳』 sqlserver中游標作為輸出參數,誰能給個例子,我這樣子做,只能調用一次,過程內的游標沒法關閉,急

table1結構如下
id int
name varchar(50)

declare @id int
declare @name varchar(50)
declare cursor1 cursor for --定義游標cursor1
select * from table1 --使用游標的對象(跟據需要填入select文)
open cursor1 --打開游標

fetch next from cursor1 into @id,@name --將游標向下移1行,獲取的數據放入之前定義的變數@id,@name中

while @@fetch_status=0 --判斷是否成功獲取數據
begin
update table1 set name=name+'1'
where id=@id --進行相應處理(跟據需要填入SQL文)

fetch next from cursor1 into @id,@name --將游標向下移1行
end

close cursor1 --關閉游標
deallocate cursor1

『叄』 sqlserver 游標用法

你有標end的位置放錯誤了

FETCHNEXTFROMrsINTO@a0188
END
CLOSErs
DEALLOCATErs

『肆』 100分 求教SQLSERVER中的用游標遍歷表中的列並實現累加輸出。

你邏輯流程有問題 ,下面是你的邏輯流程,
讀取下一條→加值→[判斷是否結尾→讀取下一條→加值](循環)
而@@FETCH_STATUS返回3種狀態,
0 FETCH 語句成功。
-1 FETCH 語句失敗或此行不在結果集中。
-2 被提取的行不存在。

這樣在游標移動到最後一行的時候,進行while判斷@@FETCH_STATUS為0 ,進行一次加值,然後又直接進入while判斷 這時候你還沒有移動游標,@@FETCH_STATUS還是為0,又進行了一次加值,然後移動游標,進行判斷@@FETCH_STATUS不為0,退出循環
所以應該修改邏輯為
讀取下一條→[判斷是否結尾→加值→讀取下一條](循環)
SQL語句調整如下
===========================================
OPEN Employee_Cursor

FETCH NEXT FROM Employee_Cursor into @id,@name
WHILE @@FETCH_STATUS = 0
BEGIN
set @finalname = @finalname + @name
FETCH NEXT FROM Employee_Cursor into @id,@name
END
CLOSE Employee_Cursor
==================================
以上語句實測試通過

先移動游標,然後就開始判斷,為真進行加值 然後移動游標,這樣就沒問題了,

『伍』 求一個sqlserver的游標語句,重謝哦

您好,--聲明一個游標
DECLARE MyCursor CURSOR
FOR SELECT TOP 5 FBookName,FBookCoding FROM TBookInfo//定義一個叫MyCursor的游標,存放for select 後的數據

--打開一個游標
OPEN MyCursor//即打開這個數據集

--循環一個游標
DECLARE @BookName nvarchar(2000),@BookCoding nvarchar(2000)
FETCH NEXT FROM MyCursor INTO @BookName,@BookCoding//移動游標指向到第一條數據,提取第一條數據存放在變數中
WHILE @@FETCH_STATUS =0//如果上一次操作成功則繼續循環
BEGIN
print 'name'+@BookName
FETCH NEXT FROM MyCursor INTO @BookName,@BookCoding//繼續提下一行
END

--關閉游標
CLOSE MyCursor
--釋放資源
DEALLOCATE MyCursor
====================================================================

create table #a
(
id varchar(20),
name varchar(20)
)
insert into #a select 1,'jack'
insert into #a select 2,'join'
insert into #a select 3,'make'
declare mycursor cursor
for select * from #a
open mycursor
declare @id varchar(20),@name varchar(20)
fetch next from mycursor into @id,@name
while @@fetch_status=0
begin
select @id,@name
fetch next from mycursor into @id,@name
end
close mycursor
deallocate mycursor

『陸』 sQL server 什麼是實例

實例在資料庫中,代表一些程序的集合。如Oracle中,實例就是一些能支撐資料庫運行的資料庫程序。

在面向對象程序設計中,「類」在實例化之後叫做一個「實例」。 「類」是靜態的,不佔進程內存,而「實例」擁有動態內存。

實例化是指在面向對象的編程中,把用類創建對象的過程稱為實例化。是將一個抽象的概念類,具體到該類實物的過程。實例化過程中一般由類名 對象名 = new 類名(參數1,參數2...參數n)構成。



(6)sqlserver游標實例擴展閱讀

實例(instance)和對象(object)的區別

實例和對象基本上是同義詞,它們常常可以互換使用。對象代表了類的一個特定的實例。對象具有身份(identity)和屬性值(attribute values)2個特徵。實例是對象的具體表示,操作可以作用於實例,實例可以有狀態地存儲操作結果。實例被用來模擬現實世界中存在的、具體的或原型的東西。

對象就是類的實例,所有的對象都是實例,但並不是所有的實例都是對象。例如,一個關聯(UML關系中的一種)的實例不是一個對象,它只是一個實例、一個連接。我們常見的實例都是類的實例,此時二者沒有區別。除了類的實例外的實例都不是對象。

『柒』 sqlserver 游標有哪些屬性

樓上你的,你說的是oracle的,不是sqlserver的
游標(Cursor)是處理數據的一種方法,為了查看或者處理結果集中的數據,游標提供了在結果集中一次以行或者多行前進或向後瀏覽數據的能力。我們可以把游標當作一個指針,它可以指定結果中的任何位置,然後允許用戶對指定位置的數據進行處理。
1.游標的組成
游標包含兩個部分:一個是游標結果集、一個是游標位置。
游標結果集:定義該游標得SELECT語句返回的行的集合。游標位置:指向這個結果集某一行的當前指針。

2.游標的分類
游標共有3類:API伺服器游標、Transaction-SQL游標和API客戶端游標。
其中前兩種游標都是運行在伺服器上的,所以又叫做伺服器游標。
API伺服器游標
API伺服器游標主要應用在服務上,當客戶端的應用程序調用API游標函數時,伺服器會對API函數進行處理。使用API函數和方法可以實現如下功能:
(1)打開一個連接。
(2)設置定義游標特徵的特性或屬性,API自動將游標影射到每個結果集。
(3)執行一個或多個Transaction-SQL語句。
(4)使用API函數或方法提取結果集中的行。
API伺服器游標包含以下四種:靜態游標、動態游標、只進游標、鍵集驅動游標(Primary key)
靜態游標的完整結果集將打開游標時建立的結果集存儲在臨時表中,(靜態游標始終是只讀的)。靜態游標具有以下特點:總是按照打開游標時的原樣顯示結果集;不反映資料庫中作的任何修改,也不反映對結果集行的列值所作的更改;不顯示打開游標後在資料庫中新插入的行;組成結果集的行被其他用戶更新,新的數據值不會顯示在靜態游標中;但是靜態游標會顯示打開游標以後從資料庫中刪除的行。
動態游標與靜態游標相反,當滾動游標時動態游標反映結果集中的所有更改。結果集中的行數據值、順序和成員每次提取時都會改變。
只進游標不支持滾動,它只支持游標從頭到尾順序提取數據行。注意:只進游標也反映對結果集所做的所有更改。
鍵集驅動游標同時具有靜態游標和動態游標的特點。當打開游標時,該游標中的成員以及行的順序是固定的,鍵集在游標打開時也會存儲到臨時工作表中,對非鍵集列的數據值的更改在用戶游標滾動的時候可以看見,在游標打開以後對資料庫中插入的行是不可見的,除非關閉重新打開游標。

Transaction-SQL游標
該游標是基於Declare Cursor 語法,主要用於Transaction-SQL腳本、存儲過程以及觸發器中。Transaction-SQL游標在伺服器處理由客戶端發送到伺服器的Transaction-SQL語句。
在存儲過程或觸發器中使用Transaction-SQL游標的過程為:
(1)聲明Transaction-SQL變數包含游標返回的數據。為每個結果集列聲明一個變數。聲明足夠大的變數來保存列返回的值,並聲明變數的類型為可從數據類型隱式轉換得到的數據類型。
(2)使用Declare Cursor語句將Transaction-SQL游標與Select語句相關聯。還可以利用Declare Cursor定義游標的只讀、只進等特性。
(3)使用Open語句執行Select語句填充游標。
(4)使用Fetch Into語句提取單個行,並將每列中得數據移至指定的變數中。注意:其他Transaction-SQL語句可以引用那些變數來訪問提取的數據值。Transaction-SQL游標不支持提取行塊。
(5)使用Close語句結束游標的使用。注意:關閉游標以後,該游標還是存在,可以使用Open命令打開繼續使用,只有調用Deallocate語句才會完全釋放。
客戶端游標
該游標將使用默認結果集把整個結果集高速緩存在客戶端上,所有的游標操作都在客戶端的高速緩存中進行。注意:客戶端游標只支持只進和靜態游標。不支持其他游標。

3.游標的生命周期
游標的生命周期包含有五個階段:聲明游標、打開游標、讀取游標數據、關閉游標、釋放游標。
聲明游標是為游標指定獲取數據時所使用的Select語句,聲明游標並不會檢索任何數據,它只是為游標指明了相應的Select 語句。
Declare 游標名稱 Cursor 參數
聲明游標的參數
(1)Local與Global:Local表示游標的作用於僅僅限於其所在的存儲過程、觸發器以及批處理中、執行完畢以後游標自動釋放。Global表示的是該游標作用域是整個會話層。由連接執行的任何存儲過程、批處理等都可以引用該游標名稱,僅在斷開連接時隱性釋放。
(2)Forward_only與Scroll:前者表示為只進游標,後者表示為可以隨意定位。默認為前者。
(3)Static、Keyset與Dynamic: 第一個表示定義一個游標,其數據存放到一個臨時表內,對游標的所有請求都從臨時表中應答,因此,對該游標進行提取操作時返回的數據不反映對基表所作的修改,並且該游標不允許修改。Keyset表示的是,當游標打開時,鍵集驅動游標中行的身份與順序是固定的,並把其放到臨時表中。Dynamic表示的是滾動游標時,動態游標反映對結果集內所有數據的更改。
(4)Read_only 、Scroll_Locks與Optimistic:第一個表示的是只讀游標,第二個表示的是在使用的游標結果集數據上放置鎖,當行讀取到游標中然後對它們進行修改時,資料庫將鎖定這些行,以保證數據的一致性。Optimistic的含義是游標將數據讀取以後,如果這些數據被更新了,則通過游標定位進行的更新與刪除操作將不會成功。
標准游標:
Declare MyCursor Cursor
For Select * From Master_Goods
只讀游標
Declare MyCusror Cursor
For Select * From Master_Goods
For Read Only
可更新游標
Declare MyCusror Cursor
For Select * From Master_Goods
For UpDate
打開游標使用Open語句用於打開Transaction-SQL伺服器游標,執行Open語句的過程中就是按照Select語句進行填充數據,打開游標以後游標位置在第一行。
打開游標
全局游標:Open Global MyCursor 局部游標: Open MyCursor
讀取游標數據:在打開游標以後,使用Fetch語句從Transaction-SQL伺服器游標中檢索特定的一行。使用Fetch操作,可以使游標移動到下一個記錄,並將游標返回的每個列得數據分別賦值給聲明的本地變數。
Fetch [Next | Prior | First | Last | Absoluten| Relativen] From MyCursor
Into @GoodsID,@GoodsName
其中:Next表示返回結果集中當前行的下一行記錄,如果第一次讀取則返回第一行。默認的讀取選項為Next
Prior表示返回結果集中當前行的前一行記錄,如果第一次讀取則沒有行返回,並且把游標置於第一行之前。
First表示返回結果集中的第一行,並且將其作為當前行。
Last表示返回結果集中的最後一行,並且將其作為當前行。
Absoluten如果n為正數,則返回從游標頭開始的第n行,並且返回行變成新的當前行。如果n為負,則返回從游標末尾開始的第n行,並且返回行為新的當前行,如果n為0,則返回當前行。
Relativen如果n為正數,則返回從當前行開始的第n行,如果n為負,則返回從當前行之前的第n行,如果為0,則返回當前行。
關閉游標調用的是Close語句,方式如下:Close Global MyCursor Close MyCursor
釋放游標調用的是Deallocate語句,方法如下:Deallocate Glboal MyCursor Deallocate MyCursor

游標實例:
Declare MyCusror Cursor Scroll
For Select * From Master_Goods Order By GoodsID
Open MyCursor
Fetch next From MyCursor
Into @GoodsCode,@GoodsName
While(@@Fetch_Status = 0)
Begin
Begin
Select @GoodsCode = Convert(Char(20),@GoodsCode)
Select @GoodsName = Convert(Char(20),@GoodsName)
PRINT @GoodsCode + ':' + @GoodsName
End
Fetch next From MyCursor
Into @GoodsCode,@GoodsName
End
Close MyCursor
Deallocate MyCursor

修改當前游標的數據方法如下:
UpDate Master_Goods Set GoodsName = 'yangyang8848' Where Current Of MyCursor;
刪除當前游標行數據的方法如下:
Delete From Master_Goods Where Current Of MyCursor

Select @@CURSOR_ROWS 可以得到當前游標中存在的數據行數。注意:此變數為一個連接上的全局變數,因此只對應最後一次打開的游標。

『捌』 SQLSERVER 游標問題

可以採用臨時表解決:

declare@SQLnvarchar(max)
--檢測名為#temp的臨時表是否存在,如存在則刪除
ifexists(select*fromtempdb.dbo.sysobjectswhereid=object_id(N'tempdb..#temp')andtype='U')
begin
droptable#temp
print'Dropped'
end
--執行動態SQL語句:創建臨時表#temp
set@SQL=N'select[UserId]into#tempfrom'+@Tables+'where[Num_'+@Num+']!=0'
execsp_executesql@SQL
--對#temp創建游標
declarecurcursorforselect*from#temp
opencur
……
closecur
deallocatecur

『玖』 sqlserver這個如何用游標來實現

在sqlserver2000中新建一個存儲過程:
CREATE PROCEDURE PK_Test
AS
//聲明2個變數
declare @O_ID nvarchar(20)
declare @A_Salary float

//聲明一個游標mycursor,select語句中參數的個數必須要和從游標取出的變數名相同
declare mycursor cursor for select O_ID,A_Salary from AddSalary

//打開游標
open mycursor

//從游標里取出數據賦值到我們剛才聲明的2個變數中
fetch next from mycursor into @O_ID,@A_Salary

//判斷游標的狀態
//0 fetch語句成功
//-1 fetch語句失敗或此行不在結果集中
//-2被提取的行不存在
while (@@fetch_status=0)
begin

//顯示出我們每次用游標取出的值
print '游標成功取出一條數據'
print @O_ID
print @A_Salary

//用游標去取下一條記錄
fetch next from mycursor into @O_ID,@A_Salary
end
//關閉游標
close mycursor
//撤銷游標
deallocate mycursor
GO
連張圖都沒有,看看這個游標示例能不能幫你