-
sgovoni



- 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 , 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 messaggiSET 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, @valueSELECT @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 allocataEXEC 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
|
|