Inquiridor
Erro OPENROWSET com Exec

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,
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 -
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
-
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 -
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 -
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
-
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 -
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