Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Excel a 32 bit e SQL Server a 64 bit

Cosa potrebbe essere più semplice che ottenere dati da una tabella Excel in SQL Server?

Ci sono molti modi per portare a termine questo compito. Puoi utilizzare Servizi di integrazione (ex DTS) o importa ed esporta mago, che è lo stesso sotto il cofano. Un altro modo è creare una semplice app ADO.NET . Puoi utilizzare il server collegato meccanismo, che consente di visualizzare qualsiasi oggetto raggiungibile ODBC/OLE DB sotto forma di tabella (una raccolta di tabelle) o il risultato di una query ad hoc.

C'era stato fino a quando l'architettura a 64 bit non aveva smesso di essere qualcosa della classe hi-end e è arrivata ai laptop degli sviluppatori e degli utenti. È improbabile che un utente tipico installi un server di database, mentre è normale che uno sviluppatore disponga di un server SQL a 64 bit su una macchina a 64 bit con MS Office a 32 bit. Tuttavia, in questo caso, l'utilizzo di Excel o Access con server collegati a SQL Server può essere una sfida perché i driver sono a 32 bit. Non ci sono provider disponibili per MS Office, anche se ne ho uno installato sul mio PC.

Pertanto, un tentativo di utilizzare Excel o Access con server collegati a SQL Server, come descritto nella documentazione, causerà il seguente errore:

Msg 7302, Livello 16, Stato 1, Linea 1

Impossibile creare un'istanza del provider OLE DB «Microsoft.ACE.OLEDB.12.0» per il server collegato...

Allora, cosa fare?

Installare il provider a 64 bit, disponibile per il download in Motore di database di Microsoft Access 2010 Redistributable. Otteniamo il seguente errore durante il processo di installazione:

Se Office a 32 bit non fosse installato sul computer, non riceverai questo avviso.

Devo scegliere tra la versione a 64 o 32 bit di MS Office e la versione a 64 o 32 bit di SQL Server? La disinstallazione di una versione e l'installazione di un'altra non sono una soluzione flessibile. Inoltre, non è sempre possibile. Diamo un'occhiata alla domanda che una persona ha sollevato su MSDN:

Il database di MS Access è un ambiente di produzione presso il sito del cliente e non è un'opzione per me disinstallarlo e installare una versione a 64 bit. Inoltre, non è un'opzione per disinstallare l'esistente SQL Server a 64 bit e installare la versione a 32 bit, ovviamente. Un'installazione aggiuntiva di SQL Server a 32 bit, fornendo solo il collegamento a MS Access, sarebbe l'unica opzione. Lo trovo abbastanza orribile.

Non capisco questa parte.

Dato che non esiste un Jet a 64 bit, è necessario scaricare e installare la versione a 64 bit di «Microsoft Access Database Engine 2010 Redistributable». Grazie per la risposta, ma quando installo AccessDatabaseEngine_X64.exe ottengo il seguente errore (immagine 1) Si prega di fare riferimento a questo articolo della Knowledge Base: support.microsoft.com/kb/2269468 L'articolo nel collegamento nell'ultimo messaggio indica di disinstallare tutti i prodotti Office 32 bit. Questo non ha senso per me, perché l'obiettivo è connettersi al database MS Access a 32 bit... È necessario installare la versione a 64 bit di "Microsoft ACE OLEDB Provider" per connettersi a un file di Access (32 bit o 64 bit) da SQL Server. Ma ho provato a installare il driver a 64 bit, ma mi dà un errore di installazione... Il precedente articolo della Knowledge Base spiega la causa e fornisce la soluzione, a cui puoi fare riferimento. Mi stai guidando in tondo.

Bene, il problema è far funzionare la versione a 64 bit di Microsoft ACE OLEDB Provider con Office a 32 bit. Perché non è possibile farlo direttamente è una grande domanda. Ci sono molte informazioni su questo argomento:

