SQL 2000: только выбирать записи, где xp_fileexist = true? - PullRequest
0 голосов
/ 25 октября 2010

представьте, что у меня есть таблица 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, запись удаляется из таблицы. Проблема решена.

1 Ответ

1 голос
/ 25 октября 2010

Довольно сложно получить результаты из хранимой процедуры. По сути, вы должны создать таблицу, которая точно соответствует выводу столбца, и insert ... exec в нее. Нет никакого шанса сделать это в предложении where.

Вы можете, однако, включить 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
...