none
Erro OPENROWSET com Exec RRS feed

  • Pergunta

  • Bom dia..

    Estou com um problema na instrução abaixo :


    set @string = 'SELECT CONVERT(datetime,F2,103),convert(Float,replace(F8,"," ,".")) FROM OPENROWSET (''Microsoft.Jet.OLEDB.4.0'',''Excel 8.0;Database=\\gpsmailserver\Publico\Rel_Anual\Performance@''
    +@carteira+''.xls;HDR=No;IMEX=1'',''SELECT F2,F8 FROM [Plan1$]  Order by year(F2),Month(F2)")'

    Exec @string


    Este comando é executado dentro de uma procedure que recebe como parâmetro @carteira...

    A proc é criada normalmente, porém, ao executá-la tenho o seguinte erro :

    Msg 203, Level 16, State 2, Procedure sp_ajustaCotaCarteira, Line 46
    The name 'SELECT CONVERT(datetime,F2,103),convert(Float,replace(F8,"," ,".")) FROM OPENROWSET ('Microsoft.Jet.' is not a valid identifier.

    Alguém poderia me ajudar?

    Obrigado,
    quinta-feira, 19 de fevereiro de 2009 11:14

Todas as Respostas

  • Bom Dia,

    Comece executando um PRINT ao invés do EXEC para verificarmos o que está sendo realmente montado para execução.

    [ ]s,

    Gustavo Maia Aguiar
    http://gustavomaiaaguiar.spaces.live.com/

    Calcule a rentabilidade de um investimento com SQL
    http://gustavomaiaaguiar.spaces.live.com/blog/cns!F4F5C630410B9865!362.entry
    Classifique as respostas. O seu feedback é imprescindível
    quinta-feira, 19 de fevereiro de 2009 11:29
  • Segue o comando :

    set @string = 'Declare cotaFX cursor FOR SELECT CONVERT(datetime,F2,103),convert(Float,replace(F8,'','' ,''.'')) FROM OPENROWSET(''Microsoft.Jet.OLEDB.4.0'',''Excel 8.0;Database=\\gpsmailserver\Publico\Rel_Anual\Performance@''+@carteira+''.xls;HDR=No;IMEX=1'',''SELECT F2,F8 FROM [Plan1$] where F8 is not null and f8 <> "----------" and f8<> "Ret_Total" and f8 > "0" and F8 <> F6 Order by year(F2),Month(F2)'')'

    print @string


    Assim, o print me retornou :

    Declare cotaFX cursor FOR SELECT CONVERT(datetime,F2,103),convert(Float,replace(F8,',' ,'.')) FROM O





    quinta-feira, 19 de fevereiro de 2009 11:35
  • Bom Dia Robson,

    Primeiro verifique o tamanho da variável @string. Ela deve ser suficientemente grande para armazenar todo o comando.
    Não sei se esse é o comando todo, mas se for, ele irá provocar um erro.
    Isso irá acontecer porque @carteira é uma variável e se o comando dinâmico não declará-la, não haverá como a sessão interna (a do EXEC) reconhecê-la.

    [ ]s,

    Gustavo Maia Aguiar
    http://gustavomaiaaguiar.spaces.live.com/

    Calcule a rentabilidade de um investimento com SQL
    http://gustavomaiaaguiar.spaces.live.com/blog/cns!F4F5C630410B9865!362.entry


    Classifique as respostas. O seu feedback é imprescindível
    quinta-feira, 19 de fevereiro de 2009 11:57
  • Robson,

    Quando se utiliza o comando Exec, o SQL Server cria um sessão especifica para executar as instruções contidas no Exec, como você esta trabalhando com variável e deseja que o Exec faça uso desta variável, será necessário declarar a variável dentro do Exec.

    Outra coisa, como o Gustavo já destacou verifique o tamanho da sua variável, possivelmente ela não esta conseguindo armazenar todo o comando que deverá ser executado.

    Veja este exemplo:


    1 Declare @String Varchar(1000)  
    2  
    3 set @string = 'Declare @Carteira VarChar(10)
    4                Declare cotaFX cursor FOR SELECT CONVERT(datetime,F2,103),
                   convert(Float,replace(F8,'
    ','' ,''.'')) 
                   FROM OPENROWSET('
    'Microsoft.Jet.OLEDB.4.0'',
                   '
    'Excel 8.0;Database=\\gpsmailserver\Publico\Rel_Anual\Performance@''+@carteira+''.xls;
                   HDR=
    No;IMEX=1'',''SELECT F2,F8 FROM [Plan1$] where F8 is not null and f8 <> "----------" 
                  
    and f8<> "Ret_Total" and f8 > "0" and F8 <> F6 Order by year(F2),Month(F2)'')' 
    5  
    6 print @string  
    7  

    Pedro Antonio Galvão Junior - MVP - Windows Server System - SQL Server/Coordenador de Projetos/DBA
    quinta-feira, 19 de fevereiro de 2009 12:05
  • Ok...

    Entendi

    Mas, o fato de criar uma seção separada não impede de atribuir o parâmetro da procedure?

    Como no exemplo abaixo:


          
         set @string =
                       ' Declare @Cart VarChar(20)
                        set @Cart = @carteira
                         Declare cotaFX cursor FOR SELECT CONVERT(datetime,F2,103),
                        convert(Float,replace(F8,'','' ,''.''))
                        FROM OPENROWSET(''Microsoft.Jet.OLEDB.4.0'',
                        ''Excel 8.0;Database=\\gpsmailserver\Publico\Rel_Anual\Performance@''+@Cart+''.xls;
                        HDR=No;IMEX=1'',''SELECT F2,F8 FROM [Plan1$] where F8 is not null and f8 <> "----------"
                        and f8<> "Ret_Total" and f8 > "0" and F8 <> F6 Order by year(F2),Month(F2)'') '

    Assim, gostaria de atribuir o valor de @Cart como sendo o valor recebido pela Proc..

    E realmente @carteira estava com um tamanho inferior ao comando..

    Obrigado
    quinta-feira, 19 de fevereiro de 2009 12:22
  • Olá Robson,

    Há duas possibilidades. Verifique qual delas lhe atende (tenho preferência pela primeira).

    1 declare @string varchar(1000), @carteira int 
    2 set @carteira = 1  
    3      set @string =   
    4                    ' Declare @Cart VarChar(20)
    5                     set @Cart = ' + cast(@carteira as varchar(8)) + '
    6                      Declare cotaFX cursor FOR SELECT CONVERT(datetime,F2,103),
    7                     convert(Float,replace(F8,'','' ,''.'')) 
    8                     FROM OPENROWSET(''Microsoft.Jet.OLEDB.4.0'',
    9                     ''Excel 8.0;Database=\\gpsmailserver\Publico\Rel_Anual\Performance@''+@Cart+''.xls;  
    10                     HDR=No;IMEX=1'',''SELECT F2,F8 FROM [Plan1$] where F8 is not null and f8 <> "----------"   
    11                     and f8<> "Ret_Total" and f8 > "0" and F8 <> F6 Order by year(F2),Month(F2)'') ' 
    12  
    13 declare @string varchar(1000), @carteira int 
    14 set @carteira = 1  
    15      set @string =   
    16                    ' Declare cotaFX cursor FOR SELECT CONVERT(datetime,F2,103),
    17                     convert(Float,replace(F8,'','' ,''.'')) 
    18                     FROM OPENROWSET(''Microsoft.Jet.OLEDB.4.0'',
    19                     ''Excel 8.0;Database=\\gpsmailserver\Publico\Rel_Anual\Performance@''' + cast(@carteira as varchar(8)) + '''.xls;  
    20                     HDR=No;IMEX=1'',''SELECT F2,F8 FROM [Plan1$] where F8 is not null and f8 <> "----------"   
    21                     and f8<> "Ret_Total" and f8 > "0" and F8 <> F6 Order by year(F2),Month(F2)'') ' 

    [ ]s,

    Gustavo Maia Aguiar
    http://gustavomaiaaguiar.spaces.live.com/

    Calcule a rentabilidade de um investimento com SQL
    http://gustavomaiaaguiar.spaces.live.com/blog/cns!F4F5C630410B9865!362.entry


    Classifique as respostas. O seu feedback é imprescindível
    quinta-feira, 19 de fevereiro de 2009 12:27
  • Gustavo...

    Fiz as alterações conforme abaixo :

    set @string = ' Declare @Cart nVarChar(50)
                        set @Cart =''@carteira+''
                         Declare cotaFX cursor FOR
                        SELECT CONVERT(datetime,F2,103),
                               CONVERT(Float,replace(F8,'','' ,''.''))
                        FROM OPENROWSET(''Microsoft.Jet.OLEDB.4.0'',
                        ''Excel 8.0;Database=\\gpsmailserver\Publico\Rel_Anual\Performance@''+@Cart+''.xls;
                        HDR=No;IMEX=1'',''SELECT F2,F8 FROM [Plan1$] where F8 is not null and f8 <> "----------"
                        and f8<> "Ret_Total" and f8 > "0" and F8 <> F6 Order by year(F2),Month(F2)'')
                        '

    Mas, ocorre o seguinte erro:

    Msg 203, Level 16, State 2, Procedure sp_ajustaCotaCarteira, Line 68
    The name '    Declare @Cart nVarChar(50)
                        set @Cart ='@carteira+'
                         Declare cotaFX cursor FOR
                        SELECT CONVERT(datetime,F2,103),
                               CONVERT(Float,replace(F8,',' ,'.'))
                        FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0',
                        'Excel 8.0;Database=\\gpsmailserver\Publico\Rel_Anual\Performance@'+@Cart+'.xls;
                        HDR=No;IMEX=1','SELECT F2,F8 FROM [Plan1$] where F8 is not null and f8 <> "----------"
                        and f8<> "Ret_Total" and f8 > "0" and F8 <> F6 Order by year(F2),Month(F2)')
                        ' is not a valid identifier.


    Você pode me auxiliar novamente, creio que a instrução esta com algum erro e não consegui localizá-lo

    quinta-feira, 19 de fevereiro de 2009 12:44