Forum
a, b, c, d, e, f
gibi toplamda 21 sütunluk ve "," ile ayrılan \n ile biten bir txt dosyam var ve sürekli büyümekte.
Bu dosyadaki sadece en alttaki 5 satırı insert etmek istiyorum.
lastrow = 5 kullandığımda, en alttaki 5 satırı görmezden gelip kalanların hepsini insert ediyor.
firstrow = 5 dediğimde sadece ilk 5 i insert ediyor.
Sorum şu ki, txt nin içinde kaç satır olduğunu bilmiyorum ve her dakika büyüyor.
sadece son 5 satırı çekmesinin bir yolu varmıdır
@lastrow kaçıncı satıra kadar okunacağını belirtmek için kullanılır.
Örneğin @firstrow=2, @lastrow=5 olduğu durumda 2. satırla 5.satır arasındaki veriler insert edilir.
Default parametre olarak senin istediğin karşılanmıyor ne yazıkki. Ancak şöyle birşey yapabilirsin. oto identity si olan bir ara tabloya verinin tamamını çıkıp daha sonra bu tablodan son 5 kayıtı okuyabilirsin.
Turgay hocam cevap için teşekkürler.
Bu txt yi dakika başı bir tabloya önce truncate edip sonra insert edecem.
Tabloda ortalama 2oo bin satırın olduğunu varsayarsak, her dakika işlemi tekrarlamak Sql i yoracağını düşünüyorum.
Txt yi insert etmeden, kaç satır veri olduğunu
Select count (*)from
Dbo.uftReadfileAsTable('C:\Documents and Settings\Administrator\Desktop\dc\Soacs Server Files\Ebenezer\Log\','14.txt')
where line not like '#%'
ile okuyabiliyorum fakat bunu @firstrow a değişken olarak atayamıyorum.
Eğer aktarabilirsek, bu rakamdan 5 çıkartıp @lastrow u sıfır kullanarak sanırım son 5 satırı insert ettirebilirim sadece.
uftreadFileasTable function ım ise şu şekilde
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go
ALTER FUNCTION [dbo].[uftReadfileAsTable]
(
@Path VARCHAR(255),
@Filename VARCHAR(100)
)
RETURNS
@File TABLE
(
[LineNo] int identity(1,1),
line varchar(8000))
AS
BEGIN
DECLARE @objFileSystem int
,@objTextStream int,
@objErrorObject int,
@strErrorMessage Varchar(1000),
@Command varchar(1000),
@hr int,
@String VARCHAR(8000),
@YesOrNo INT
select @strErrorMessage='opening the File System Object'
EXECUTE @hr = sp_OACreate 'Scripting.FileSystemObject' , @objFileSystem OUT
if @HR=0 Select @objErrorObject=@objFileSystem, @strErrorMessage='Opening file "'+@path+'\'+@filename+'"',@command=@path+'\'+@filename
if @HR=0 execute @hr = sp_OAMethod @objFileSystem , 'OpenTextFile'
, @objTextStream OUT, @command,1,false,0--for reading, FormatASCII
WHILE @hr=0
BEGIN
if @HR=0 Select @objErrorObject=@objTextStream,
@strErrorMessage='finding out if there is more to read in "'+@filename+'"'
if @HR=0 execute @hr = sp_OAGetProperty @objTextStream, 'AtEndOfStream', @YesOrNo OUTPUT
IF @YesOrNo<>0 break
if @HR=0 Select @objErrorObject=@objTextStream,
@strErrorMessage='reading from the output file "'+@filename+'"'
if @HR=0 execute @hr = sp_OAMethod @objTextStream, 'Readline', @String OUTPUT
INSERT INTO @file(line) SELECT @String
END
if @HR=0 Select @objErrorObject=@objTextStream,
@strErrorMessage='closing the output file "'+@filename+'"'
if @HR=0 execute @hr = sp_OAMethod @objTextStream, 'Close'
if @hr<>0
begin
Declare
@Source varchar(255),
@Description Varchar(255),
@Helpfile Varchar(255),
@HelpID int
EXECUTE sp_OAGetErrorInfo @objErrorObject,
@source output,@Description output,@Helpfile output,@HelpID output
Select @strErrorMessage='Error whilst '
+coalesce(@strErrorMessage,'doing something')
+', '+coalesce(@Description,'')
insert into @File(line) select @strErrorMessage
end
EXECUTE sp_OADestroy @objTextStream
-- Fill the table variable with the rows for your result set
RETURN
END
dynamic sql kullanarak parametre olarak verebilirsin diye düşünüyorum.
aşağıdaki url yi inceler misin.
http://www.eggheadcafe.com/software/aspnet/33048867/bulk-insertlastrow-attribute.aspx
Merhaba turgay hocam.
Verdiğiniz link işimi gördü.
Son 5 kayıdı okumak istiyordum, bulk insertle yapmak mümkün değil. Fakat openrowset ile mümkünmüş.
Teşekkür ederim ilginize
Rica ederim kolay gelsin