in

UGISS Community

Il sito della community dello User Group Italiano di SQL Server

Esportazione dati su foglio XLS utilizzando xp_cmdshell

Last post 02-12-2008 9.27 by sgovoni. 7 replies.
Page 1 of 1 (8 items)
Sort Posts: Previous Next
  • 02-07-2008 16.53

    • sgovoni
    • Top 10 Contributor
      Male
    • Joined on 10-18-2007
    • Posts 171
    • Points 2.625

    Esportazione dati su foglio XLS utilizzando xp_cmdshell

    Ciao a tutti,

    avrei la necessità di esportare i dati estratti da una query su un file XLS specificando anche il nome del foglio. Ho pensato di utilizzare la stored procedure xp_cmdshell (il comando viene sempre lanciato da un utente sysadmin) ed effettivamente l'esportazione avviene come mi aspetto.

    EXEC MASTER..XP_CMDSHELL 'bcp "SELECT CODICE, DESCR FROM SERVER.DATABASE.DBO.TABELLA ORDER BY CODICE" queryout C:\TABELLA.XLS -c -S SERVER' 

    Non riesco però a specificare il foglio del file XLS in cui vorrei esportare i dati, il file creato ha un unico foglio con nome uguale al nome del file XLS.

    Avete qualche suggerimento da darmi ?

    Sto lavorando con SQL Server 2000.

    Grazie

    Sergio

    Filed under:
    • Post Points: 20
  • 02-07-2008 18.29 In reply to

    Re: Esportazione dati su foglio XLS utilizzando xp_cmdshell

    Ciao,

    se il file excel di arrivo esiste e il foglio in cui vuoi scrivere ha la prima riga col nome delle colonne che estrai nella query e quando esegui la query il file excel e' chiuso puoi usare queste istruzioni:

     [esporta i campi CodFarmacie, DesFarmacia dalla tabella Ana_Farmacia nel foglio Farmacie del file excel c:\temp\Test.xls]

    --Per esportare dati da SQL Server ad un foglio di Excel

    --(il file excel deve avere le intestazioni di colonna con lo stesso nome delle colonne della tabella sql):

    insert into OPENROWSET('Microsoft.Jet.OLEDB.4.0',

    'Excel 8.0;Database=c:\temp\Test.xls;',

    'SELECT CodFarmacia,DesFarmacia FROM [Farmacie$]') select CodFarmacia,DesFarmacia from dbo.Ana_Farmacia ;

    Franco Pigoli
    Consulente IT ( .Net, SAS, SqlServer) & Analisi dati
    MCTS Sql2005
    • Post Points: 20
  • 02-07-2008 18.44 In reply to

    • sgovoni
    • Top 10 Contributor
      Male
    • Joined on 10-18-2007
    • Posts 171
    • Points 2.625

    Re: Esportazione dati su foglio XLS utilizzando xp_cmdshell

    orsocurioso:
    se il file excel di arrivo esiste e il foglio in cui vuoi scrivere ha la prima riga col nome delle colonne che estrai nella query e quando esegui la query il file excel e' chiuso

    Ciao Franco,

    sono nelle condizioni che hai elencato e l'esportazione con OPENROWSET funziona. Ho notato però che le righe vengono sempre accodate, c'è una opzione che permette di sovrascrivere il foglio ?

    Grazie

    Sergio

    • Post Points: 20
  • 02-07-2008 20.25 In reply to

    Re: Esportazione dati su foglio XLS utilizzando xp_cmdshell

    Ahime' Sergio, purtroppo non si  riesce a deletare le righe gia' inserite per cui va sempre tutto in Insert "append" Sad

    Almeno io non ho mai trovato il modo...

    Franco Pigoli
    Consulente IT ( .Net, SAS, SqlServer) & Analisi dati
    MCTS Sql2005
    • Post Points: 20
  • 02-08-2008 11.44 In reply to

    • sgovoni
    • Top 10 Contributor
      Male
    • Joined on 10-18-2007
    • Posts 171
    • Points 2.625

    Re: Esportazione dati su foglio XLS utilizzando xp_cmdshell

    orsocurioso:
    Ahime' Sergio, purtroppo non si  riesce a deletare le righe gia' inserite per cui va sempre tutto in Insert "append"

    Ciao Franco,

    ho provato anche con:

    DELETE OPENDATASOURCE ('Microsoft.Jet.OleDB.4.0', 'Data Source="C:\Scambio\Test.xls"; extended Properties=Excel 8.0')...Foglio2$

    WHERE Descr = 'Test'

    ma non permette di eliminare righe... poi ho trovato un esempio che definisce una stored procedure di esportazione verso Excel (non è farina del mio sacco Smile, l'ho solo modificato un po').

    Lo posto di seguito perchè potrebbe essere utile. Il foglio specificato (Worksheet) viene sovrascritto ad ogni esecuzione. Il file XLS non deve essere in uso al momento dell'esecuzione della stored procedure.

    IF (OBJECT_ID('CS_SP_DMOExportToExcel', 'P') IS NOT NULL)

    DROP PROCEDURE DBO.[CS_SP_DMOExportToExcel]

    GO

    /* Creazione stored procedure */

    CREATE PROCEDURE [dbo].[CS_SP_DMOExportToExcel]

    (@SourceServer VARCHAR(30),

    @SourceUID VARCHAR(30)=NULL,

    @SourcePWD VARCHAR(30)=NULL,

    @QueryText VARCHAR(200),

    @filename VARCHAR(100),

    @WorksheetName VARCHAR(100)='Worksheet',

    @RangeName VARCHAR(80)='MyRangeName')

    AS BEGIN

    /* Descrizione: Esportazione dati per utilizzare Excel come strumento

    di visualizzazione e pivoting.

    Creazione di un foglio di lavoro e scrittura dei dati

    all'interno di esso. Dimensionamento colonne. */

    DECLARE @objServer INT,

    @objQueryResults INT,

    @objCurrentResultSet INT,

    @objExcel INT,

    @objWorkBooks INT,

    @objWorkBook INT,

    @objWorkSheet INT,

    @objRange INT,

    @hr INT,

    @Columns INT,

    @Rows INT,

    @Output INT,

    @currentColumn INT,

    @currentRow INT,

    @ResultSetRow INT,

    @off_Column INT,

    @off_Row INT,

    @command VARCHAR(255),

    @ColumnName VARCHAR(255),

    @value VARCHAR(255),

    @strErrorMessage VARCHAR(255),

    @objErrorObject INT,

    @Alphabet VARCHAR(27)

    SELECT @Alphabet='ABCDEFGHIJKLMNOPQRSTUVWXYZ'

    IF @QueryText IS NULL

    BEGIN

    RAISERROR ('Errore: Non è stata specificata la query per la stored procedure CS_SP_DMOExportToExcel', 16, 1)

    RETURN 1

    END

    -- Impostazione del server a local server

    IF @SourceServer IS NULL SELECT @SourceServer = @@servername

    -- Disabilitazione messaggi

    SET NOCOUNT ON SELECT @strErrorMessage='Istanza di DMO',

    @objErrorObject=@objServer

    EXEC @hr= sp_OACreate 'SQLDMO.SQLServer', @objServer OUT

    IF (@SourcePWD IS NULL) OR

    (@SourceUID IS NULL) BEGIN

    -- Utilizzo la trusted connection

    IF @hr=0

    SELECT @strErrorMessage= 'Impostazione login con windows authentication su '

    +@SourceServer,

    @objErrorObject=@objServer

    IF @hr=0 EXEC @hr=sp_OASetProperty @objServer, 'LoginSecure', 1

    IF @hr=0

    SELECT @strErrorMessage= 'Login in corso al server richiesto, utilizzando windows authentication su '

    +@SourceServer

    IF (@SourceUID IS NULL) AND

    (@hr=0)

    EXEC @hr=sp_OAMethod @objServer,

    'Connect',

    NULL,

    @SourceServer

    IF (@SourceUID IS NOT NULL) AND

    (@hr=0)

    EXEC @hr=sp_OAMethod @objServer,

    'Connect',

    NULL, @SourceServer,

    @SourceUID

    END

    ELSE

    BEGIN

    IF @hr=0

    SELECT @strErrorMessage = 'Connessione a '''+@SourceServer+

    ''' con user ID '''+@SourceUID+'''',

    @objErrorObject=@objServer

    IF @hr=0

    EXEC @hr=sp_OAMethod @objServer,

    'Connect',

    NULL,

    @SourceServer, @SourceUID,

    @SourcePWD

    END

    -- Esecuzione della query

    IF @hr=0

    SELECT @strErrorMessage='Esecuzione query "'

    +@querytext+'", su '+@SourceServer,

    @objErrorObject=@objServer,

    @command = 'ExecuteWithResults("' + @QueryText + '")'

    IF @hr=0

    EXEC @hr=sp_OAMethod @objServer, @command, @objQueryResults OUT

    IF @hr=0

    SELECT @strErrorMessage='Restituzione del primo result set per "' +@querytext+'", su '+@SourceServer,

    @objErrorObject=@objQueryResults

    IF @hr=0

    EXEC @hr=sp_OAMethod @objQueryResults, 'CurrentResultSet', @objCurrentResultSet OUT

    IF @hr=0

    SELECT @strErrorMessage='Restituzione di righe e colonne "'

    +@querytext+'", su '+@SourceServer IF @hr=0

    EXEC @hr=sp_OAMethod @objQueryResults, 'Columns', @Columns OUT

    IF @hr=0 EXEC @hr=sp_OAMethod @objQueryResults, 'Rows', @Rows OUT

    -- Il risultato della query è disponibile. Start up della connessione a Excel

    IF @hr=0

    SELECT @strErrorMessage='Creazione dell''applicazione Excel su '

    +@SourceServer,

    @objErrorObject=@objExcel

    IF @hr=0

    EXEC @hr=sp_OACreate 'Excel.Application', @objExcel OUT

    IF @hr=0

    SELECT @strErrorMessage='Restituzione dell''oggetto WorkBooks '

    IF @hr=0 EXEC @hr=sp_OAGetProperty @objExcel, 'WorkBooks', @objWorkBooks OUT

    -- Creazione workbook

    IF @hr=0

    SELECT @strErrorMessage='Aggiunta di un workbook ',

    @objErrorObject=@objWorkBooks

    IF @hr=0

    EXEC @hr=sp_OAGetProperty @objWorkBooks, 'Add', @objWorkBook OUT

    -- Creazione worksheet

    IF @hr=0

    SELECT @strErrorMessage='Aggiunta di un worksheet ',

    @objErrorObject=@objWorkBook

    IF @hr=0

    EXEC @hr=sp_OAGetProperty @objWorkBook, 'worksheets.Add',

    @objWorkSheet OUT

    IF @hr=0

    SELECT @strErrorMessage='Assegnazione nome worksheet con "'

    +@WorksheetName+'"',

    @objErrorObject=@objWorkBook

    IF @hr=0

    EXEC @hr=sp_OASetProperty @objWorkSheet, 'name', @WorksheetName SELECT @currentRow = 1

    -- Scrittura column headings

    SELECT @currentColumn = 1

    WHILE (@currentColumn <= @Columns AND @hr=0)

    BEGIN

    IF @hr=0

    SELECT @strErrorMessage='Restituzione column heading ' +LTRIM(STR(@currentcolumn)),

    @objErrorObject=@objQueryResults,

    @Command='ColumnName(' +CONVERT(VARCHAR(3),@currentColumn)+')'

    IF @hr=0

    EXEC @hr=sp_OAGetProperty @objQueryResults, @command, @ColumnName OUT

    IF @hr=0

    SELECT @strErrorMessage='Assegnazione column heading '+

    + LTRIM(STR(@currentColumn))

    + ' dalla query',

    @objErrorObject=@objExcel,

    @command='Cells('+LTRIM(STR(@currentRow)) +', '

    + LTRIM(STR(@CurrentColumn))+').value'

    IF @hr=0

    EXEC @hr=sp_OASetProperty @objExcel, @command, @ColumnName

    SELECT @currentColumn = @currentColumn + 1 END

    -- Modifica del formato per la prima riga (headings)

    IF @hr=0

    SELECT @strErrorMessage='Formattazione colonne con Bold ',

    @objErrorObject=@objWorkSheet,

    @command='Range("A1:'

    +SUBSTRING(@alphabet,@currentColumn/26,1)

    +SUBSTRING(@alphabet,@currentColumn % 26,1)

    +'1'+'").font.bold'

    IF @hr=0

    EXEC @hr=sp_OASetProperty @objWorkSheet, @command, 1

    -- Scrittura dei dati

    SELECT @currentRow = 2

    WHILE (@currentRow <= @Rows+1) AND

    (@hr=0)

    BEGIN

    SELECT @currentColumn = 1

    WHILE (@currentColumn <= @Columns) AND

    (@hr=0)

    BEGIN

    IF @hr=0

    SELECT @strErrorMessage=

    'Restituzione dei valori dalla query'

    + LTRIM(STR(@currentRow)) +','

    + LTRIM(STR(@currentRow))+')',

    @objErrorObject=@objQueryResults,

    @ResultSetRow=@CurrentRow-1

    IF @hr=0

    EXEC @hr=sp_OAMethod @objQueryResults, 'GetColumnString',

    @value OUT, @ResultSetRow, @currentColumn

    IF @hr=0

    SELECT @strErrorMessage=

    'Assegnazione dei valori restituiti dalla query'

    + LTRIM(STR(@CurrentRow-1)) +', '

    + LTRIM(STR(@currentcolumn))+')' ,

    @objErrorObject=@objExcel,

    @command='Cells('+STR(@currentRow) +', '

    +STR(@CurrentColumn)+').value'

    IF @hr=0

    EXEC @hr=sp_OASetProperty @objExcel, @command, @value

    SELECT @currentColumn = @currentColumn + 1

    END

    SELECT @currentRow = @currentRow + 1 END

    -- Definizione nome range

    --Cells(1, 1).Resize(10, 5).Name = "TheData"

    IF @hr=0

    SELECT @strErrorMessage='Assegnazione del nome al range '

    + LTRIM(STR(@CurrentRow-1)) +', '

    + LTRIM(STR(@currentcolumn-1))+')' ,

    @objErrorObject=@objExcel,

    @command='Cells(1, 1).Resize('+STR(@currentRow-1) +', '

    +STR(@CurrentColumn-1)+').Name'

    IF @hr=0

    EXEC @hr=sp_OASetProperty @objExcel, @command, @RangeName

    -- Auto-fit delle colonne scritte

    IF @hr=0

    SELECT @strErrorMessage='Auto-fit delle colonne ',

    @objErrorObject=@objWorkSheet,

    @command='Columns("A:'

    +SUBSTRING(@alphabet,(@Columns / 26),1)

    +SUBSTRING(@alphabet,(@Columns % 26),1)+

    '").autofit'

    IF @hr=0 --insert into @bucket(bucket)

    EXEC @hr=sp_OAMethod @objWorkSheet, @command, @output out

    IF @hr=0

    SELECT @command ='del "' + @filename + '"'

    IF @hr=0

    EXECUTE master..xp_cmdshell @Command, no_output

    IF @hr=0

    SELECT @strErrorMessage='Salvataggio del workbook come "'+@filename+'"',

    @objErrorObject=@objRange,

    @command = 'SaveAs("' + @filename + '")'

    IF @hr=0

    EXEC @hr=sp_OAMethod @objWorkBook, @command

    IF @hr=0

    SELECT @strErrorMessage='Chiusura Excel ',

    @objErrorObject=@objExcel

    EXEC @hr=sp_OAMethod @objWorkBook, 'Close'

    EXEC sp_OAMethod @objExcel, '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 @hr, @source, @Description,@Helpfile,@HelpID output

     

    SELECT @strErrorMessage='Error whilst '

    +COALESCE(@strErrorMessage,'doing something')

    +', '+COALESCE(@Description,'')

    RAISERROR (@strErrorMessage,16,1)

    END

    -- Libero la memoria allocata

    EXEC sp_OADestroy @objServer

    EXEC sp_OADestroy @objQueryResults

    EXEC sp_OADestroy @objCurrentResultSet

    EXEC sp_OADestroy @objExcel

    EXEC sp_OADestroy @objWorkBooks

    EXEC sp_OADestroy @objWorkBook

    EXEC sp_OADestroy @objRange

    RETURN @hr

    END

    -- Utilizzo con autenticazione SQL Server

    CS_SP_DMOExportToExcel @SourceServer='MyServer',

    @SourceUID= 'UserID',

    @SourcePWD = 'Password',

    @QueryText = 'use MyDataBase Select Codice, Descr from Test',

    @filename = 'C:\Scambio\Test.xls',

    @WorksheetName='MyTest',

    @RangeName ='MyRangeTest'

     

    -- Utilizzo con integrated security

    CS_SP_DMOExportToExcel @SourceServer='MyServer',

    @QueryText = 'use MyDataBase select Codice, Descr from Test',

    @filename = 'C:\Scambio\Test.xls', @WorksheetName='MyTest',

    @RangeName ='MyRangeTest'

     

    Ciao!

    Sergio

     

    • Post Points: 20
  • 02-08-2008 18.57 In reply to

    Re: Esportazione dati su foglio XLS utilizzando xp_cmdshell

    Urca, non e' una "passeggiata" Smile  Pero' e' piuttosto utile.Grazie dell'Info.

        Franco

    Franco Pigoli
    Consulente IT ( .Net, SAS, SqlServer) & Analisi dati
    MCTS Sql2005
    • Post Points: 20
  • 02-08-2008 19.12 In reply to

    • sgovoni
    • Top 10 Contributor
      Male
    • Joined on 10-18-2007
    • Posts 171
    • Points 2.625

    Re: Esportazione dati su foglio XLS utilizzando xp_cmdshell

    Sì effettivamente non è una "passeggiata"... mi serviva a tutti i costi per chiudere un problema su un cliente... sai quelle cose che vengono promesse perchè sembrano facili e poi...

    Diciamo che è un esempio di utilizzo dei metodi di un OLE object (tipo sp_OAMethod).

    Ciao!

    Sergio

    • Post Points: 5
  • 02-12-2008 9.27 In reply to

    • sgovoni
    • Top 10 Contributor
      Male
    • Joined on 10-18-2007
    • Posts 171
    • Points 2.625

    Re: Esportazione dati su foglio XLS utilizzando xp_cmdshell

    Ciao,

    vi ricordate l'esportazione del dataset di una query su foglio Excel realizzato con la stored procedure CS_SP_DMOExportToExcel ? Ieri mi hanno chiesto la possibilità di non sovrascrivere il file XLS esistente ma solo il foglio @WorksheetName passato come parametro.

    Per chi è interessato, posto di seguito un aggiornamento della stored procedure CS_SP_DMOExportToExcel, questa versione permette di realizzare e mantenere un file Excel con più fogli (worksheet): uno o più fogli "dati" ed uno o più fogli di analisi con formule basate sui fogli "dati".

    /* Stored Procedure CS_SP_DMOExportToExcel per esportazione dati su Excel */
    IF (OBJECT_ID('CS_SP_DMOExportToExcel', 'P') IS NOT NULL)
      DROP PROCEDURE DBO.[CS_SP_DMOExportToExcel]
    GO
    /* Creazione stored procedure */
    CREATE PROCEDURE [dbo].[CS_SP_DMOExportToExcel]
      (@SourceServer VARCHAR(30),
       @SourceUID VARCHAR(30)=NULL,
       @SourcePWD VARCHAR(30)=NULL,
       @QueryText VARCHAR(8000),
       @filename VARCHAR(256),
       @WorksheetName VARCHAR(100)='Worksheet',
       @WorksheetIndex INT,
       @RangeName VARCHAR(80)='MyRangeName')
    AS BEGIN  /*
         Descrizione   : Stored procedure per esportazione dati da query T-SQL
                               a file Excel. Se il file Excel specificato non esiste
                               viene creato
              Parametri: @SourceServer   = Nome server
                         @SourceUID      = Nome utente
                         @SourcePWD      = Password
                         @QueryText      = Query T-SQL di estrazione dei dati da esportare
                         @filename       = Path e nome del file XLS
                         @WorksheetName  = Nome del foglio in cui esportare i dati
                         @WorksheetIndex = Posizione del foglio (attenzione, il foglio corrispondente alla posizione specificata verrà sovrascritto)
                         @RangeName      = Nome range
              Sviluppata il : 12 Feb 2008  */  DECLARE @objServer INT,
              @objQueryResults INT,
              @objCurrentResultSet INT,
              @objExcel INT,
              @objWorkBooks INT,
              @objWorkBook INT,
              @objWorkSheet INT,
              @objRange INT,
              @hr INT,
              @Columns INT,
              @Rows INT,
              @Output INT,
              @currentColumn INT,
              @currentRow INT,
              @ResultSetRow INT,
              @off_Column INT,
              @off_Row INT,
              @command VARCHAR(255),
              @ColumnName VARCHAR(255),
              @value VARCHAR(255),
              @strErrorMessage VARCHAR(255),
              @objErrorObject INT,
              @Alphabet VARCHAR(27),
              @T INT,
              @FindFile INT /* 0=False, -1=True */
      SELECT @Alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'   IF (@QueryText IS NULL)
      BEGIN
        RAISERROR ('Errore: Non è stata specificata la query per la stored procedure CS_SP_DMOExportToExcel', 16, 1)
        RETURN 1
      END
      -- Impostazione del server a local server
      IF (@SourceServer IS NULL)
        SELECT @SourceServer = @@servername 
        -- Disabilitazione messaggi
      SET NOCOUNT ON
      SELECT @strErrorMessage = 'Istanza di DMO',
             @objErrorObject = @objServer
     
      EXEC @hr = sp_OACreate 'SQLDMO.SQLServer', @objServer OUT 
        IF (@SourcePWD IS NULL) OR
         (@SourceUID IS NULL)
      BEGIN
        -- Trusted connection
        IF (@hr = 0)
          SELECT @strErrorMessage = 'Impostazione login con windows authentication su '
                                    +@SourceServer,
                                    @objErrorObject = @objServer
        IF (@hr = 0)
          EXEC @hr = sp_OASetProperty @objServer, 'LoginSecure', 1
       
        IF (@hr = 0)
          SELECT @strErrorMessage = 'Login in corso al server richiesto, utilizzando windows authentication su '
                                    +@SourceServer
        IF (@SourceUID IS NULL) AND
           (@hr = 0)
          EXEC @hr = sp_OAMethod @objServer,
                                 'Connect',
                                 NULL,
                                 @SourceServer
       
        IF (@SourceUID IS NOT NULL) AND
           (@hr = 0)
          EXEC @hr = sp_OAMethod @objServer,
                                 'Connect',
                                 NULL,
                                 @SourceServer,
                                 @SourceUID
      END
      ELSE BEGIN
        IF (@hr = 0)
          SELECT @strErrorMessage = 'Connessione a '''+@SourceServer+
                                    ''' con user ID '''+@SourceUID+'''',
                 @objErrorObject = @objServer
        IF (@hr = 0)
          EXEC @hr = sp_OAMethod @objServer,
                                 'Connect',
                                 NULL,
                                 @SourceServer,
                                 @SourceUID,
                                 @SourcePWD
      END
      -- Esecuzione della query
      IF (@hr = 0)
        SELECT @strErrorMessage = 'Esecuzione query "'
                                  +@querytext+'", su '+@SourceServer,
               @objErrorObject = @objServer,
               @command = 'ExecuteWithResults("' + @QueryText + '")'
      IF (@hr = 0)
        EXEC @hr = sp_OAMethod @objServer, @command, @objQueryResults OUT 
        IF (@hr = 0)
        SELECT @strErrorMessage = 'Restituzione del primo result set per "'
                                  +@querytext+'", su '+@SourceServer,
               @objErrorObject = @objQueryResults
     
      IF (@hr = 0)
        EXEC @hr = sp_OAMethod @objQueryResults, 'CurrentResultSet', @objCurrentResultSet OUT
      IF (@hr = 0)
        SELECT @strErrorMessage = 'Restituzione di righe e colonne "'
                                  +@querytext+'", su '+@SourceServer
      IF (@hr = 0)
        EXEC @hr = sp_OAMethod @objQueryResults, 'Columns', @Columns OUT
     
      IF (@hr = 0)
        EXEC @hr = sp_OAMethod @objQueryResults, 'Rows', @Rows OUT 
      -- Il risultato della query è disponibile. Start up della connessione a Excel
      IF (@hr = 0)
        SELECT @strErrorMessage = 'Creazione dell''applicazione Excel su '
                                  +@SourceServer,
               @objErrorObject = @objExcel
      IF (@hr = 0)
        EXEC @hr = sp_OACreate 'Excel.Application', @objExcel OUT
      IF (@hr = 0)
        SELECT @strErrorMessage = 'Restituzione dell''oggetto WorkBooks '
     
      -- Apertura oggetto WorkBooks foglio Excel per sovrascrivere solo il
      -- WorkSheet
      IF (@hr = 0)
        EXEC @hr = sp_OAMethod @objExcel,
                               'WorkBooks.Open',
                               @objWorkBooks OUT,
                               @filename
     
      IF (@hr = 0)
      BEGIN
        -- Apertura WorkBooks Excel avvenuta correttamente
        Set @FindFile = -1
       
        -- Selezione WorkSheet passato come parametro
        IF (@objWorkSheet <> 0)
          EXEC @hr = sp_OADestroy @objWorkSheet
            EXEC @hr = sp_OAMethod @objWorkBooks,
                               'Worksheets.Item',
                               @objWorkSheet OUT,
                               @WorksheetIndex
        IF (@hr = 0)
          PRINT ('Selezione WorkSheet avvenuta correttamente')
        ELSE                                  
          PRINT ('Selezione WorkSheet terminata con errori')
            -- Attivazione WorkS