SQL Anywhere 11-循环以截断特定表?
我试图找出如何创建一个循环截断,以便只截断(或删除)特定表中的数据。大约有30个表需要被截断,我想避免只使用truncate语句列表。我似乎找不到任何这样做的好例子,不管我怎么做,我都会得到一个“右截断”错误 例1: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 (
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立即数作为批处理使用 希望这有帮助,泰森