SQL Anywhere 11-循环以截断特定表?

SQL Anywhere 11-循环以截断特定表?,sql,sybase,sqlanywhere,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 (

我试图找出如何创建一个循环截断,以便只截断(或删除)特定表中的数据。大约有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脚本没有太多经验,而且似乎找不到任何可以证明这一点的工作示例


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

可能有一些事情阻碍了代码的工作

在第二个示例中,文本“TRUNCATE TABLE\u name”将查找名为TABLE\u name的表。表_name不会被视为其变量值,但会被视为对象标识符。FWIW,我不确定这将如何导致正确的截断错误

根据您所考虑的表的前缀,您可能没有得到您所期望的表的列表。如果您将用户视为前缀(即dba.my_表),那么您的选择不会获取必要的表;可以有多个同名的表,只是不同的所有者。如果要选择“基于用户”,则需要加入SYSUSER视图

最后,可以使用光标进行此操作。它需要像您已经拥有的那样保持,因为TRUNCATE TABLE语句发出隐式提交,否则关闭游标。(注意,使用HOLD需要显式关闭游标,否则它将保持打开状态,直到连接关闭。)另一个选项是构建要执行的语句字符串,并将execute或execute立即数作为批处理使用

希望这有帮助,
泰森