我试图弄清楚如何创建一个循环截断来截断(或删除)特定表中的数据。有大约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脚本编写经验,而且似乎找不到任何有用的例子。证明它甚至是可能的。
有人能指出我正确的方向吗?
答案 0 :(得分:0)
可能有一些工作阻止代码工作。
使用您的第二个示例,文本" TRUNCATE TABLE table_name"将要查找名为table_name的表。 table_name不会被视为它的变量值,但会被视为对象标识符。 FWIW,我不确定这会如何导致正确的截断错误。
根据您认为表的前缀,您可能无法获得所需的表列表。如果您考虑将用户作为前缀(即dba.my_table),则您的选择不会获取必要的表格;可以有多个具有相同名称的表,只是不同的所有者。如果您想根据用户进行选择,则需要加入SYSUSER视图。
最后,可以使用光标来完成此操作。它将需要WITH HOLD,因为TRUNCATE TABLE语句发出隐式提交并以其他方式关闭游标。 (请注意,WITH HOLD需要显式关闭游标,否则它将保持打开状态,直到连接关闭。)另一个选项是构建一个要执行的语句字符串,并将它们作为批处理使用execute或EXECUTE IMMEDIATE。
希望这有助于, 泰森