我喜歡寫返回每個表的名稱的過程中,具有特定ID的行。換句話說,表中有一列'id',它是varchar類型的,並且包含一個uuid。之後做一些研究,我選擇了下面的方法(簡化,集中於我不能解決/明白的問題):while循環光標和動態SQL不會終止
-- get a cursor for all foo table names that have an id column
DECLARE table_name_cursor CURSOR FOR
SELECT a.name
FROM sysobjects a, syscolumns b
WHERE a.id = b.id
AND a.name like 'Foo%'
AND b.name = 'id'
GO
-- define some variables
DECLARE @current_table_name VARCHAR(100)
DECLARE @id_found VARCHAR(100)
OPEN table_name_cursor
FETCH table_name_cursor INTO @current_table_name
WHILE @@SQLSTATUS = 0
BEGIN
EXEC ('SELECT @id_found = id from ' + @current_table_name + " where id = '@id_param'") -- @id_param will be passed with the procedure call
select @current_table_name
FETCH table_name_cursor INTO @current_table_name
END
-- clean up resources
CLOSE table_name_cursor
DEALLOCATE table_name_cursor
它按預期工作,當光標的大小是相當低(〜在我的情況下20表),但如果光標大小增長,然後程序永遠不會終止。
它聞起來像一個資源問題,但我的白色腰帶在Sybase福不幫助尋找答案。
問題:爲什麼它停止工作以「太多」遊標行,有沒有辦法把它用這種方式工作?
是否有其他(更好)的方式來解決實際問題(運行查詢的所有表)?這不是要用於生產,它只是某種開發/維護腳本。
感謝您的全面回答! 「那麼程序永遠不會終止」 - 希望解釋它:/它不會終止,我必須從數據庫斷開連接,停止它,沒有消息,沒有錯誤,沒有部分結果,什麼都沒有。 –
這就像:有20個表格,它在幾毫秒內終止,21,它運行> 1分鐘(也許永遠)(不知道它是否恰好爲20 - 如果值很重要,我可以嘗試一些測試來獲得確切的邊界) –
但是,通過「永不終止」,你的意思是幾分鐘後它沒有完成,或者它在6小時後沒有完成,或者它在2天后沒有完成?對於較大的表,較小的數據緩存,相對較慢的磁盤......一張表的表掃描很容易從10幾分鐘到幾個小時......將其乘以多個大表掃描......並且您的評論「永遠不會終止'太模糊了......你真的需要監視MDA表來看看發生了什麼(例如,花費很長時間執行一些大型表掃描)。 – markp