Forum

Bulk Insert
 
Bildirimler
Hepsini Temizle

Bulk Insert

6 Yazılar
2 Üyeler
0 Likes
1,440 Görüntüleme
(@GokhanTASCI)
Gönderiler: 38
Trusted Member
Konu başlatıcı
 

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

 
Gönderildi : 15/10/2010 05:05

(@turgaysahtiyan)
Gönderiler: 344
Reputable Member
 

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

 
Gönderildi : 15/10/2010 13:25

(@GokhanTASCI)
Gönderiler: 38
Trusted Member
Konu başlatıcı
 

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

 

 
Gönderildi : 15/10/2010 18:04

(@turgaysahtiyan)
Gönderiler: 344
Reputable Member
 

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  

 
Gönderildi : 15/10/2010 19:35

(@GokhanTASCI)
Gönderiler: 38
Trusted Member
Konu başlatıcı
 

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

 
Gönderildi : 20/10/2010 03:22

(@turgaysahtiyan)
Gönderiler: 344
Reputable Member
 

Rica ederim kolay gelsin

 
Gönderildi : 20/10/2010 12:21

Paylaş: