iT邦幫忙

0

cursor local 和 global差別

  • 分享至 

  • xImage

是這樣的
不知道為何要在cursor後面加上local
主管表示沒加會錯誤 不過看以往寫過的ETL並沒有使用local
上網查了之後得到local的解釋為:指定已建立資料指標的批次、預存程序或觸發程序,其資料指標的範圍為本機範圍。
DECLARE MCursor Cursor local FOR --宣告,名稱為MyCursor
SELECT distinct KU, FC, TC, GB, UDT
FROM [DEC_DEV].[dbo].[xxxx]
where dw_status is null or dw_status =''
order by udt
Open MCursor

BEGIN到END中的內容是
DELECT ....
INSERT INTO...(...)SELECT...FROM [DEC_DEV].[dbo].[xxxx]
以上在EXCE時是正常的
table裡已有塞入的值存在
但會顯示錯誤是MCursor的資料指標已存在
但不清楚是已存在了什麼..新的procedure為何會已存在

後來查到以下解釋但看不懂
https://ithelp.ithome.com.tw/upload/images/20240401/20165598qGGlwoBtJA.png
不知道有沒有大大可以白話文說明
謝謝

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

1 個回答

0
sam0407
iT邦大師 1 級 ‧ 2024-04-02 10:32:48
最佳解答

您找到的網頁寫的很清楚呀,就是沒有加local宣告的就是全局Cursor,用完必須要作Colse及DeAllocate,有加local宣告就是本機Cursor,Seesion結束就自動刪除。

至於您寫的為什麼會錯誤?我合理推斷是之前有人宣告了個全局的MCursor,沒有作Colse或DeAllocate。

解決方式:
如果是在測試環境,您就直接下指令Colse/DeAllocate~~
如果在正式環境怕刪了會影響其他人的作業,那您就把MCursor改名改試試囉~~

看更多先前的回應...收起先前的回應...
jojo461 iT邦新手 5 級 ‧ 2024-04-02 15:35:36 檢舉

我看errorlog會show "名稱為 'MCursor' 的資料指標已經存在。_100"
不知道我的理解對不對?其他支procedure的名稱每個都是MCursor 所以每支都要加上local??

sam0407 iT邦大師 1 級 ‧ 2024-04-03 09:49:18 檢舉

只要您們作法統一就不會有問題。兩種作法只能選其中一種:
1.每支procedure裡的Cursor在宣告時都加上local
2.若宣告時沒有加local,就一定要在結束時作Close及DeAllocate

jojo461 iT邦新手 5 級 ‧ 2024-04-09 09:09:13 檢舉

隨機點了SSMS中幾隻procedure(前人已寫好)
每隻都有下列close及deallocate,不過有的沒+local..有的有+
不知道會引起什麼問題
我在新增ETL時是參考某支架構所以才沒+local

/images/emoticon/emoticon06.gif
--關閉&釋放cursor
CLOSE MCursor
DEALLOCATE MCursor
----Main Job End ------

sam0407 iT邦大師 1 級 ‧ 2024-04-09 10:12:07 檢舉

有沒有加local是視運用場景而定,這沒有什麼對錯,也許沒加的這支是因為有特殊的運用?

建議您把情況呈報給主管!由他去決定您們團隊是否有需要建立規範?是否要盤點現有Procedure去除Bad Smell?

jojo461 iT邦新手 5 級 ‧ 2024-04-09 10:51:08 檢舉

好的
感謝您迅速回覆!!

sam0407 iT邦大師 1 級 ‧ 2024-04-09 10:53:56 檢舉

如果我的回答對您有幫助,煩請將我的回答選為最佳解答,謝謝~~

我要發表回答

立即登入回答