retornar dados de uma stored procedure do sql server em python

1,144 views
Skip to first unread message

Augusto Nascimento

unread,
Feb 20, 2013, 1:36:11 PM2/20/13
to python...@googlegroups.com, caique...@gmail.com
Caros

Pesquisei exaustivamente mas não encontrei nenhuma solução...

Tenho que acessar um banco em SQLServer e dentro dele executar uma procedure que me retornaria uma tabela de dados.

Estou tentando o seguinte código:

import pyodbc
cn = pyodbc.connect('DRIVER={SQL Server};SERVER=meuservidor;DATABASE=meubd;UID=meuusuario;PWD=minhasenha')
cncursor = cn.cursor()
cncursor.execute("EXEC NOMEDAPROCEDURE 'MM/DD/YYYY', 'MM/DD/YYYY', 1")
for row in cncursor:
      print row[0]

O erro retornado é o seguinte:

Traceback (most recent call last):
  File "<console>", line 1, in <module>
ProgrammingError: No results.  Previous SQL was not a query.

Consegui acessar esses dados através do Access e do PHP, então a procedure está funcionando corretamente.

Meu interesse final é armazenar o resultado dessa procedure em um banco postgree. A minha ideia inicial seria varrer a procedure do sqlserver e inserir os dados na tabela do postgree...

Alguém pode me dar alguma luz?

Laerte M. Rodrigues

unread,
Feb 20, 2013, 1:38:22 PM2/20/13
to python...@googlegroups.com, caique...@gmail.com
Olá augusto,

Já tive este prob tbm (tanto com Python qnto com .NET)

Verifique se sua procedure possui algum select "SOLTO" ou se há algum print, isto pode ser a causa do problema


--
--
------------------------------------
Grupo Python-Brasil
http://www.python.org.br/wiki/AntesDePerguntar
 
<*> Para visitar o site do grupo na web, acesse:
http://groups.google.com/group/python-brasil
 
<*> Para sair deste grupo, envie um e-mail para:
python-brasi...@googlegroups.com
 
---
Você está recebendo esta mensagem porque se inscreveu no grupo "python-brasil" dos Grupos do Google.
Para cancelar a inscrição neste grupo e parar de receber seus e-mails, envie um e-mail para python-brasi...@googlegroups.com.
Para obter mais opções, acesse https://groups.google.com/groups/opt_out.
 
 



--
Grato,

Laerte Mateus Rodrigues
Mestre em Informática -- PUC Minas
Doutorando em Bioinformática -- UFMG

Laerte M. Rodrigues

unread,
Feb 20, 2013, 1:40:01 PM2/20/13
to python...@googlegroups.com, caique...@gmail.com
tente tbm colocar trusted_connections=Yes na sua URL de conexão com o banco

Augusto Nascimento

unread,
Feb 20, 2013, 1:52:07 PM2/20/13
to python...@googlegroups.com, caique...@gmail.com
Boa tarde Laerte.

Em relação a opção trusted_connections=Yes, esse servidor que acesso é de um terceiro e necessita de usuário e senha para ser acessado...

Quando a questão de verificar a se a procedure possui algum select solto, não consigo fazê-lo, a procedure foi desenvolvida por um terceiro... 

E como postei, ela funciona perfeitamente, tanto que já consegui acessar os dados através do MS Access...

Acho que o problema deve estar no meu script Python...

Laerte M. Rodrigues

unread,
Feb 20, 2013, 1:54:49 PM2/20/13
to python...@googlegroups.com, Caique Ferreira Lima
Já tentou executar esta procedure pelo SQL Server Management Studio?

Por ele, é possível executar a query e ver se ela ta dando print ou fazendo select

Se possivel, coloque todo o seu script ou uma parte mais abrangente dele para averiguar

Mauricio de Abreu Antunes

unread,
Feb 20, 2013, 2:00:54 PM2/20/13
to python...@googlegroups.com, Caique Ferreira Lima
Mas você sabe o que está escrito nessa procedure?
Porque tem aquele problema do SET NO COUNT (acho que é assim).
Mauricio de Abreu Antunes
Mobile: (51)930-74-525
Skype: mauricio.abreua

Laerte M. Rodrigues

unread,
Feb 20, 2013, 2:23:32 PM2/20/13
to python...@googlegroups.com
Mauricio,

O SET NOCOUNT do SQL só dá problema com conexão nativa ao banco sql, como ele está usando ODBC, acredito que nao seja este o problema

Mauricio de Abreu Antunes

unread,
Feb 20, 2013, 2:31:40 PM2/20/13
to python...@googlegroups.com
Será que não tem algum print dentro da SP que está causando o problema?

Mauricio de Abreu Antunes

unread,
Feb 20, 2013, 2:32:05 PM2/20/13
to python...@googlegroups.com
Agora que vi, você já deu essa dica. Desculpem.

Augusto Nascimento

unread,
Feb 20, 2013, 2:49:08 PM2/20/13
to python...@googlegroups.com, caique...@gmail.com
Laerte e Mauricio

