我支持一个数据库,该数据库有许多包含非常相似数据的表。随着时间的推移,这些数据中的大部分都不再需要了,并且表名是动态的,因为应用程序正在创建这些表,并且在表名中使用当前日期。
我正在尝试编写一个批处理文件,用于isql
删除不再需要存储在所有表中的行。它们都以相同的字符集开头,然后是_creation date。
有什么方法可以编写脚本来查找这些名称,或者使用通配符,例如:
DELETE FROM Table_* WHERE Type = 1
根据我的测试,上面的 SQL 命令不起作用。有没有办法解决这个问题而不必指定确切的表名?
Sybase ASE 不允许您使用通配符直接从多个表中删除行,但是创建一个脚本来查找表名并循环遍历它们非常简单。
sysobjects
您可以通过在数据库中查询来找到表名。要查找带有前缀的所有表,
Table_
您可以执行以下操作:在上面的查询
"U"
中是用户定义表的标志。也因为_
是 T-SQL 中的单字符通配符,我们必须转义它才能找到文字_
. T-SQL 允许几乎任何字符作为转义字符,但必须在like
子句之后定义。最后%
是多字符通配符,相当于*
*nix 和DOS 中的T-SQL。也可以使用上述查询来构建 sql 脚本。我们首先告诉服务器不要使用 打印出受查询影响的行数
set nocount
。这使我们能够创建一个无错误运行的脚本,无需额外编辑。如果您从中执行此命令
isql
并使用-b
标志来抑制标头,并使用-o
标志将输出重定向到文件,它将构建一个可以直接执行的脚本。