1. 程式人生 > >SQL SERVER 遊標的使用

SQL SERVER 遊標的使用

首先,關於什麼是遊標大家可以看看這篇文章,介紹得非常詳細!!
SQL Server基礎之遊標


下面是我自己的應用場景……

有個需求,需要把資料庫表裡面某一個欄位的值設為隨機不重複的值。

表是這樣的:

這裡寫圖片描述

這是一個爬蟲抓取網址表。其中 CatchOrder 這一列就是要修改的列。CatchOrder 表示的是抓取順序,本來這個值是等於 WebSiteId 的值的。新需求就是要把這一列的值修改為有限值範圍內的隨機不重複的值。
於是我的思路是把它改成隨機查找出的 WebSiteId 值【用 order by NEWID() 實現】,這樣就肯定能保證不會重複了。【因為 WebSiteId

列是這個表的唯一索引。】

下面就直接上程式碼了:

declare @websiteId int=-1
declare @catchOrder int=-1

-- 宣告遊標並指定值
declare unorder_catchOrder_cursor cursor
for 
select WebSiteId from
dbo.Reader_WebSite
order by NEWID();   -- 隨機查出WebSiteId作為要修改的CatchOrder的新順序

declare order_websiteId_cursor cursor
for 
select WebSiteId from
dbo.Reader_WebSite;
-- 按順序查出WebSiteId值用於定位 -- 開啟遊標 open unorder_catchOrder_cursor; open order_websiteId_cursor; -- 獲取遊標值 fetch next from unorder_catchOrder_cursor into @catchOrder; fetch next from order_websiteId_cursor into @websiteId; while @@FETCH_STATUS=0 -- 判斷fetch語句是否執行成功 begin update
dbo.Reader_WebSite set [email protected] where [email protected];
-- 修改值 -- 獲取下一個遊標值 fetch next from unorder_catchOrder_cursor into @catchOrder; fetch next from order_websiteId_cursor into @websiteId; end -- 關閉遊標 close unorder_catchOrder_cursor; close order_websiteId_cursor; -- 釋放遊標 deallocate unorder_catchOrder_cursor; deallocate order_websiteId_cursor;

總結一下就是幾個關鍵點:
1. 宣告遊標
2. 指定遊標結果集(查詢出的結果表)
3. 開啟遊標
4. 使用遊標(通過 fetch next from cursor_name 獲取值)
5. 迴圈時可以使用 @@FETCH_STATUS=0 判斷是否已經到達了最後一項
6. 最後用完要關閉與釋放遊標