Coletei as seguinte informações com o fornecedor:
A Procedure é um Select e não um Print. 
A propriedade SET NOCOUNT está definida como OFF.

E não, não sei o que está escrito nessa Procedure. Tenho apenas acesso ao seu resultado. Estou aguardando o envio do txt contendo a procedure.

O código que postei é todo o meu script no momento, visto que ainda não consegui sequer imprimir os dados dessa procedure através do Python...

Laerte M. Rodrigues

unread,
Feb 20, 2013, 3:02:36 PM2/20/13
to python...@googlegroups.com, Caique Ferreira Lima
Augusto,

poderia passar a versão do seu driver odbc? o banco q vc está tentando conectar é sql o 2008, cerot?


--
--
------------------------------------
Grupo Python-Brasil
http://www.python.org.br/wiki/AntesDePerguntar
 
<*> Para visitar o site do grupo na web, acesse:
http://groups.google.com/group/python-brasil
 
<*> Para sair deste grupo, envie um e-mail para:
python-brasi...@googlegroups.com
 
---
Você está recebendo esta mensagem porque se inscreveu no grupo "python-brasil" dos Grupos do Google.
Para cancelar a inscrição neste grupo e parar de receber seus e-mails, envie um e-mail para python-brasi...@googlegroups.com.
Para obter mais opções, acesse https://groups.google.com/groups/opt_out.
 
 

Augusto Nascimento

unread,
Feb 21, 2013, 7:07:44 AM2/21/13
to python...@googlegroups.com, caique...@gmail.com
Estou usando:

pyodbc-3.0.6.win32-py2.7

driver sql server nativo do windows xp versão  2000.85.1132.00

e o banco que estou me conectando é o Sql Server 2008.

No entanto, fiz o select em uma das tabelas do banco e consegui visualizar os dados sem problemas... Então (imagino) não deve ser problema com o driver...


Em quarta-feira, 20 de fevereiro de 2013 15h36min11s UTC-3, Augusto Nascimento escreveu:

Hugo André Carvalho Poeira

unread,
Feb 21, 2013, 12:39:29 PM2/21/13
to python...@googlegroups.com

Caro Augusto, experimente retirar o EXEC da função.

Hugo Poeira

Sent from my HTC Android phone.

Augusto Nascimento

unread,
Feb 21, 2013, 2:18:45 PM2/21/13
to python...@googlegroups.com, caique...@gmail.com
Hugo
Quase...

O código está assim:

import pyodbc
cn = pyodbc.connect('DRIVER={SQL Server};SERVER=meuservidor;DATABASE=meubd;UID=meuusuario;PWD=minhasenha')
cncursor = cn.cursor()
cncursor.execute("NOMEDAPROCEDURE 'MM/DD/YYYY', 'MM/DD/YYYY', 1")
for row in cncursor:
      print row[0]

continua retornando o erro:

Traceback (most recent call last):
  File "<console>", line 1, in <module>
ProgrammingError: No results.  Previous SQL was not a query.

No entanto, agora que retirei o "EXEC ", após executar o código ai em cima e dar o seguinte comando:

print row[0]
print row[1]
print row[n]

(sendo n o número da coluna)
está me retornando os dados esperados, mas somente da primeira linha....
minha dificuldade agora está em "correr" essa tabela.



Em quarta-feira, 20 de fevereiro de 2013 15h36min11s UTC-3, Augusto Nascimento escreveu:

Mauricio de Abreu Antunes

unread,
Feb 21, 2013, 2:21:45 PM2/21/13
to python...@googlegroups.com, caique...@gmail.com
Oi,
Acho que está faltando "dizer" que você quer dar fetch em todos.
Se não me falha a memória (e corrijam se eu estiver falando besteira) tem um método chamado fetchall() na pyodbc

--
--
------------------------------------
Grupo Python-Brasil
http://www.python.org.br/wiki/AntesDePerguntar
 
<*> Para visitar o site do grupo na web, acesse:
http://groups.google.com/group/python-brasil
 
<*> Para sair deste grupo, envie um e-mail para:
python-brasi...@googlegroups.com
 
---
Você está recebendo esta mensagem porque se inscreveu no grupo "python-brasil" dos Grupos do Google.
Para cancelar a inscrição neste grupo e parar de receber seus e-mails, envie um e-mail para python-brasi...@googlegroups.com.
Para obter mais opções, acesse https://groups.google.com/groups/opt_out.
 
 

Laerte M. Rodrigues

unread,
Feb 21, 2013, 2:29:25 PM2/21/13
to python...@googlegroups.com, Caique Ferreira Lima
antes do laco for, adicione o comando cncursor.nextSet()

Hugo André Carvalho Poeira

unread,
Feb 21, 2013, 2:50:04 PM2/21/13
to python...@googlegroups.com, Caique Ferreira Lima

Augusto voçe sabe o n' de registos que sao retornados pela procedure se a executar no sqlServer com os parametros que voçe esta a dar?

Hugo Poeira

Sent from my HTC Android phone.

On Feb 21, 2013 7:29 p.m., "Laerte M. Rodrigues" <laerte...@gmail.com> wrote:

