none
Importazione in tabella sql 2005 di file excel generato da strumento di misura RRS feed

  • 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

     

    lunedì 13 dicembre 2010 15:37

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
    lunedì 13 dicembre 2010 17:24

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
    lunedì 13 dicembre 2010 17:24
  • 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 = 3

    Do 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
    Loop

    per 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 = 3

    Do 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
    Loop

    se 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.
    martedì 14 dicembre 2010 09:00
  • Ciao Danilo,

     

    molto chiaro grazie.

    mercoledì 15 dicembre 2010 15:12