none
Importando planilha XLS RRS feed

  • Pergunta

  •  

    Boa tarde Pessoal,

     

    Para importar os dados de uma planilha Excel eu utilizo o seguinte comando

     

    Code Snippet

    insert 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 Snippet

    CREATE 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

    segunda-feira, 17 de março de 2008 20:06

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 Snippet

    DECLARE @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

    segunda-feira, 17 de março de 2008 20:33

Todas as Respostas

  • Bruno,

     

    O SQL Server não aceita a utilização de variáveis dentro da função OpenRowset.

     

    Mas qual a necessidade em utilizar uma variável?

    segunda-feira, 17 de março de 2008 20:13
  • 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 Snippet

    DECLARE @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

    segunda-feira, 17 de março de 2008 20:33
  • 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

    segunda-feira, 17 de março de 2008 20:56
  • cara o que eu tenho feito quando recebo varias planilhas com nomes diferentes, e renomear via cmdhsell para um nome padrao, assim a proc sempre pega o mesmo nome, eu acho mais simples.

     

    Abs;

     

    terça-feira, 18 de março de 2008 10:57
  •  

    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 Snippet

    DECLARE @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)

     

     

     

    Abraços e vlw mais uma vez ai pessoal!!!!
    terça-feira, 18 de março de 2008 13:33
  • Boa. valeu o retorno, qq coisa manda ai .....

     

     

     

    terça-feira, 18 de março de 2008 14:09
  • 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

    terça-feira, 12 de abril de 2011 15:05