2014-08-29 35 views
0

我想弄清楚如何創建一個循環截斷只截斷(或刪除)在特定表中的數據。有30個左右的表需要被截斷,我想避免使用truncate語句列表。我似乎無法找到任何這樣做的好例子,無論我嘗試什麼,我都會得到一個「正確的截斷」錯誤。SQL Anywhere 11 - 循環切分特定表?

例1:

FOR anlyc_tables AS curs CURSOR FOR 
    SELECT table_name FROM systable WHERE table_name LIKE 'table_to_truncate_prefix%' 
    DO EXECUTE (
     'TRUNCATE TABLE ' + table_name 
    ); 
END FOR; 

這一個動作沒有錯誤,但在0.078秒完成,實際上並沒有什麼截斷。

實施例2:

ALTER PROCEDURE truncate_analytics() 

BEGIN 
DECLARE @table_name VARCHAR; 
DECLARE curs DYNAMIC SCROLL CURSOR FOR SELECT table_name FROM systable WHERE table_name LIKE 't_anlyc%'; 

OPEN curs WITH HOLD; 
FETCH NEXT curs INTO @table_name; 

WHILE(sqlstate = 0) LOOP 
    FETCH NEXT curs INTO @table_name; 
    TRUNCATE TABLE table_name; 
END LOOP; 
END 
GO 

CALL truncate_analytics() 
GO 

結果中的 「右截斷」 錯誤和表不被截斷。

我想我在這裏錯過了一些非常明顯的東西,但我沒有這樣的SQL腳本經驗,並且似乎無法找到任何有效的示例來證明它甚至有可能。

任何人都可以指向正確的方向嗎?

回答

0

在工作中可能會有一些工作阻礙代碼工作。

在第二個示例中,文本「TRUNCATE TABLE table_name」將查找名爲table_name的表。 table_name不會被視爲變量值,但會被視爲對象標識符。 FWIW,我不確定這將如何導致正確的截斷錯誤。

根據你認爲表的前綴,你可能沒有得到你期望的表的列表。如果您正在考慮將用戶作爲前綴(即dba.my_table),則您的選擇不會獲取必要的表格;可以有多個同名的表,只是不同的所有者。如果您想根據用戶進行選擇,則需要加入SYSUSER視圖。

最後,爲此可以使用光標。它將需要WITH HOLD,因爲TRUNCATE TABLE語句會發出隱式提交併在其他情況下關閉遊標。 (請注意,WITH HOLD需要顯式關閉遊標,否則在連接關閉之前它將保持打開狀態。)另一種選擇是構建要執行的語句字符串,並將它們的execute或者EXECUTE IMMEDIATE作爲批處理使用。

希望這會有幫助,
泰森