Python如何执行存储过程,获取存储过程返回值

在Pathon中如何执行存储过程呢?可以使用如下方法:


存储过程定义基本如下:


ALTER

procedure

[dbo].

[mysp]



@Station varchar

(

50),




@SN varchar

(

50),






@Info varchar

(

500)

output

,




@Msg varchar

(

500)

output





1. 使用adodbapi




Python代码 收藏代码




  1. from
    adodbapiimport
    connect


  2. server='dbserver'

  3. user='username'

  4. password='password'

  5. database='database'

  6. sp='sp'

  7. station='station'

  8. sn='sn'



  9. try
    :

  10. db=connect('Provider=SQLOLEDB.1
    ;DataSource=%s;InitialCatalog=%s;/

  11. UserID=%s;Password=%s;'%(server,database,user,password))


  12. except
    Exception,e:


  13. print
    e


  14. else
    :

  15. cur=db.cursor()

  16. msg=cur.callproc(sp,(station,sn))#参数与存储过程有关


  17. if
    len(msg)>1
    :


  18. if
    msg[-1
    ]is
    None
    :


  19. print
    'snisok.Canbetestatthisstation'


  20. else
    :


  21. print
    msg[-1
    ]


  22. finally
    :


  23. try
    :db.close()


  24. except
    :pass




2. 使用pymssql




Python代码 收藏代码




  1. from
    pymssqlimport
    connect


  2. server='dbserver'

  3. user='user'

  4. password='password'

  5. database='database'

  6. sp='sp'

  7. station='station'

  8. sn='sn'


  9. sql=['setnocounton'
    ]

  10. sql.append('declare@Msgvarchar(500)'
    )

  11. sql.append('declare@return_valuevarchar'
    )

  12. sql.append("exec@return_value=%s@Station='%s',@SN='%s',@Info='@Info',@Msg=@Msgoutput"
    )

  13. sql.append('select@Msg,@return_value'
    )

  14. sql='/n'
    .join(sql)%(sp,station,sn)



  15. def
    ffchk(server,user,password,database,sql):


  16. try
    :

  17. db=connect(host=server,

  18. database=database,

  19. user=user,

  20. password=password,

  21. login_timeout=10
    )

  22. cur=db.cursor()

  23. cur.execute(sql)


  24. except
    Exception,e:


  25. print
    e


  26. else
    :

  27. cur.nextset()#要加上这句才能通过fetch函数取到值
    注意:这语句在Python2.7对应的pymssql版本中是错误!!!



  28. print
    cur.fetchone()


  29. finally
    :


  30. try
    :db.close()


  31. except
    :pass




总结:


1. adodbapi简单,不用写一串的sql语句,但是不能取到返回的Error Code,只能取到返回的错误信息,也可能是我没找到方法


2. pymssql与第一条相反,可以取到返回值和错误信息,但要写sql语句。



这里重点说明一下使用pymssql的方法



cur.execute("exec 存储过程名 @参数1=XXX, @参数2='YYY'......")


cur.fetchone() #如果该存储过程中有返回结果集,可以调用此句,如果存储过程是return,则pymssql不支持,无法获取,此句错误


conn.commit() #如果没有此句,则数据并没有真正生效,比如存储过程是执行insert的,没有commit的话,并不会真正插入数据


一般通过此三步即可以应对很多使用存储过程的要求



对于存储过程传出数据的方法还有如下的讨论:


http://zh-cn.w3support.net/index.php?db=so&id=191644






你可能感兴趣的:(Python如何执行存储过程,获取存储过程返回值)