antes do laco for, adicione o comando cncursor.nextSet()

Em 21 de fevereiro de 2013 16:21, Mauricio de Abreu Antunes <maurici...@gmail.com> escreveu:

> > Oi, > Acho que está faltando "dizer" que você quer dar fetch em todos. > Se não me falha a memó...



-- Grato, Laerte Mateus Rodrigues Mestre em Informática -- PUC Minas Doutorando em Bioinformática...

--

-- ------------------------------------ Grupo Python-Brasil http://www.python.org.br/wiki/AntesDePe...

Fernando Macedo

unread,
Feb 22, 2013, 8:18:00 AM2/22/13
to python...@googlegroups.com, caique...@gmail.com
Olá Augusto,

Consegui reproduzir este erro em minha máquina.

A propriedade NOCOUNT deve ser definida para on no ínico da SP (stored procedure), e retornada para off no final, ao contrário do que seu fornecedor está fazendo. O nome NOCOUNT já é uma negação, setar para on quer dizer "não emita logs de contagens de registros". Quando off, o sql emite uma mensagem '(X row(s) affected)' para cada instrução que afete registros realizada pela SP, o que prejudica sua utilização por muitos clientes, não só o pyodbc.

Solicite ao seu fornecedor para envolver o código da stored procedure entre os comandos set nocount on e set nocount off.

Se você quiser tentar alterar a sp para teste, basta executar um sp_helptext nomedaprocedure, que o sql server emite o comando sql de criação da sp, você pode então copiar, editar e executar no sql para sobrescrever a stored procedure.

Ficaria algo assim:

  1. IF (object_id('nomedaprocedure') IS NOT NULL)
  2.   DROP PROCEDURE nomedaprocedure
  3. GO
  4. ----------------------------------------------------------------------------------------
  5. CREATE PROCEDURE nomedaprocedure (@data_ini VARCHAR(10), @data_fim VARCHAR(10))
  6. AS BEGIN
  7.   SET nocount ON
  8.  
  9.   -- faça o que quiser aqui
  10.   SELECT * FROM tabela
  11.   SET nocount off
  12. END

Um abraço,
Fernando

Mauricio de Abreu Antunes

unread,
Feb 22, 2013, 8:19:36 AM2/22/13
to python...@googlegroups.com, caique...@gmail.com
Baita dica, hein Fernando?! hehe
No começo eu disse que podia ser o NOCOUNT. Mas sua explicação foi muito boa.
Creio que funcione também, se não, não sei mais como ajudar.

Abraço!

--
--
------------------------------------
Grupo Python-Brasil
http://www.python.org.br/wiki/AntesDePerguntar
 
<*> Para visitar o site do grupo na web, acesse:
http://groups.google.com/group/python-brasil
 
<*> Para sair deste grupo, envie um e-mail para:
python-brasi...@googlegroups.com
 
---
Você está recebendo esta mensagem porque se inscreveu no grupo "python-brasil" dos Grupos do Google.
Para cancelar a inscrição neste grupo e parar de receber seus e-mails, envie um e-mail para python-brasi...@googlegroups.com.
Para obter mais opções, acesse https://groups.google.com/groups/opt_out.
 
 

Augusto Nascimento

unread,
Feb 22, 2013, 11:43:24 AM2/22/13
to python...@googlegroups.com, caique...@gmail.com
Fernando,

Utilizei o código que você passou para pegar as instruções contidas na procedure. Deu certo.

Estou entrando em contato com o fornecedor para ver a questão da instrução NOCOUNT. Parece que agora vai!

Em breve retorno aqui para falar para vocês o resultado final!

Por enquanto, agradeço a ajuda de todos!


Em quarta-feira, 20 de fevereiro de 2013 15h36min11s UTC-3, Augusto Nascimento escreveu:

Augusto Nascimento

unread,
Feb 22, 2013, 1:45:24 PM2/22/13
to python...@googlegroups.com, caique...@gmail.com
Caros

 É isso ai! O problema estava na propriedade NOCOUNT.

 Após a propriedade ser definida como ON, consegui capturar os dados.

Mais uma vez, muito obrigado pela ajuda!!!

Mauricio de Abreu Antunes

unread,
Feb 22, 2013, 1:46:43 PM2/22/13
to python...@googlegroups.com, caique...@gmail.com
De nada.
Você acabou nos ajudando a lembrar/procurar/aprender. =)

--
--
------------------------------------
Grupo Python-Brasil
http://www.python.org.br/wiki/AntesDePerguntar
 
<*> Para visitar o site do grupo na web, acesse:
http://groups.google.com/group/python-brasil
 
<*> Para sair deste grupo, envie um e-mail para:
python-brasi...@googlegroups.com
 
---
Você está recebendo esta mensagem porque se inscreveu no grupo "python-brasil" dos Grupos do Google.
Para cancelar a inscrição neste grupo e parar de receber seus e-mails, envie um e-mail para python-brasi...@googlegroups.com.
Para obter mais opções, acesse https://groups.google.com/groups/opt_out.
 
 
Reply all
Reply to author
Forward
0 new messages