是這樣的
不知道為何要在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為何會已存在
後來查到以下解釋但看不懂
不知道有沒有大大可以白話文說明
謝謝
您找到的網頁寫的很清楚呀,就是沒有加local宣告的就是全局Cursor,用完必須要作Colse及DeAllocate,有加local宣告就是本機Cursor,Seesion結束就自動刪除。
至於您寫的為什麼會錯誤?我合理推斷是之前有人宣告了個全局的MCursor,沒有作Colse或DeAllocate。
解決方式:
如果是在測試環境,您就直接下指令Colse/DeAllocate~~
如果在正式環境怕刪了會影響其他人的作業,那您就把MCursor改名改試試囉~~
我看errorlog會show "名稱為 'MCursor' 的資料指標已經存在。_100"
不知道我的理解對不對?其他支procedure的名稱每個都是MCursor 所以每支都要加上local??
只要您們作法統一就不會有問題。兩種作法只能選其中一種:
1.每支procedure裡的Cursor在宣告時都加上local
2.若宣告時沒有加local,就一定要在結束時作Close及DeAllocate
隨機點了SSMS中幾隻procedure(前人已寫好)
每隻都有下列close及deallocate,不過有的沒+local..有的有+
不知道會引起什麼問題
我在新增ETL時是參考某支架構所以才沒+local
--關閉&釋放cursor
CLOSE MCursor
DEALLOCATE MCursor
----Main Job End ------