Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Excel de 32 bits e SQL Server de 64 bits


O que poderia ser mais simples do que obter dados de uma tabela do Excel no SQL Server?

Há muitas maneiras de realizar essa tarefa. Você pode utilizar os Serviços de Integração (antigo DTS) ou importação e exportação assistente, que é o mesmo sob o capô. Outra maneira é criar um aplicativo ADO.NET simples . Você pode usar o Servidor Vinculado mecanismo, que permite ver qualquer objeto acessível ODBC / OLE DB na forma de uma tabela (uma coleção de tabelas) ou o resultado de uma consulta ad hoc.



Foi até que a arquitetura de 64 bits deixou de ser algo da classe hi-end e chegou aos laptops de desenvolvedores e usuários. É improvável que um usuário típico instale um servidor de banco de dados, enquanto é normal que um desenvolvedor tenha um SQL Server de 64 bits em uma máquina de 64 bits com MS Office de 32 bits. No entanto, nesse caso, usar o Excel ou o Access com servidores vinculados ao SQL Server pode ser um desafio porque os drivers são de 32 bits. Não há provedores disponíveis para o MS Office, embora eu tenha um instalado no meu PC.



Assim, uma tentativa de usar Excel ou Access com servidores vinculados ao SQL Server, conforme descrito na documentação, causará o seguinte erro:

Msg 7302, Nível 16, Estado 1, Linha 1

Não é possível criar uma instância do provedor OLE DB «Microsoft.ACE.OLEDB.12.0» para servidor vinculado…

Então o que fazer?

Instale o provedor de 64 bits, que está disponível para download em Microsoft Access Database Engine 2010 Redistributable. Recebemos o seguinte erro durante o processo de instalação:



Se o Office de 32 bits não estivesse instalado no computador, você não receberia esse aviso.

Devo escolher entre a versão de 64 bits ou 32 bits do MS Office e a versão de 64 bits ou 32 bits do SQL Server? Desinstalar uma versão e instalar outra não é uma solução flexível. Além disso, nem sempre é possível. Vamos dar uma olhada na pergunta que uma pessoa levantou no MSDN:

O banco de dados MS Access é um ambiente de produção no site do cliente e não é uma opção para mim desinstalá-lo e instalar uma versão de 64 bits. Também não é uma opção desinstalar o SQL Server de 64 bits existente e instalar a versão de 32 bits, é claro. Uma instalação adicional de um SQL Server 32 bits, apenas disponibilizando o link para o MS Access seria a única opção então. Acho isso horrível.

Eu não entendo essa parte.

Como não há Jet de 64 bits, você precisa baixar e instalar a versão de 64 bits do «Microsoft Access Database Engine 2010 Redistributable». Obrigado pela sua resposta, mas quando instalo o AccessDatabaseEngine_X64.exe recebo o seguinte erro (imagem 1) Consulte este artigo da base de conhecimento: support.microsoft.com/kb/2269468 O artigo no link em sua última mensagem diz para desinstalar todos os produtos do Office 32 bits. Isso não faz sentido para mim, porque o objetivo é conectar-se ao banco de dados MS Access de 32 bits… Você precisa instalar a versão de 64 bits do "Microsoft ACE OLEDB Provider" para se conectar a um arquivo do Access (32 bits ou 64 bits) do SQL Server. Mas tentei instalar o driver 64 bits, mas está dando erro de instalação… O artigo anterior da base de conhecimento explica a causa e fornece a solução, você pode consultá-lo. Você está me guiando em círculos.

Bem, o problema é fazer com que a versão de 64 bits do Microsoft ACE OLEDB Provider funcione com o Office de 32 bits. Por que não é possível fazer isso diretamente é uma grande questão. Há muitas informações sobre este tema:

O fato de que eles não podem nos obriga a compilar duas versões diferentes de nosso aplicativo; um especificamente para a plataforma x86 e outro para a plataforma x64. Em seguida, temos que determinar de alguma forma qual versão do driver ACE está instalada para sabermos qual versão (32 ou 64 bits) do nosso aplicativo instalar. A vida seria muito mais simples se pudéssemos compilar nosso aplicativo para o AnyCPU padrão e, em seguida, os provedores de dados de 32 e 64 bits pudessem ser instalados… Por que o ACE de 32 e 64 bits não pode coexistir? É baseado no fato de que a Microsoft não oferece suporte à instalação lado a lado do Microsoft Office 2010 de 32 e 64 bits ou seus componentes dependentes… Desculpe, mas essa não é uma resposta muito útil para a pergunta. P:Por que as versões de 32 e 64 bits do Microsoft Access Database Engine 2010 Redistributable (AccessDatabaseEngine.exe e AccessDatabaseEngine_X64.exe) não podem ser instaladas na mesma máquina? R:A Microsoft não oferece suporte à instalação lado a lado do Microsoft Office 2010 de 32 e 64 bits. Isso não responde, é apenas repetir a pergunta em outras palavras. P:Por que não posso fazer isso? R:Porque não apoiamos. P:Por que você não pode apoiá-lo? R:Porque não oferecemos suporte.

Como solução, usei AccessDatabaseEngine_X64.exe com a chave /passive que permite que a versão de 64 bits do provedor coexista com a versão de 32 bits do Office. Deve-se notar que a Microsoft não oferece suporte a esse método oficialmente. Além disso, há avisos sobre possíveis problemas com a compatibilidade.

Quando instalei o driver AccessDatabaseEngine_x64.exe … O MS Office Pro Plus inicia um processo de configuração do MS que pode levar até um minuto ou dois antes que um documento ou programa do Office seja aberto . Se o Office 2010 de 32 bits estiver instalado e se o Ace de 64 bits estiver instalado com /passive , então **sempre** que você executa o Access 2010, você obtém uma rotina de instalação automática que redefine para os drivers de 32 bits para escritório .

No meu caso (Office 2013 Pro Plus, SQL Server 2012 Developer Ed., Windows 8.1), não houve problemas visíveis (bater na madeira). Ainda assim, gostaria de acrescentar que está como está e sem quaisquer responsabilidades.

Baixe AccessDatabaseEngine_x64.exe, crie o Ponto de Restauração do Sistema (parece ser criado automaticamente ao atualizar os componentes do Office) e execute a partir da linha de comando. Aqui estão as chaves possíveis:





Ao contrário da figura 2, a instalação é executada



Em seguida, clique em Atualizar no menu de atalho Provedores:



Eu criei um arquivo xslx simples muito rapidamente:



No SQL Server, crie um servidor vinculado neste Excel:
se existir (selecione 1 de sys.servers onde nome ='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=Sim'

Script 1

Leitura:
selecione * de openquery (XlsLnkSrv, 'Selecione * de [Sheet1$]')

Script 2

É bem sucedido? Não!

Msg 7399, Level 16, State 1, Line 1
O provedor OLE DB «Microsoft.ACE.OLEDB.12.0» para o servidor vinculado «XlsLnkSrv» relatou um erro. O provedor não forneceu nenhuma informação sobre o erro.
Msg 7303, Level 16, State 1, Line 1
Não é possível inicializar o objeto de fonte de dados do provedor OLE DB «Microsoft.ACE.OLEDB.12.0» para servidor vinculado «XlsLnkSrv».

Mesmo assim faz sucesso!



Da mesma maneira,
selecione * de openrowset('Microsoft.ACE.OLEDB.12.0', 'Excel 12.0;Database=C:\Temp\Sample.xlsx;HDR=Yes', 'Selecione * de [Sheet1$]') 
Inicialmente, precisamos fazer o seguinte:
exec sp_configure 'mostrar opções avançadas', 1;reconfigure;exec sp_configure 'Consultas distribuídas ad hoc', 1;reconfigure

Script 3

Concluindo, gostaria de observar que o provedor de 64 bits substituiu o de 32 bits. Se criarmos uma conexão para Sample.xslsx no fluxo de dados do pacote DTS, obteremos uma falha de inicialização do provedor OLE DB do Microsoft Office 12.0 Access Database Engine, que é logicamente correto, pois devenv.exe é de 32 bits, enquanto o provedor é de 64 bits. Para restaurar o comportamento, é necessário restaurar o provedor do Office de 32 bits (aqui). No entanto, neste caso, não podemos usar o servidor vinculado. Para fazer o servidor vinculado funcionar, vá para o início do artigo.