Il fatto che non possano obbligarci a compilare due diverse versioni della nostra applicazione; uno specifico per la piattaforma x86 e uno per la piattaforma x64. Quindi dobbiamo in qualche modo determinare quale versione del driver ACE è installata in modo da sapere quale versione (32 o 64 bit) della nostra applicazione installare. La vita sarebbe molto più semplice se potessimo semplicemente compilare la nostra app per la AnyCPU predefinita e quindi poter installare sia 32 che 64 fornitori di dati... Perché 32 e 64 bit ACE non possono coesistere? Si basa sul fatto che Microsoft non supporta l'installazione affiancata di Microsoft Office 2010 a 32 e 64 bit o dei componenti dipendenti... Mi dispiace, ma non è una risposta molto utile alla domanda. D:Perché le versioni a 32 e 64 bit di Microsoft Access Database Engine 2010 Redistributable (AccessDatabaseEngine.exe e AccessDatabaseEngine_X64.exe) non possono essere installate entrambe sullo stesso computer? R:Microsoft non supporta l'installazione affiancata di Microsoft Office 2010 a 32 e 64 bit. Non si tratta di rispondere, si tratta semplicemente di ripetere la domanda in altre parole. D:Perché non posso farlo? A:Perché non lo supportiamo. D:Perché non puoi supportarlo? A:Perché non lo supportiamo.

Come soluzione alternativa, ho utilizzato AccessDatabaseEngine_X64.exe con la chiave /passive che consente la coesistenza della versione a 64 bit del provider con la versione di Office a 32 bit. Va notato che Microsoft non supporta ufficialmente questo metodo. Inoltre, sono presenti avvisi relativi a possibili problemi con la compatibilità.

Quando ho installato il driver AccessDatabaseEngine_x64.exe ... MS Office Pro Plus avvia un processo di configurazione MS che può richiedere fino a un minuto o due prima dell'apertura di un documento o di un programma di Office . Se è installato Office 2010 a 32 bit e se è installato ace a 64 bit con /passive , **ogni** volta che esegui Access 2010, ottieni una routine di installazione automatica che ripristina i driver a 32 bit per l'ufficio .

Nel mio caso (Office 2013 Pro Plus, SQL Server 2012 Developer Ed., Windows 8.1), non si sono verificati problemi visibili (tocco sul legno). Tuttavia, vorrei aggiungere che è così com'è e senza alcuna responsabilità.

Scarica AccessDatabaseEngine_x64.exe, crea il punto di ripristino del sistema (sembra essere creato automaticamente durante l'aggiornamento dei componenti di Office) ed esegui dalla riga di comando. Ecco le possibili chiavi:

A differenza dell'immagine 2, l'installazione viene eseguita

Quindi, fai clic su Aggiorna nel menu di scelta rapida Provider:

Ho creato un semplice file xslx molto rapidamente:

In SQL Server, crea un server collegato in questo Excel:

if exists (select 1 from sys.servers where name = 'XlsLnkSrv') exec sp_dropserver 
@server = 'XlsLnkSrv', @droplogins = 'droplogins'

exec sp_addlinkedserver @server = 'XlsLnkSrv', @srvproduct = 'ACE 12.0', 
@provider = 'Microsoft.ACE.OLEDB.12.0', @datasrc = 'C:\Temp\Sample.xlsx', 
@provstr = 'Excel 12.0; HDR=Yes'

Script 1

Leggi:

select * from openquery (XlsLnkSrv, 'Select * from [Sheet1$]')

Script 2

Ha successo? No!

Msg 7399, livello 16, stato 1, riga 1
Il provider OLE DB «Microsoft.ACE.OLEDB.12.0» per il server collegato «XlsLnkSrv» ha segnalato un errore. Il provider non ha fornito alcuna informazione sull'errore.
Msg 7303, livello 16, stato 1, riga 1
Impossibile inizializzare l'oggetto origine dati del provider OLE DB «Microsoft.ACE.OLEDB.12.0» per server collegato «XlsLnkSrv».

Comunque ha successo!

Allo stesso modo,

select * from openrowset('Microsoft.ACE.OLEDB.12.0',  
'Excel 12.0;Database=C:\Temp\Sample.xlsx;HDR=Yes', 'Select * from [Sheet1$]')

All'inizio, dobbiamo fare quanto segue:

exec sp_configure 'show advanced options', 1;
reconfigure;
exec sp_configure 'Ad Hoc Distributed Queries', 1;
reconfigure

Script 3

In conclusione, vorrei sottolineare che il provider a 64 bit ha sostituito quello a 32 bit. Se creiamo una connessione per Sample.xslsx nel flusso di dati del pacchetto DTS, otterremo un errore di inizializzazione di Microsoft Office 12.0 Access Database Engine OLE DB Provider, che è logicamente corretto, poiché devenv.exe è a 32 bit, mentre il provider è a 64 bit. Per ripristinare il comportamento, è necessario ripristinare il provider Office a 32 bit (qui). Tuttavia, in questo caso, non possiamo utilizzare il server collegato. Per far funzionare il server collegato, vai all'inizio dell'articolo.