Principale utente con più risposte
Importazione in tabella sql 2005 di file excel generato da strumento di misura

Domanda
-
Ciao,
uno strumento di misura esporta, diciamo 1 volta al giorno un file excell, contenente alcuni dati. Io dovrei importarli in una tabella per poi elaborarli.
Ho letto che si può fare un linked server oppure Openrowset, non riesco a capire, quando usare una o l'altra?
Grazie
Marco
Risposte
-
Ciao Marco,
i due metodi sono equivalenti dal punto di vista funzionale: consentono cioè di eseguire query su un server remoto.
Sono diverse nella modalità d'uso: mentre la OPENROWSET consente di effettuare una query remota "al volo", specificando i parametri di connessione e la query da eseguire, i linked servers memorizzano all'interno delle tabelle di sistema di SQL Server le caratteristiche del server remoto e le credenziali di accesso, consentendo l'esecuzione di query remote senza limiti di tempo.
Nel tuo caso quale utilizzare può dipendere da diversi fattori, ad esempio se il nome del file è lo stesso o cambia di giorno in giorno, se hai necessità di leggere i dati in tempo reale, etc.
Mi spiego meglio: se il nome del file cambia continuamente, potresti utilizzare la OPENROWSET modificando il data source in base al nome del file. Nel caso in cui il nome del file sia fisso (e leggibile, visto che potrebbe essere bloccato dal processo che lo alimenta leggendo i dati dallo strumento di misura) puoi definire un linked server e quindi farci sopra le query che ti servono.
Nel BOL trovi le informazioni necessarie per:
- creare un linked server (http://msdn.microsoft.com/en-us/library/ms190479.aspx , esempio E)
- creare la login da utilizzare per accedervi (http://msdn.microsoft.com/en-us/library/ms189811.aspx )
- utilizzare la OPENROWSET (http://msdn.microsoft.com/en-us/library/ms190312.aspx )
Danilo Dominici MCP MCDBA MCITP MCSE MCAD- Proposto come risposta Diego Castelli martedì 14 dicembre 2010 08:44
- Contrassegnato come risposta Lorenzo BenagliaModerator mercoledì 15 dicembre 2010 15:53
Tutte le risposte
-
Ciao Marco,
i due metodi sono equivalenti dal punto di vista funzionale: consentono cioè di eseguire query su un server remoto.
Sono diverse nella modalità d'uso: mentre la OPENROWSET consente di effettuare una query remota "al volo", specificando i parametri di connessione e la query da eseguire, i linked servers memorizzano all'interno delle tabelle di sistema di SQL Server le caratteristiche del server remoto e le credenziali di accesso, consentendo l'esecuzione di query remote senza limiti di tempo.
Nel tuo caso quale utilizzare può dipendere da diversi fattori, ad esempio se il nome del file è lo stesso o cambia di giorno in giorno, se hai necessità di leggere i dati in tempo reale, etc.
Mi spiego meglio: se il nome del file cambia continuamente, potresti utilizzare la OPENROWSET modificando il data source in base al nome del file. Nel caso in cui il nome del file sia fisso (e leggibile, visto che potrebbe essere bloccato dal processo che lo alimenta leggendo i dati dallo strumento di misura) puoi definire un linked server e quindi farci sopra le query che ti servono.
Nel BOL trovi le informazioni necessarie per:
- creare un linked server (http://msdn.microsoft.com/en-us/library/ms190479.aspx , esempio E)
- creare la login da utilizzare per accedervi (http://msdn.microsoft.com/en-us/library/ms189811.aspx )
- utilizzare la OPENROWSET (http://msdn.microsoft.com/en-us/library/ms190312.aspx )
Danilo Dominici MCP MCDBA MCITP MCSE MCAD- Proposto come risposta Diego Castelli martedì 14 dicembre 2010 08:44
- Contrassegnato come risposta Lorenzo BenagliaModerator mercoledì 15 dicembre 2010 15:53
-
Ciao Marco, se hai necessità di aprire un file già aperto e non locked oppure se vuoi leggere i dati in tempo reale (se il programma lo prevede), oppure ancora se vuoi riaprire lo stesso file excel ed IGNORARE le righe già lette, potresti dover usare VBScript o VBA per creare una macro/automazione per leggere il file.
Per esempio, potresti usare uno script come questo:
Set objExcel = CreateObject("Excel.Application")
objExcel.Visible = True
Set ObjCDO = CreateObject("UserAccounts.CommonDialog")
ObjCDO.Filter = "Excel 2007/2010|*.xlsx|Excel vecchi|*.xls|Tutti i files|*.*"
ObjCDO.FilterIndex = 1
ObjCDO.showOpen
Set objWorkbook = objExcel.Workbooks.Open(ObjCDO.FileName)
Set objWorksheet = objWorkbook.Worksheets(1)i = 3Do Until x = 1
If objWorksheet.Cells(i,1) = "" Then
Exit Do
End If
if objWorksheet.Cells(i,16).Value <> "OK" Then
<Azione per inserire le righe nel DB>
End If
i = i + 1
Loopper selezionare il file da aprire tutte le volte, oppure come questo :
Set objExcel = CreateObject("Excel.Application")
objExcel.Visible = True Set objWorkbook = objExcel.Workbooks.Open(<il percorso del file di excel da aprire>)
Set objWorksheet = objWorkbook.Worksheets(1)i = 3Do Until x = 1
If objWorksheet.Cells(i,1) = "" Then
Exit Do
End If
if objWorksheet.Cells(i,16).Value <> "OK" Then
<azioni per inserire le righe nel DB>
objWorksheet.Cells(i,16).Value = "OK"
End If
i = i + 1
Loopse vuoi aprire sempre lo stesso file, ma leggere solo le righe che alla 16esima colonna NON hanno scritto OK (e tu lo scrivi man mano che le leggi).
potresti anche fare un filtro per il background color delle celle, a questo punto.
Lo so che non è la soluzione più diretta al tuo problema... ma .... così: avevo voglia di scrivere un po' di VBSCript, stamattina. :-)
Diego Castelli - MCSA 2003, MCP ISA 2004, MCTS Forefront. ITA: Questo post è fornito "così com'è". Non conferisce garanzie o diritti di alcun tipo. Ricorda di usare la funzione "segna come risposta" per i post che ti hanno aiutato a risolvere il problema e "deseleziona come risposta" quando le risposte segnate non sono effettivamente utili. Questo è particolarmente utile per altri utenti che leggono il thread, alla ricerca di soluzioni a problemi similari. ENG: This posting is provided "AS IS" with no warranties, and confers no rights. Please remember to click "Mark as Answer" on the post that helps you, and to click "Unmark as Answer" if a marked post does not actually answer your question. This can be beneficial to other community members reading the thread. -