データベーステーブルが既に存在するかどうかを判断するポータブルな方法はありますか?
7 に答える
ポータブル?私はそうは思わない。
おそらくあなたが得ることができる最も近いものは次のとおりです:
select * from <table>
テーブルが存在しない場合、これはエラーを返します。
私は言うだろう
select 'x' from <table_name> where 0=1;
欠点は、エラーが発生した場合、本当の原因が何なのかはっきりとわからないことです。テーブルがないか、接続エラーなどの可能性があります。エラーメッセージを解析できますが、間違いなく移植できません。
適度に移植可能なものを次に示します。
table limit 1 から now() を選択します。
特定の列の知識に依存しません。
count(*) で発生することがあるオーバーヘッドは発生しません。
テーブルが空かどうかは問題ではありません。
テーブルが存在しない場合は失敗します。
INFORMATION_SCHEMA ビューは ANSI 標準であるため、最も移植性の高いオプションです。where句にスキーマとテーブルタイプを追加することを忘れないでください...
if exists(select *
from information_schema.tables
where table_schema = 'dbo'
and table_name = 'MyTable'
and table_type = 'basetable')
begin
-- your code here
end
すべての DBMS には独自のメタベースがあるため、これを行う最も "移植性の高い" 方法は、アプリケーションの呼び出し元自体を使用することだと思います。何かのようなもの
try
execute("select top 1 * from table")
return (true)
catch
return false
テーブルのクエリを試みます。クエリが失敗した場合 -- エラーが表示されます。クエリは存在しません。
それはおそらくあなたが得ることができるのと同じくらいポータブルです。結果を生成する負荷は、テーブル/データベースをクエリするコードに依存します。
select top 1 *
from MyTable
他のエラーが発生するのを防ぐために、クエリはできるだけ単純にしてください。