0

tbl_pictures: picture_id と picture_name というテーブルがあり、そのテーブルには約 500 のレコードがあるとします。写真は c:\mypics\ に保存されます

問題: すべての写真がもう存在しているわけではありませんが、それらはまだテーブルにあります。存在する写真だけを一覧表示するにはどうすればよいですか?

「EXEC Master.dbo.xp_fileexist @filename」で単一のファイルが存在するかどうかを確認する方法は知っていますが、ループでそれを行う方法はわかりません。

以下のようになります。

SELECT picture_name FROM tbl_pictures WHERE (xp_fileexist '@picture_name' = true)

誰?:)


編集:

代わりに、ファイルが存在する関数を呼び出す asp.net ループを使用しました。false を返すと、レコードはテーブルから削除されます。問題が解決しました。

4

1 に答える 1

1

ストアド プロシージャから結果を取得するのは非常に困難です。基本的に、正確な列出力とそれに一致するテーブルを作成する必要がありますinsert ... execwhere句でそれを行う機会はまったくありません。

ただし、 をループしてwhile、結果をテーブルに送り込むことはできます。例えば:

set nocount on
if OBJECT_ID('tempdb..#TempFileList') is not null
    drop table #TempFileList
create table #TempFileList (file_name nvarchar(250), file_exist bit)
insert #TempFileList (file_name) values ('c:\windows\win.ini')
insert #TempFileList (file_name) values ('c:\somefile.txt')

if OBJECT_ID('tempdb..#TempFileResult') is not null
    drop table #TempFileResult
create table #TempFileResult (File_exists int, File_directory int,parent_dir int)


declare c cursor local fast_forward for select file_name from #TempFileList
open c
declare @file_name nvarchar(250)
fetch from c into @file_name
while @@FETCH_STATUS = 0
    begin
    delete from #TempFileResult
    insert into #TempFileResult exec Master.dbo.xp_fileexist @file_name

    update  #TempFileList
    set     file_exist = (select file_exists from #TempFileResult)
    where   file_name = @file_name

    fetch from c into @file_name
    end

close c
deallocate c

select * from #TempFileList

私のシステムでは、これは次のように出力されます。

file_name             file_exist
c:\windows\win.ini    1
c:\somefile.txt       0
于 2010-10-25T10:53:23.123 に答える