ファイルが存在するかどうか T-SQL から確認する方法

Transact-SQL からファイルの存在を確認する方法

この資料では SQL Server の T-SQL から、特定のファイルが存在するかどうかを確認する方法を示します。 動作確認は SQL Server 2008 で実施しました。

ストアドプロシージャからファイルを書き出すということは、あまりしないことかもしれませんが、 私は過去に何回か必要となるときがありましたので、こちらに情報を載せておきます。

非公開ストアドプロシージャ xp_fileexist

ファイルの存在確認をするために利用できる、非公開システムストアドプロシージャ xp_fileexist あります。使い方は次の通りです。

EXECUTE xp_fileexist <filename> [, <file_exists INT> OUTPUT]

第一引数にファイル名、または、ディレクトリ名を文字列で渡します。第二引数は OUTPUT パラメータで、 ファイルが存在した場合に 1 となって返ってきます。ディレクトリの場合は存在しても 0 のようです。

マイクロソフトの「非公開関数」を使うことのリスクについて

ただし、こちらは非公開、すなわちドキュメントされておらず、従って将来もサポートされるかどうか不明であることに注意して利用してください。

一般的に言って、ドキュメントされていない関数や API を利用するリスクとして、例えばサービスパックをインストールしたら利用できなくなる可能性がある、 不具合が発見されてもマイクロソフトが修正するとは限らない、そもそもたとえ有償だったとしても問い合わせすらできない可能性が高い、 などのリスクがあります。

従って、上述のリスクをおいたくない場合は、CLR 上のコードを書くなりして、自分でメンテナンス可能であるようにするべきです。 (といっても、SQL 2000 の時代から既にサポートされており、SQL Server 2008 でもサポートされていますので、 楽観的に今後もサポートするだろうと考えても悪くは無いように思いますが・・・)

ファイルの存在確認

ディレクトリの存在確認

ディレクトリが存在するかどうかは、xp_fileexist にディレクトリ名を渡して以下のようにチェック可能です。

ファイルの存在確認

ファイルが存在するかどうかは、xp_fileexist にファイル名を渡して以下のようにチェック可能です。

また、プログラムから利用しやすくするために、二番目のオプションパラメータがありますので、 それを利用して、ファイルの存在確認をすることができます。

ファイルが存在する場合、呼び出し側に 1 が返ります。

また、結果をテーブルに入れて使う場合は、例えば次のようにするとよいでしょう。

DECLARE @FileCheck TABLE(
    FileExists                BIT,
    FileIsADirectory        BIT,
    ParentDirectoryExists    BIT
);

INSERT INTO @FileCheck (FileExists, FileIsADirectory, ParentDirectoryExists)    
EXEC master..xp_fileexist @fileName;

ここまでお読みいただき、誠にありがとうございます。SNS 等でこの記事をシェアしていただけますと、大変励みになります。どうぞよろしくお願いします。

© 2024 Web/DB プログラミング徹底解説