Sybase
Sybase ASE 12 問題
我支持一個數據庫,該數據庫具有許多包含非常相似數據的表。隨著時間的推移,這些數據中的大部分都不再需要,並且表名是動態的,因為應用程序正在創建這些表,並且目前日期在表名中使用。
我正在嘗試編寫一個批處理文件,用於
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