iT邦幫忙

2

[MS SQL] sql cursor

做一個可放變數的迴圈
e.g.一年甲班今天要做體檢,大家排著隊,等著進來做體檢.

declare @ACNO int
DECLARE oCursor CURSOR FOR 

    select oACNO from table--在這裡撈一年甲班的同學學號
	 
OPEN oCursor --開始run cursor                   

FETCH NEXT FROM oCursor INTO @ACNO --將第一筆資料填入變數

--下一位如果有人
WHILE @@FETCH_STATUS = 0 --檢查是否有讀取到資料; WHILE用來處理迴圈,當為true時則進入迴圈執行
BEGIN
	print @ACNO
	
	 ...在這裡做要做的--做體檢嚕
 
     FETCH NEXT FROM oCursor  INTO @ACNO --把下一筆放進去--叫下一位
END

--關閉cursor與參數的關聯

CLOSE oCursor

DEALLOCATE oCursor --將cursor物件從記憶體移除
   

感謝邦友提供效能更好的方法,如下

把要排隊的放到#temp,再用while去撈

declare @min int ,declare @max int 

--將資料塞入#temp中 RowID排序
select RowID=identity(INT,1,1) ,ID into #temp from TableA

--取最大數,最小數
select @min =min(RowID),@max=max(RowID) from #temp
while(@min<=@max)
begin
	print @min
	print @max
	--做體檢
	set @min+=1;--下一位
end

Ref:
https://dotblogs.com.tw/dorlis.tsao/2010/10/14/18344


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
石頭
iT邦高手 1 級 ‧ 2017-11-10 15:31:29

cursor是個可怕的東西....
吃效能 效率又差XD/images/emoticon/emoticon06.gif

看更多先前的回應...收起先前的回應...
小魚 iT邦大師 1 級 ‧ 2017-11-12 08:48:44 檢舉

然後你PO錯地方了,要PO在發問的地方

圓頭人 iT邦研究生 5 級 ‧ 2017-11-13 10:15:16 檢舉

如果不用cursor有什麼方法可以取代呢?
有什麼方法可以測出效能的差異嗎?

石頭 iT邦高手 1 級 ‧ 2017-11-14 00:04:59 檢舉

While + 排序的TempTable

--將資料塞入#temp中 RowNO排序

DECLARE @Index BIGINT
DECLARE @MAX   BIGINT
DECLARE @Min   BIGINT 

SELECT @MAX = MAX(RowNO),@Min=MIN(RowNO) FROM #temp

WHILE(@Min <= @MAX)
BEGIN
--做你要做的事情
SELECT * FROM #temp WHERE RowNO = @Min
SET @Min=@Min+1
END

圓頭人 iT邦研究生 5 級 ‧ 2017-11-20 16:01:11 檢舉

對厚,聰明的方法!
來把它補上去,謝謝你哦~~

尼克 iT邦大師 1 級 ‧ 2017-11-22 09:47:14 檢舉

Oracle 的印象Cursor 效率高速度快呀!

我要留言

立即登入留言