Sybase

Sybase ASE 12 問題

  • March 25, 2014

我支持一個數據庫,該數據庫具有許多包含非常相似數據的表。隨著時間的推移,這些數據中的大部分都不再需要,並且表名是動態的,因為應用程序正在創建這些表,並且目前日期在表名中使用。

我正在嘗試編寫一個批處理文件,用於isql刪除不再需要儲存在所有表中的行。它們都以相同的字元集開始,然後是_創建日期。

有沒有辦法編寫腳本來查找這些名稱,或使用萬用字元,例如:

DELETE FROM Table_* WHERE Type = 1

根據我的測試,上面的 SQL 命令不起作用。有沒有辦法解決這個問題而不必指定確切的表名?

Sybase ASE 不允許您使用萬用字元直​​接從多個表中刪除行,但是創建一個腳本來查找表名並遍歷它們非常簡單。

sysobjects您可以通過在數據庫中查詢來找到表名。

要查找帶有前綴的所有表,Table_您將執行以下操作:

select name from myDatabase..sysobjects
where type = "U"
and name like "Table\_%" escape "\"

在上面的查詢"U"中是使用者定義表的標誌。也因為_是 T-SQL 中的單字元萬用字元,我們必須對其進行轉義才能找到文字_. T-SQL 幾乎允許任何字元充當轉義符,但它必須在like子句之後定義。最後%是多字元萬用字元,相當於**nix 和DOS 中的T-SQL。

也可以使用上述查詢來建構 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.sql

引用自:https://dba.stackexchange.com/questions/61631