我支持一个拥有许多表的数据库,这些表包含非常相似的数据。随着时间的推移,这些数据中的大部分是不需要的,而且表名是动态的,因为应用程序正在创建这些表,当前的日期在表名中使用。
我正在尝试编写一个批处理文件,该文件使用isql删除不再需要存储在所有表中的行。它们都以相同的一组字符开始,后面跟着_creation日期。
是否有任何方法可以编写脚本来查找这些名称,或者使用通配符,例如:
DELETE FROM Table_* WHERE Type = 1根据我的测试,上面的SQL命令不起作用。有没有一种不用指定确切的表名就能解决这个问题的方法?
发布于 2014-03-25 14:36:42
Sybase ASE将不允许您使用通配符直接从多个表中删除行,但是创建一个脚本来查找表名并遍历它们非常简单。
您可以通过在数据库中查询sysobjects来查找表名。
要查找前缀为Table_的所有表,请执行以下操作:
select name from myDatabase..sysobjects
where type = "U"
and name like "Table\_%" escape "\"在上面的查询中,"U"是用户定义表的标志。另外,由于_是the中的单个字符通配符,所以我们必须将其转义以找到文字_。to允许几乎任何字符充当转义,但它必须在like子句之后定义。最后,%是多字符通配符,在*nix和DOS中相当于*的to。
还可以使用上面的查询来构建sql脚本。我们首先告诉服务器不要使用set nocount打印受查询影响的行数。这样我们就可以创建一个没有错误的脚本,而不需要额外的编辑.
set nocount on \\supressess rows affected printout
select "delete from " +name+ " where type = 1" + char(10) + "go"
from myDatabase..sysobjects
where type = "U"
and name like "Table\_%" escape "\"
go如果您从isql执行此操作,并使用-b标志来压制标头,使用-o标志将输出重定向到文件,那么它将构建一个脚本,然后直接执行该脚本。
isql -Uusername -Ppassword -Sservername -b -omyScriptToDeleteData.sql -iSQLToFindTables.sqlhttps://dba.stackexchange.com/questions/61631
复制相似问题