SQL Anywhere 11 - 循环到TRUNCATE特定表?

时间:2014-08-29 17:40:57

标签: sql sybase sqlanywhere

我试图弄清楚如何创建一个循环截断来截断(或删除)特定表中的数据。有大约30个左右的表需要被截断,我想避免使用truncate语句列表。我似乎无法找到这样做的任何好例子,无论我尝试什么,我都会得到一个"右截断"错误。

示例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;

这个没有错误,但是在.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脚本编写经验,而且似乎找不到任何有用的例子。证明它甚至是可能的。

有人能指出我正确的方向吗?

1 个答案:

答案 0 :(得分:0)

可能有一些工作阻止代码工作。

使用您的第二个示例,文本" TRUNCATE TABLE table_name"将要查找名为table_name的表。 table_name不会被视为它的变量值,但会被视为对象标识符。 FWIW,我不确定这会如何导致正确的截断错误。

根据您认为表的前缀,您可能无法获得所需的表列表。如果您考虑将用户作为前缀(即dba.my_table),则您的选择不会获取必要的表格;可以有多个具有相同名称的表,只是不同的所有者。如果您想根据用户进行选择,则需要加入SYSUSER视图。

最后,可以使用光标来完成此操作。它将需要WITH HOLD,因为TRUNCATE TABLE语句发出隐式提交并以其他方式关闭游标。 (请注意,WITH HOLD需要显式关闭游标,否则它将保持打开状态,直到连接关闭。)另一个选项是构建一个要执行的语句字符串,并将它们作为批处理使用execute或EXECUTE IMMEDIATE。

希望这有助于, 泰森