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
İlk Yorumu Siz Yapın