none
SP Write String to File RRS feed

  • Domanda

  • Ciao ragazzi ho un problema con la SP in ogetto,

    Utilizzo la SP all'interno di un loop, ma nel file di testo in output che la SP genera mi scrive una sola riga invece di una serie di record, per l'esattezza mi sovrascrive sempre il file.

    Non so se è chiaro il problema.

    Di seguito la procedura:

    USE [ASPNETDB]
    GO
    / Object:  StoredProcedure [dbo].[spWriteStringToFile]    Script Date: 24/06/2015 15:09:44 /
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    ALTER PROCEDURE [dbo].[spWriteStringToFile]
     (
    @String Varchar(max), --8000 in SQL Server 2000
    @Path VARCHAR(255),
    @Filename VARCHAR(100)
    --
    )
    AS
     DECLARE  @objFileSystem int
       ,@objTextStream int,
       @objErrorObject int,
       @strErrorMessage Varchar(1000),
       @Command varchar(1000),
       @hr int,
       @fileAndPath varchar(80)
     set nocount on
     select @strErrorMessage='opening the File System Object'
     EXECUTE @hr = sp_OACreate  'Scripting.FileSystemObject' , @objFileSystem OUT
     Select @FileAndPath=@path+'\'+@filename
     if @HR=0 Select @objErrorObject=@objFileSystem , @strErrorMessage='Creating file "'+@FileAndPath+'"'
     if @HR=0 execute @hr = sp_OAMethod   @objFileSystem   , 'CreateTextFile'
      , @objTextStream OUT, @FileAndPath,2,True
     if @HR=0 Select @objErrorObject=@objTextStream, 
      @strErrorMessage='writing to the file "'+@FileAndPath+'"'
     if @HR=0 execute @hr = sp_OAMethod  @objTextStream, 'Write', Null, @String
     if @HR=0 Select @objErrorObject=@objTextStream, @strErrorMessage='closing the file "'+@FileAndPath+'"'
     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,'')
       RAISERROR (@strErrorMessage,16,1)
      END
     EXECUTE  sp_OADestroy @objTextStream
     EXECUTE sp_OADestroy @objFileSystem


    Questo è il ciclo:

    OPEN smaME_cursor
          FETCH NEXT FROM smaME_cursor  
          INTO @MANCECC
    
          WHILE @@FETCH_STATUS = 0
          BEGIN
    
           EXEC spWriteStringToFile @recME, 'c:\temp','a.txt';
    
           FETCH NEXT FROM smaME_cursor 
           INTO @MANCECC
          END
          CLOSE smaME_cursor
          DEALLOCATE smaME_cursor

    Dovrei far si che nel file di testo ci siano tutte le righe fatte dall'interrogazione e non solo una.

    Grazie in anticipo.

    mercoledì 24 giugno 2015 13:14

Risposte

  • è ovvio che sia così perchè tu usi una stored procedure che apre un file sul file system, scrive la stringa e lo chiude.

    se la usi ciclicamente in un ciclo while. la sp esegue quanto sopra ripetutamentema la stringa inserita è sempre solo una.

    per fare quello che desideri devi creare il ciclo all'interno della sp oppure modificare la sp in modo che il file venga aperto in append, il puntatore si posizioni alla fine del file e solo a quel punto venga aggiunta la stringa.

    con una sp così modificata allora potrai usarla all'interno di un ciclo.

    ciao.


    Edoardo Benussi
    Microsoft MVP - Directory Services
    edo[at]mvps[dot]org

    mercoledì 24 giugno 2015 13:38
    Moderatore

Tutte le risposte

  • è ovvio che sia così perchè tu usi una stored procedure che apre un file sul file system, scrive la stringa e lo chiude.

    se la usi ciclicamente in un ciclo while. la sp esegue quanto sopra ripetutamentema la stringa inserita è sempre solo una.

    per fare quello che desideri devi creare il ciclo all'interno della sp oppure modificare la sp in modo che il file venga aperto in append, il puntatore si posizioni alla fine del file e solo a quel punto venga aggiunta la stringa.

    con una sp così modificata allora potrai usarla all'interno di un ciclo.

    ciao.


    Edoardo Benussi
    Microsoft MVP - Directory Services
    edo[at]mvps[dot]org

    mercoledì 24 giugno 2015 13:38
    Moderatore
  • Grazie, immaginavo fosse quella la via.

    Ho provato in questo modo mentre aspettavo una risposta e sembrerebbe funzionare:

    OPEN smaME_cursor
          FETCH NEXT FROM smaME_cursor  
          INTO @MANCECC
    
          set @recME = ' ';
    
          WHILE @@FETCH_STATUS = 0
          BEGIN
           
           set @recME =  LTrim(@recME) + @MANCECC + CHAR(13) + CHAR(10) 
    
           FETCH NEXT FROM smaME_cursor 
           INTO @MANCECC
          END
          EXEC spWriteStringToFile @recME, 'c:\temp','a.txt';
          CLOSE smaME_cursor
          DEALLOCATE smaME_cursor

    Grazie per la celerità nella risposta.

    mercoledì 24 giugno 2015 13:46