Destek amaçlı sonradan dahil olduğumuz bir proje de ,  belge yolları SQL de ,belgelerin aslı dosya sisteminde tutuluyordu.  İletilen problemlerden bir tanesi , bazı dosyalar silinmiş olmasına rağmen SQL arşivinde belge yolları bulunduğu için çalışan sorgularda sonuçlara yansıyor ama belgelere erişilememesi idi.  Toplu olarak erişilemeyen yolları temizlemek için , dosya kontrolü ile aşa bilieceğimizi düşündük. ilk olarak dosya kontrolü için master.dbo.xp_fileexist denedik fakat , ayrı sunucudaki yada paylaşımdaki belge erişimlerinde çok başarılı olmadı. Sonra EXEC master..xp_cmdshell  ile yaptığımız denemelerde herhangi bir sorun ile karşılaşmadık.

kullandığımız kod bloğu aşağıdaki gibi. öncelikle tabloya belgedurumu adında bir kolon eklemesi yaptık ve tüm kayıtlara 2 değerini atadık. tüm dosya isimlerini kontrol edip var olanlara 1 olmayanlara 0 değeri atadık. Çalışan sorgularda 0 değerlileri hariç bırak ifadesi eklendi.

bu konuda başka önerileriniz var ise , yorum olarak ekleyebilir misiniz ? 🙂 teşekkürler.

declare @dosya nvarchar(150)
DECLARE @result INT
declare @path varchar(512)
DECLARE @deger INT

set @deger = 0

IF OBJECT_ID(‘tempdb..#kayitloglari’) IS NOT NULL
BEGIN
DROP TABLE #kayitloglari
END
CREATE TABLE #kayitloglari(
dosya nvarchar(150)
)

INSERT INTO #kayitloglari

Select distinct dosya FROM [ornekdb].[dbo].[tblKayitLog]
where dosya <> ” and belgedurumu = 2

declare c1 cursor for select dosya from #kayitloglari
open c1
fetch next from c1 into @dosya
while @@FETCH_STATUS=0 begin

set @path = ‘dir /b ‘ + ‘\\sunucuadi\Kayit\Upload\’ + REPLACE(@dosya, ‘/’ , ‘\’)
–EXEC master.dbo.xp_fileexist @path, @result OUTPUT

CREATE TABLE #x(a VARCHAR(1255));
INSERT #x EXEC master..xp_cmdshell @path;

select @dosya
SELECT * FROM #x
where a is not null
and a <> ‘The system cannot find the file specified.’
and a <> ‘File Not Found’

IF EXISTS (SELECT * FROM #x WHERE a is not null and a <> ‘The system cannot find the file specified.’ and a <> ‘File Not Found’)
begin
— PRINT ‘file exists’;
Update [ornekdb].[dbo].[tblKayitLog]
set belgedurumu = 1
where dosya = @dosya;

set @deger = @deger + 1;
end

ELSE
begin
PRINT ‘file does not exist’;
Update [ornekdb].[dbo].[tblKayitLog]
set belgedurumu = 0
where dosya = @dosya;
end
DROP TABLE #x;

fetch next from c1 into @dosya
end
close c1
deallocate c1

DROP TABLE #kayitloglari

select @deger