Bildirimler
Hepsini Temizle

Bulk Insert  

  RSS
Gökhan TAŞÇI
(@GokhanTASCI)
Üye

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

Alıntı
Gönderildi : 15/10/2010 05:05
Turgay Sahtiyan
(@turgaysahtiyan)
Üye

@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. 

CevapAlıntı
Gönderildi : 15/10/2010 13:25
Gökhan TAŞÇI
(@GokhanTASCI)
Üye

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

 

CevapAlıntı
Gönderildi : 15/10/2010 18:04
Turgay Sahtiyan
(@turgaysahtiyan)
Üye

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  

CevapAlıntı
Gönderildi : 15/10/2010 19:35
Gökhan TAŞÇI
(@GokhanTASCI)
Üye

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

CevapAlıntı
Gönderildi : 20/10/2010 03:22
Turgay Sahtiyan
(@turgaysahtiyan)
Üye

Rica ederim kolay gelsin

CevapAlıntı
Gönderildi : 20/10/2010 12:21
Paylaş: