非常によく似たデータを保持する多くのテーブルを持つデータベースをサポートしています。時間の経過とともに、このデータの多くは不要になり、アプリケーションがこれらのテーブルを作成するときにテーブル名は動的になり、現在の日付がテーブル名内で使用されます。
isql
を使用して、すべてのテーブルに保存する必要がなくなった行を削除するバッチファイルを作成しようとしています。それらはすべて同じ文字セットで始まり、その後に_creationdateが続きます。
それらの名前を見つけるためのスクリプトを作成する方法、または次のようなワイルドカードを使用する方法はありますか?
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の1文字のワイルドカードであるため、リテラル_
を見つけるためにエスケープする必要があります。 T-SQLでは、ほとんどすべての文字をエスケープとして機能させることができますが、like
句の後に定義する必要があります。最後に、%
は複数文字のワイルドカードであり、T-SQLは* nixおよびDOSの*
に相当します。
上記のクエリを使用して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