【发布时间】:2015-07-24 09:17:04
【问题描述】:
如果有人能指出我正确的方向,我会很感兴趣。
我有一个很长的存储过程(其中还包含对其他存储过程的调用),用于更新各种表。
如果我在管理工作室中运行存储过程,它运行良好。如果我从 pyodbc 调用它,那么:
- 它的运行时间与通常相同
- 我没有收到任何错误
- 本应更新的表均未更新
我一直运行 pyodbc 来执行存储过程并且没有任何问题 - 我知道我的连接或调用没有任何问题,就好像我将较短的存储过程替换到 python 代码中它工作正常的地方一样。
存储过程确实会生成一些“警告:空值被聚合或其他 SET 操作消除”消息,我认为这些可能会导致问题,但每当我尝试 SET ANSI_WARNINGS { ON | OFF } 在存储过程内部或存储过程外部我得到一个 pyodbc.ProgrammingError
对这个问题有什么猜测吗?
Python 3.4 (have the same problem in 2.7), MSSQL, Windows 7
更新:
import pyodbc as p
def getconn():
server='insertsqlservername'
dbase='insertdbasename'
connStr=('Driver={SQL Server};SERVER=' +
server + ';DATABASE=' + dbase + ';' +
'trusted=1')
conn = p.connect(connStr)
return conn
def runSQL():
conn=getconn()
cursor=conn.cursor()
try:
cursor.execute('exec InsertStoredProcName')
conn.commit()
except:
print('sys.exc_info()[0])
cursor.close()
conn.close()
要 100% 解决问题,似乎有两个组成部分:
- Python 代码:如果我使用相同的 Python 代码,但将存储的 proc 更改为不同的,则 Python 代码可以工作
- SQL 代码:“问题”存储过程在 T-SQL 中有效,但在 pyodbc 中运行时无效
这似乎是两者的结合。
【问题讨论】:
-
你能提供你的代码没有你的代码我们不能说什么
-
如果你需要猜测,我相信你没有在 pyodbc 中提交更新
-
感谢 Vignesh,确实提交了交易 - 添加了上面的 python 代码。对于 SQL,它的长度超过 1,000 行。我可以在 SQL 中看到的关键元素是存储过程的问题:a) 包含它调用的其他存储过程 b) 创建临时表 c) 更新其他表 d) 生成许多“警告:空值被消除聚合或其他 SET 操作”消息,我无法弄清楚如何同时关闭和使用 pyodbc
-
打印语句中不应该有多余的
' -
尝试
a=cursor.fetchall() for c in a: print c获取存储过程的输出
标签: python sql-server pyodbc