Usuário com melhor resposta
Importando planilha XLS

Pergunta
-
Boa tarde Pessoal,
Para importar os dados de uma planilha Excel eu utilizo o seguinte comando
Code Snippetinsert into MinhaTabela select * from OpenRowset(
'Microsoft.Jet.OLEDB.4.0',
'Excel 8.0;Database=C:\teste.xls',
'select * from tabela')
Até ai tudo bem, ele importa com sucesso, porém ao tentar criar uma sp para ela, onde eu possa informar o local da tabela, vem a duvida.
Eu fiz da seguinte forma:
Code SnippetCREATE PROCEDURE importa_xls @caminho nvarchar(4000) as
declare @cmd nvarchar(4000)
SET @cmd = 'insert into MinhaTabela select * from OpenRowset (' Microsoft.Jet.OLEDB.4.0','Excel 8.0;Database='+ @caminho +' ','select * from tabela'
)'
Só que, acredito, devido as " ' " (aspas) o comando fica "louco" !!!
Quando executo ele retorna o erro:
Server: Msg 170, Level 15, State 1, Procedure importa_xls, Line 3
Line 3: Incorrect syntax near 'Microsoft'.
Server: Msg 170, Level 15, State 1, Procedure importa_xls, Line 3
Line 3: Incorrect syntax near ') '.Alguma dica? já tentei separar em varias @variaveis, mas não consegui!!
[]'s
Bruno Brito
Respostas
-
Boa Tarde,
De fato o OPENROWSET não aceita esse tipo de parametrização. No entanto, você pode executar uma SQL dinâmica. Ex:
Code SnippetDECLARE
@cmdSQL VARCHAR(1000)DECLARE
@cmdPath VARCHAR(100)SET
@cmdPath = 'C:\teste.xls'SET
@cmdSQL = 'insert into MinhaTabela select * from OpenRowset('SET
@cmdSQL = @cmdSQL + '''' + 'Microsoft.Jet.OLEDB.4.0' + '''' + ','SET
@cmdSQL = @cmdSQL + '''' + 'Excel 8.0;Database=' + @cmdPath + '''' + ','SET
@cmdSQL = @cmdSQL + '''' + 'select * from tabela' + '''' + ')'EXEC
(@cmdSQL)Embora funcione, sinceramente eu desaconselho esse tipo de construção. Primeiro que essa stored procedure para funcionar pode requer permissões mais elevadas do que o necessário além da configuração de proxies (no caso do SQL Server 2005).
Se essa SP for usada para fins administrativos (ou até jobs) você pode utilizá-la. Se você for trabalhar com ela em um nível ADHOC, ou seja, os usuários a chamam como bem quiser, considere embutir isso na aplicação. Não é interessante colocar isso no banco de dados.
[ ]s,
Gustavo
Todas as Respostas
-
-
Boa Tarde,
De fato o OPENROWSET não aceita esse tipo de parametrização. No entanto, você pode executar uma SQL dinâmica. Ex:
Code SnippetDECLARE
@cmdSQL VARCHAR(1000)DECLARE
@cmdPath VARCHAR(100)SET
@cmdPath = 'C:\teste.xls'SET
@cmdSQL = 'insert into MinhaTabela select * from OpenRowset('SET
@cmdSQL = @cmdSQL + '''' + 'Microsoft.Jet.OLEDB.4.0' + '''' + ','SET
@cmdSQL = @cmdSQL + '''' + 'Excel 8.0;Database=' + @cmdPath + '''' + ','SET
@cmdSQL = @cmdSQL + '''' + 'select * from tabela' + '''' + ')'EXEC
(@cmdSQL)Embora funcione, sinceramente eu desaconselho esse tipo de construção. Primeiro que essa stored procedure para funcionar pode requer permissões mais elevadas do que o necessário além da configuração de proxies (no caso do SQL Server 2005).
Se essa SP for usada para fins administrativos (ou até jobs) você pode utilizá-la. Se você for trabalhar com ela em um nível ADHOC, ou seja, os usuários a chamam como bem quiser, considere embutir isso na aplicação. Não é interessante colocar isso no banco de dados.
[ ]s,
Gustavo
-
Junior,
Eu tenho algumas planilhas que recebo, e em geral chegam em pastas diferentes.
O que desejo fazer é:
Informar o Caminho e informar o nome da Folha (Sheet) do Excel para que ele possa importar.
Eu utilizava o DTS, até que as planilhas começaram a vim com nomes diferente e também o nome da Folha(Sheet) diferente. E a cada 2 dias eu era obrigado a abrir o DTS e mudar o nome de varias planilhas. Então para evitar todo o trabalho constantemente, pensei em criar uma SP, onde era só dizer o caminho e o nome da folha que está dentro.
Para se ter uma melhor idéia.
Hoje eu recebo as planilhas: 1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 - 10, quando abro elas, tem o nome da folha todas iguais, por exemplo "Dia14032008"
Amanhã o nome da planilha pode mudar: Dia15032008-01.xls , Dia15032008-02 ... E todas com o nome da folha "2008"
Então eu conseguindo indicar o caminho e o nome da folha, irei poupar pelo menos 30 minutos chatos de ficar renomeando ou alterando planilha por planilha.
Espero que tenham entendido! rs...
[]'s
Bruno Brito
-
-
Primeiramente, Gustavo, um beijo...rs, obrigado, deu certinho!!!
Marcelo,
O meu problema, não é somente em relação ao nome do caminho do arquivo, mas sim o nome da planilha ao abrir o Excel.
É aquela "abinha" que fica lá em baixo escrito o nome da tabela ao abrir o Excel, sei que em inglês chama-se Sheet. Ao fazer um DTS eu especifico o nome dela, mas como tanto o nome da planilha como o nome da Sheet estavam vindo diferentes, acabou me prejudicando em muito tempo.
Agora fazendo dessa forma, o que eu fazia em 30 minutos, importando planilha por planilha, hoje já me tomou apenas 5 minutos.
Ao final ficou assim o comando inteiro:
Code SnippetDECLARE @cmdSQL VARCHAR(1000)
declare @tabela varchar(50)
DECLARE @cmdPath VARCHAR(100)
SET @cmdPath = 'C:\teste.xls'
set @tabela = 'NomeDaTabela'
SET @cmdSQL = 'insert into MinhaTabela select * from OpenRowset('
SET @cmdSQL = @cmdSQL + '''' + 'Microsoft.Jet.OLEDB.4.0' + '''' + ','
SET @cmdSQL = @cmdSQL + '''' + 'Excel 8.0;Database=' + @cmdPath + '''' + ','
SET @cmdSQL = @cmdSQL + '''' + 'select * from ' + @tabela + ' ' + '''' + ')'
EXEC(@cmdSQL)
-
-
Opa Marcelo, eu tenho que fazer uma importação de uma planilha xls com 5000 dados para o SQL 2008 Server 64its, eu queria um passo a passo de como realizar este processo, pois quero deixar isso documentado além de ser "novata" neste caso. Tens como me ajudar ? Agradeço mto.
Nemora